Αυτός ο οδηγός θα σας καθοδηγήσει στη ρύθμιση ενός Kubernetes cluster από το μηδέν χρησιμοποιώντας Ansible και Kubeadm και στη συνέχεια στην ανάπτυξη μιας containerized Nginx εφαρμογής με αυτό.
Εισαγωγή
Kubernetes (επίσης γνωστό ως k8s ή “kube”) είναι μια πλατφόρμα ενορχήστρωσης κοντέινερ ανοιχτού κώδικα που αυτοματοποιεί πολλές από τις χειροκίνητες διαδικασίες που εμπλέκονται στην ανάπτυξη, διαχείριση και κλιμάκωση containerized εφαρμογών. Το Kubernetes έχει μια ταχέως αναπτυσσόμενη κοινότητα ανοιχτού κώδικα, η οποία συνεισφέρει ενεργά στο έργο. Ρίξτε μια ματιά στην ανάρτηση του ιστολογίου μας που θα σας εισαγάγει σε όλα όσα πρέπει να γνωρίζετε για τα βασικά της πλατφόρμας Kubernetes.
Kubeadm είναι ένα εργαλείο, το οποίο διαμορφώνει διάφορα ενσωματωμένα στοιχεία, μέρη και κομμάτια όπως ο API server, ο Controller Manager και το Kube DNS. Βοηθά επίσης στην αυτοματοποίηση της εγκατάστασης. Ωστόσο, δεν δημιουργεί χρήστες ούτε χειρίζεται την εγκατάσταση εξαρτήσεων σε επίπεδο λειτουργικού συστήματος και τη διαμόρφωσή τους και δεν μπορεί να προετοιμάσει την υποδομή σας.
Το Ansible είναι ένα εργαλείο ανοιχτού κώδικα για την προετοιμασία λογισμικού και την ανάπτυξη εφαρμογών. Saltstack είναι λογισμικό ανοιχτού κώδικα για τον αυτοματισμό της τεχνολογίας πληροφοριών που καθοδηγείται από συμβάντα. Αυτά είναι τα δύο εργαλεία που καθιστούν τη δημιουργία πρόσθετων clusters ή την αναδημιουργία υπαρχόντων clusters λιγότερο ευάλωτη σε σφάλματα και μπορούν να χρησιμοποιηθούν για αυτές τις προκαταρκτικές εργασίες.
Στόχοι:
Το cluster σας θα περιλαμβάνει τους ακόλουθους φυσικούς πόρους:
1. Ένας master node:
Ένας master node είναι ένας κόμβος που ελέγχει και διαχειρίζεται ένα σύνολο από worker nodes (workloads runtime) και μοιάζει με ένα cluster στο Kubernetes. Διατηρεί επίσης το σχέδιο πόρων του κόμβου για να καθορίσει την κατάλληλη ενέργεια για το συμβάν που ενεργοποιήθηκε. Εκτελεί το etcd, ένα κατανεμημένο σύστημα αποθήκευσης τιμών-κλειδιών ανοιχτού κώδικα που χρησιμοποιείται για τη διατήρηση και διαχείριση δεδομένων του cluster μεταξύ των στοιχείων που προγραμματίζουν φόρτους εργασίας σε worker nodes.
Για παράδειγμα, ο scheduler θα προσδιορίσει ποιος worker node θα φιλοξενήσει ένα πρόσφατα προγραμματισμένο POD.
2. Δύο worker nodes:
Οι worker nodes είναι οι κόμβοι που συνεχίζουν την ανατεθείσα εργασία τους ακόμα και αν ο master node τεθεί εκτός λειτουργίας μόλις ολοκληρωθεί ο προγραμματισμός. Οι worker nodes είναι οι διακομιστές όπου θα εκτελούνται οι φόρτοι εργασίας σας (δηλ. containerized εφαρμογές και υπηρεσίες). Μπορείτε επίσης να αυξήσετε τη χωρητικότητα του cluster προσθέτοντας workers.
Μόλις ολοκληρώσετε αυτόν τον οδηγό, θα έχετε ένα πλήρως λειτουργικό cluster έτοιμο να εκτελέσει φόρτους εργασίας (δηλ. containerized εφαρμογές και υπηρεσίες), με την προϋπόθεση ότι οι διακομιστές στο cluster διαθέτουν επαρκείς πόρους CPU και RAM για την εκτέλεση των εφαρμογών σας. Αφού εγκαταστήσετε με επιτυχία το cluster, μπορείτε να εκτελέσετε σχεδόν οποιαδήποτε παραδοσιακή εφαρμογή UNIX. Θα μπορούσε να είναι containerized στο cluster σας, συμπεριλαμβανομένων διαδικτυακών εφαρμογών, βάσεων δεδομένων, daemons και εργαλείων γραμμής εντολών.
Το ίδιο το cluster θα καταναλώνει περίπου 300-500MB μνήμης και 10% CPU σε κάθε node.
Προαπαιτούμενα:
- Πρέπει να έχετε ένα ζεύγος κλειδιών SSH στο τοπικό σας μηχάνημα Linux και να γνωρίζετε πώς να χρησιμοποιείτε κλειδιά SSH. Ωστόσο, εάν δεν έχετε χρησιμοποιήσει κλειδιά SSH στο παρελθόν, μπορείτε να δείτε αυτόν τον οδηγό για να σας βοηθήσει να ρυθμίσετε τα κλειδιά SSH στο τοπικό σας μηχάνημα.
- Τρεις διακομιστές που εκτελούν Ubuntu 18.04 με τουλάχιστον 4GB RAM και 4 vCPUs ο καθένας. Θα πρέπει να μπορείτε να συνδεθείτε μέσω SSH σε κάθε διακομιστή ως χρήστης root με το ζεύγος κλειδιών SSH σας. Ακολουθήστε αυτόν τον οδηγό για να εγκαταστήσετε τον Ubuntu διακομιστή σας.
- Το Ansible εγκατεστημένο στο τοπικό σας μηχάνημα.
- Πρέπει επίσης να είστε εξοικειωμένοι με τα Ansible playbooks.
- Θα πρέπει επίσης να γνωρίζετε πώς να εκκινείτε ένα container από μια εικόνα Docker. Δείτε το “Βήμα 5 — Εργασία με Εικόνες Docker στο Ubuntu” στο Πώς να εγκαταστήσετε και να χρησιμοποιήσετε το Docker στο Ubuntu 18.04 εάν χρειάζεστε μια υπενθύμιση.
Βήμα 1 — Ρύθμιση του καταλόγου χώρου εργασίας και του αρχείου απογραφής Ansible
Πρώτα πρέπει να ρυθμίσετε το Ansible στο τοπικό σας μηχάνημα. Θα σας βοηθήσει να εκτελείτε εντολές στον απομακρυσμένο διακομιστή σας. Διευκολύνει επίσης την προσπάθεια χειροκίνητης ανάπτυξης αυτοματοποιώντας την. Για αυτό, θα πρέπει να δημιουργήσετε έναν κατάλογο στο τοπικό σας μηχάνημα που θα χρησιμεύσει ως προσωρινός ψηφιακός χώρος αποθήκευσης (Workspace).
Μόλις δημιουργήσετε έναν κατάλογο, θα δημιουργήσετε ένα hosts αρχείο για την αποθήκευση όλων των πληροφοριών σχετικά με τις διευθύνσεις IP και την ομάδα κάθε διακομιστή. Θα σας βοηθήσει να αποθηκεύσετε τις πληροφορίες αποθέματος (inventory) μέσα σε αυτό. Όπως αναφέρθηκε προηγουμένως, θα υπάρχουν τρεις διακομιστές, ένας master και δύο workers. Ο master διακομιστής θα είναι ο master με μια IP που εμφανίζεται ως master_ip. Οι άλλοι δύο διακομιστές θα είναι workers και θα έχουν τις IP worker_1_ip και worker_2_ip.
Πρέπει να δημιουργήσετε έναν κατάλογο με όνομα ~/kube-cluster στον αρχικό κατάλογο του τοπικού σας μηχανήματος και να εισέλθετε στον κατάλογο χρησιμοποιώντας την εντολή cd:
|
1 2 |
mkdir ~/kube-cluster cd ~/kube-cluster |
Ο κατάλογος ~/kube-cluster θα λειτουργεί τώρα ως ο προσωρινός ψηφιακός χώρος αποθήκευσης (χώρος εργασίας) μέσα στον οποίο θα εκτελείτε όλες τις τοπικές εντολές για τη δημιουργία ενός Kubernetes cluster χρησιμοποιώντας το kubeadm. Ο κατάλογος θα περιέχει όλα τα Ansible playbooks σας και θα χρησιμοποιηθεί για το υπόλοιπο του οδηγού.
Δημιουργία του Αρχείου Hosts
Δημιουργήστε ένα αρχείο με όνομα ~/kube-cluster/hosts χρησιμοποιώντας το nano ή τον αγαπημένο σας επεξεργαστή κειμένου:
|
1 |
nano ~/kube-cluster/hosts |
Τώρα θα πρέπει να προσθέσετε το ακόλουθο κείμενο, το οποίο θα καθορίζει πληροφορίες σχετικά με τη λογική δομή του cluster σας:
|
1 2 3 4 5 6 7 8 9 |
[masters] master ansible_host=master_ip ansible_user=root [workers] worker1 ansible_host=worker_1_ip ansible_user=root worker2 ansible_host=worker_2_ip ansible_user=root [all:vars] ansible_python_interpreter=/usr/bin/python3 |
Όπως αναφέρθηκε, αυτό το αρχείο αποθέματος (inventory) θα σας βοηθήσει να αποθηκεύσετε όλες τις πληροφορίες σχετικά με τις διευθύνσεις IP των διακομιστών σας και τις ομάδες στις οποίες ανήκει ο κάθε διακομιστής. ~/kube-cluster/hosts θα είναι το αρχείο αποθέματός σας και οι (masters και workers) θα είναι οι δύο ομάδες Ansible που έχετε προσθέσει σε αυτό, καθορίζοντας τη λογική δομή του cluster σας.
Η ομάδα Master είναι η ομάδα που καθορίζει ότι το Ansible θα πρέπει να εκτελεί απομακρυσμένες εντολές ως χρήστης root. Παραθέτει επίσης την IP του master node (master_ip) που μπορεί να καταχωρηθεί από την καταχώριση διακομιστή με όνομα “master”. Παρομοίως, η ομάδα Workers έχει δύο καταχωρίσεις για τους διακομιστές worker (worker_1_ip και worker_2_ip) που καθορίζουν επίσης το ansible_user ως root.
Η τελευταία γραμμή του αρχείου λέει στο Ansible να χρησιμοποιήσει τους διερμηνείς Python 3 των απομακρυσμένων διακομιστών για τις λειτουργίες διαχείρισής του. Τέλος, πρέπει να αποθηκεύσετε και να κλείσετε το αρχείο αφού προσθέσετε το κείμενο. Μετά τη ρύθμιση του καταλόγου του χώρου εργασίας και του αρχείου αποθέματος Ansible, ας προχωρήσουμε στο επόμενο βήμα της εγκατάστασης εξαρτήσεων σε επίπεδο λειτουργικού συστήματος και της δημιουργίας ρυθμίσεων παραμέτρων.
Βήμα 2 — Δημιουργία Χρήστη μη-Root σε Όλους τους Απομακρυσμένους Διακομιστές
Σε αυτό το βήμα, θα μάθετε πώς να δημιουργείτε έναν χρήστη μη-root με δικαιώματα sudo σε όλους τους διακομιστές, ώστε να μπορείτε να συνδεθείτε σε αυτούς μέσω SSH χειροκίνητα ως μη προνομιούχος χρήστης.
Αυτό μπορεί να είναι χρήσιμο για συχνά εκτελούμενες λειτουργίες για τη διατήρηση ενός cluster. Επιπλέον, αυτό το βήμα θα σας βοηθήσει να εκτελέσετε την εργασία με μεγαλύτερη ακρίβεια και λιγότερα σφάλματα, μειώνοντας τις πιθανότητες ακούσιας τροποποίησης ή διαγραφής σημαντικών αρχείων. Εάν θέλετε να αλλάξετε τη ρύθμιση αρχείων που ανήκουν στον root ή να δείτε πληροφορίες συστήματος με εντολές όπως top/htop και να δείτε μια λίστα με τα εκτελούμενα containers, το ακόλουθο βήμα θα σας βοηθήσει να εκτελέσετε όλες αυτές τις εργασίες.
Δημιουργία του Playbook
Δημιουργήστε ένα αρχείο με όνομα ~/kube-cluster/initial.yml στον χώρο εργασίας:
|
1 |
nano ~/kube-cluster/initial.yml |
Στη συνέχεια, πρέπει να προσθέσετε το ακόλουθο play. Ένα play στο Ansible είναι μια συλλογή βημάτων που πρέπει να εκτελεστούν και στοχεύουν συγκεκριμένους διακομιστές και ομάδες. Μπορεί να υπάρχουν ένα ή πολλά plays σε ένα playbook.
Το ακόλουθο play θα δημιουργήσει έναν χρήστη sudo μη-root:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
- hosts: all become: yes tasks: - name: δημιουργία του 'ubuntu' χρήστη user: name=ubuntu append=yes state=present createhome=yes shell=/bin/bash - name: να επιτρέπεται 'ubuntu' να έχει χωρίς κωδικό πρόσβασης sudo lineinfile: dest: /etc/sudoers line: 'ubuntu ALL=(ALL) NOPASSWD: ALL' validate: 'visudo -cf %s' - name: ρύθμιση up εξουσιοδοτημένων κλειδιών για τον ubuntu χρήστη authorized_key: user=ubuntu key="{{item}}" with_file: - ~/.ssh/id_rsa.pub |
Ακολουθεί μια ανάλυση του τι κάνει το playbook μας:
- Αυτό το playbook θα δημιουργήσει τον μη-root χρήστη
ubuntu. - Καθώς πρέπει να εκτελέσετε εντολές
sudoχωρίς προτροπή για κωδικό πρόσβασης, αυτό το play θα διαμορφώσει το αρχείοsudoersώστε να επιτρέπει στον χρήστηubuntuνα το κάνει αυτό. - Ο κύριος σκοπός της παραπάνω εργασίας ήταν να σας επιτρέψει να συνδεθείτε μέσω SSH σε κάθε διακομιστή ως χρήστης
ubuntu. Αυτό το playbook προσθέτει το δημόσιο κλειδί του τοπικού σας μηχανήματος (συνήθως~/.ssh/id_rsa.pub) για τον απομακρυσμένο χρήστηubuntuστη λίστα εξουσιοδοτημένων κλειδιών του.
Τώρα, αφού προσθέσετε το κείμενο, πρέπει να αποθηκεύσετε και να κλείσετε το αρχείο.
Εκτέλεση του playbook
Μετά από αυτό, πρέπει να εκτελέσουμε το playbook μας που θα δημιουργήσει τον μη-root χρήστη ubuntu εκτελώντας απλά στα τοπικά μηχανήματα:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/initial.yml |
Η εκτέλεση αυτής της εντολής θα πάρει κάποιο χρόνο, μετά τον οποίο θα δείτε το ακόλουθο αποτέλεσμα:

Αφού ολοκληρωθεί αυτό το βήμα, μπορείτε να προχωρήσετε στην εγκατάσταση των εξαρτήσεων που αφορούν το Kubernetes στο επόμενο βήμα.
Βήμα 3 — Εγκατάσταση των εξαρτήσεων του Kubernetes
Σε αυτό το βήμα, θα μάθετε πώς να εγκαταστήσετε τα πακέτα σε επίπεδο λειτουργικού συστήματος που απαιτούνται από το Kubernetes με τον διαχειριστή πακέτων του Ubuntu.
Αυτά τα πακέτα είναι:
- Docker: Το Docker είναι μια πλατφόρμα και εργαλείο για τη δημιουργία, διανομή και εκτέλεση κοντέινερ Docker. Μπορείτε εύκολα να ρυθμίσετε το Docker ακολουθώντας τον οδηγό μας για πώς να εγκαταστήσετε & να λειτουργήσετε το Docker σε Ubuntu στο δημόσιο νέφος. Ωστόσο, η υποστήριξη για άλλα runtimes όπως το rkt βρίσκεται υπό ενεργή ανάπτυξη στο Kubernetes.
Kubeadm: kubeadm είναι ένα εργαλείο CLI που εκτελεί τις απαραίτητες ενέργειες για τη δημιουργία και λειτουργία ενός ελάχιστου βιώσιμου cluster. Αυτό θα σας βοηθήσει να εγκαταστήσετε και να δημιουργήσετε διάφορα στοιχεία του cluster με τυποποιημένο τρόπο.kubelet: Το kubelet είναι ο κύριος “node agent” που εκτελείται σε κάθε κόμβο και χειρίζεται λειτουργίες σε επίπεδο κόμβου.kubectl: kubectl είναι επίσης ένα εργαλείο CLI που επικοινωνεί με το cluster σας και εκδίδει εντολές μέσω του API Server του.
Δημιουργία του playbook
Δημιουργήστε ένα αρχείο με όνομα ~/kube-cluster/kube-dependencies.yml στον χώρο εργασίας:
|
1 |
nano ~/kube-cluster/kube-dependencies.yml |
Τώρα πρέπει να προσθέσετε τα ακόλουθα plays στο αρχείο για να εγκαταστήσετε αυτά τα πακέτα στους διακομιστές σας:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
- hosts: all become: yes tasks: - name: εγκατάσταση Docker apt: name: docker.io state: present update_cache: true - name: εγκατάσταση APT Transport HTTPS apt: name: apt-transport-https state: present - name: προσθήκη Kubernetes apt-key apt_key: url: https://packages.cloud.google.com/apt/doc/apt-key.gpg validate_certs: false state: present - name: προσθήκη Kubernetes αποθετηρίου APT apt_repository: repo: deb http://apt.kubernetes.io/ kubernetes-xenial main state: present filename: 'kubernetes' - name: εγκατάσταση kubelet apt: name: kubelet=1.16.0-00 state: present update_cache: true - name: εγκατάσταση kubeadm apt: name: kubeadm=1.16.0-00 state: present - hosts: master become: yes tasks: - name: εγκατάσταση kubectl apt: name: kubectl=1.16.0-00 state: present force: yes |
Το πρώτο play στο playbook κάνει τα εξής:
- Αυτό το play θα σας βοηθήσει να εγκαταστήσετε πακέτα σε επίπεδο λειτουργικού συστήματος, το Docker – το runtime κοντέινερ.
- Εγκαθιστά το
apt-transport-https, το οποίο σας επιτρέπει να προσθέσετε εξωτερικές πηγές HTTPS στη λίστα πηγών APT σας. - Προσθέτει το apt-key του αποθετηρίου APT του Kubernetes για επαλήθευση κλειδιού.
- Προσθέτει το αποθετήριο APT του Kubernetes στη λίστα πηγών APT των απομακρυσμένων διακομιστών σας.
- Εγκαθιστά τα
kubeletκαιkubeadm.
Το δεύτερο play εκτελεί μια σημαντική και μεμονωμένη εργασία που περιλαμβάνει την εγκατάσταση του kubectl στον master κόμβο σας. Τώρα, αφού προσθέσετε το κείμενο, πρέπει να αποθηκεύσετε και να κλείσετε το αρχείο.
Εκτέλεση του playbook
Μετά από αυτό, πρέπει να εκτελέσουμε το playbook μας τρέχοντας απλώς στα τοπικά μηχανήματα:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/kube-dependencies.yml |
Η εκτέλεση αυτής της εντολής θα πάρει κάποιο χρόνο, μετά τον οποίο θα δείτε το ακόλουθο αποτέλεσμα:

Μετά την εκτέλεση, τα Docker, kubeadm και kubelet θα εγκατασταθούν σε όλους τους απομακρυσμένους διακομιστές. Το Kubectl δεν είναι απαραίτητο στοιχείο και χρειάζεται μόνο για την εκτέλεση εντολών cluster. Η εγκατάστασή του μόνο στον master κόμβο είναι λογική σε αυτό το πλαίσιο, καθώς θα εκτελείτε εντολές kubectl μόνο από τον master. Σημειώστε, ωστόσο, ότι το kubectl οι εντολές μπορούν να εκτελεστούν από οποιονδήποτε από τους κόμβους εργασίας ή από οποιοδήποτε μηχάνημα στο οποίο μπορεί να εγκατασταθεί και να ρυθμιστεί ώστε να δείχνει σε ένα cluster.
Όλες οι εξαρτήσεις συστήματος έχουν πλέον εγκατασταθεί. Ας ρυθμίσουμε τον κύριο κόμβο (master node) και ας αρχικοποιήσουμε το cluster.
Βήμα 4 — Ρύθμιση του Master Node
Σε αυτό το βήμα, θα μάθετε μερικές έννοιες όπως Pods και Pod Network Plugins καθώς το cluster σας θα περιλαμβάνει και τα δύο μόλις ρυθμίσετε τον master node σας.
Τα Pods είναι τα μικρότερα, πιο βασικά αναπτύξιμα αντικείμενα στο Kubernetes. Τα Pods περιέχουν ένα ή περισσότερα containers, όπως Docker containers. Όταν ένα Pod εκτελεί πολλαπλά containers, η διαχείριση των containers γίνεται ως ενιαία οντότητα και μοιράζονται τους πόρους του Pod’s.
Κάθε pod έχει τη δική του διεύθυνση IP, και ένα pod σε έναν κόμβο θα πρέπει να μπορεί να έχει πρόσβαση σε ένα pod σε έναν άλλο κόμβο χρησιμοποιώντας την IP του pod’s. Ωστόσο, η επικοινωνία μεταξύ των pods είναι πιο περίπλοκη. Χρειάζεται ένα ξεχωριστό στοιχείο που μπορεί να δρομολογεί με διαφανή τρόπο την κίνηση από ένα pod σε έναν κόμβο προς ένα pod σε έναν άλλο. Τα πρόσθετα δικτύου pod (pod network plugins) χρησιμοποιούνται για αυτή τη λειτουργικότητα. Πολλά πρόσθετα δικτύου pod είναι διαθέσιμα, αλλά εμείς θα χρησιμοποιήσουμε το Flannel καθώς είναι μια σταθερή και αποτελεσματική επιλογή.
Δημιουργία του Playbook
Δημιουργήστε ένα Ansible playbook με όνομα master.yml στον τοπικό σας υπολογιστή:
|
1 |
nano ~/kube-cluster/master.yml |
Επιπλέον, πρέπει να προσθέσετε το ακόλουθο play στο αρχείο για να αρχικοποιήσετε το cluster και να εγκαταστήσετε το Flannel:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
- hosts: master become: yes tasks: - name: αρχικοποίηση του cluster shell: kubeadm init --pod-network-cidr=10.244.0.0/16 >> cluster_initialized.txt args: chdir: $HOME creates: cluster_initialized.txt become: yes become_user: root - name: δημιουργία .kube καταλόγου become: yes become_user: ubuntu file: path: $HOME/.kube state: directory mode: 0755 - name: αντιγραφή admin.conf στο user's kube config copy: src: /etc/kubernetes/admin.conf dest: /home/ubuntu/.kube/config remote_src: yes owner: ubuntu - name: εγκατάσταση Pod δικτύου become: yes become_user: ubuntu shell: kubectl apply -f https://raw.githubusercontent.com/coreos/flannel/2140ac876ef134e0ed5af15c65e414cf26827915/Documentation/kube-flannel.yml >> pod_network_setup.txt args: chdir: $HOME creates: pod_network_setup.txt |
Ακολουθεί η ανάλυση αυτού του play:
- Η πρώτη εργασία σε αυτό το play θα ρυθμίσει το cluster εκτελώντας το
kubeadm init. Για να καθορίσουμε το ιδιωτικό υποδίκτυο στο οποίο θα εκχωρηθούν οι διευθύνσεις IP των pod, περνάμε το όρισμα--pod-network-cidr=10.244.0.0/16. Το Flannel χρησιμοποιεί το παραπάνω υποδίκτυο από προεπιλογή. Το χρησιμοποιούμε αυτό για να πούμε στοkubeadmνα χρησιμοποιήσει το ίδιο υποδίκτυο. - Η δεύτερη εργασία χρησιμοποιείται για τη δημιουργία ενός καταλόγου
.kubeστη διαδρομή/home/ubuntu. Πληροφορίες ρυθμίσεων, όπως τα αρχεία κλειδιών διαχειριστή, τα οποία απαιτούνται για τη σύνδεση στο cluster και τη διεύθυνση API του cluster, θα διατηρούνται σε αυτόν τον κατάλογο. - Η τρίτη εργασία χρησιμοποιείται για την αντιγραφή του αρχείου
/etc/kubernetes/admin.confπου δημιουργήθηκε από τοkubeadm initστον αρχικό κατάλογο του μη-root χρήστη σας. Αυτό θα σας επιτρέψει να χρησιμοποιήσετε τοkubectlγια να αποκτήσετε πρόσβαση στο νεοσύστατο cluster. - Η τελευταία εργασία εκτελεί το
kubectl applyγια να εγκαταστήσει τοFlannel.kubectl apply -f descriptor.[yml|json]είναι η σύνταξη για να πούμε στοkubectlνα δημιουργήσει τα αντικείμενα που περιγράφονται στο αρχείοdescriptor.[yml|json]. Το αρχείοkube-flannel.ymlπεριέχει τις περιγραφές των αντικειμένων που απαιτούνται για τη ρύθμιση τουFlannelστο cluster.
Τώρα, αφού προσθέσετε το κείμενο, πρέπει να αποθηκεύσετε και να κλείσετε το αρχείο.
Εκτέλεση του Playbook
Μετά από αυτό, πρέπει να εκτελέσετε το playbook μας τρέχοντας απλώς στα τοπικά μηχανήματα:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/master.yml |
Η εκτέλεση αυτής της εντολής θα πάρει κάποιο χρόνο, μετά τον οποίο θα δείτε το ακόλουθο αποτέλεσμα:

Τώρα συνδεθείτε μέσω SSH σε αυτό με την ακόλουθη εντολή για να ελέγξετε την κατάσταση του master node:
|
1 |
ssh ubuntu@master_ip |
Μόλις βρεθείτε μέσα στο master node, εκτελέστε:
|
1 |
kubectl get nodes |
Τώρα θα δείτε το ακόλουθο αποτέλεσμα:

Μόλις λάβετε το παραπάνω αποτέλεσμα, μπορείτε να θεωρήσετε ότι όλες οι εργασίες ρύθμισης έχουν ολοκληρωθεί από το master node και μπορεί να αρχίσει να δέχεται worker nodes και να εκτελεί εργασίες καθώς εισέρχεται σε κατάσταση Ready. Μπορείτε τώρα να προσθέσετε τους workers από το τοπικό σας μηχάνημα.
Βήμα 5 — Ρύθμιση των Worker Nodes
Μετά τη ρύθμιση του master node, μπορούμε τώρα να προχωρήσουμε στο επόμενο βήμα μας για τη ρύθμιση των worker nodes. Η προσθήκη worker nodes στο cluster μπορεί να γίνει απλά εκτελώντας μια ενιαία εντολή σε κάθε διακομιστή worker. Οι σημαντικές πληροφορίες, όπως η διεύθυνση IP, η θύρα του API server του master και ένα ασφαλές διακριτικό (token), περιλαμβάνονται σε αυτήν την εντολή. Ωστόσο, θα πρέπει να σημειώσετε ότι δεν θα μπορούν όλα τα nodes να εισέλθουν στο cluster, αλλά μόνο εκείνα τα nodes που θα περάσουν το ασφαλές token.
Δημιουργία του playbook
Αυτή η εντολή θα σας βοηθήσει να πλοηγηθείτε πίσω στον χώρο εργασίας σας και να δημιουργήσετε ένα playbook με όνομα workers.yml:
|
1 |
nano ~/kube-cluster/workers.yml |
Προσθέστε το ακόλουθο κείμενο στο αρχείο για να προσθέσετε τους workers στο cluster:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
- hosts: master become: yes gather_facts: false tasks: - name: get join command shell: kubeadm token create --print-join-command register: join_command_raw - name: set join command set_fact: join_command: "{{ join_command_raw.stdout_lines[0] }}" - hosts: workers become: yes tasks: - name: join cluster shell: "{{ hostvars['master'].join_command }} >> node_joined.txt" args: chdir: $HOME creates: node_joined.txt |
Δείτε τι κάνει το playbook. Υπάρχουν δύο plays στον παραπάνω κώδικα:
- Το πρώτο play χρησιμοποιείται για τη λήψη της εντολής σύνδεσης που πρέπει να εκτελεστεί στα worker nodes. Η μορφή της εντολής θα είναι:
kubeadm join --token sha256:<hash><token><master-ip>:<master-port> --discovery-token-ca-cert-hash sha256:<hash>;. Η εργασία πρέπει να λάβει τις σωστές τιμές token και hash. Μόλις λάβει τη σωστή είσοδο, η εργασία την ορίζει ως fact, έτσι ώστε το δεύτερο play να μπορεί να έχει πρόσβαση σε αυτές τις πληροφορίες. - Το δεύτερο play έχει γραφτεί μόνο για την εκτέλεση μιας μεμονωμένης εργασίας – να κάνει τα δύο worker nodes μέρος του cluster, εκτελώντας απλώς την εντολή σύνδεσης σε όλα τα worker nodes.
Αφού προσθέσετε το κείμενο, πρέπει να αποθηκεύσετε και να κλείσετε το αρχείο.
Εκτέλεση του playbook
Μετά από αυτό, πρέπει να εκτελέσουμε το playbook μας τρέχοντας την ακόλουθη εντολή στα μηχανήματα worker:
|
1 |
ansible-playbook -i hosts ~/kube-cluster/workers.yml |
Η εκτέλεση αυτής της εντολής θα πάρει κάποιο χρόνο, μετά τον οποίο θα δείτε το ακόλουθο αποτέλεσμα:

Τώρα, το Kubernetes cluster σας είναι πλήρως ρυθμισμένο και λειτουργικό, με τα workers έτοιμα να εκτελέσουν φόρτους εργασίας. Πριν προχωρήσετε στο επόμενο βήμα, ας επαληθεύσουμε ότι το cluster λειτουργεί όπως έχει προγραμματιστεί.
Βήμα 6 — Επαλήθευση του Cluster
Ενδέχεται να υπάρξουν περιπτώσεις όπου ένα cluster αποτυγχάνει κατά τη διάρκεια της εγκατάστασης. Αυτό θα μπορούσε να οφείλεται σε σφάλμα δικτύου μεταξύ του master και του worker, ή σε πρόβλημα κάποιου node. Επομένως, πρέπει να επαληθεύσουμε το cluster πριν προγραμματίσουμε εφαρμογές και να διασφαλίσουμε ότι δεν παρουσιάζεται δυσλειτουργία. Για αυτό, θα πρέπει να ελέγξετε την τρέχουσα κατάσταση του cluster από το master node για να βεβαιωθείτε ότι τα nodes είναι έτοιμα. Μπορείτε να ανακτήσετε τη σύνδεση με την ακόλουθη εντολή εάν τα nodes δεν είναι έτοιμα ή εάν αποσυνδεθείτε:
|
1 |
ssh ubuntu@master_ip |
Χρησιμοποιήστε τις ακόλουθες εντολές για να λάβετε την κατάσταση του cluster:
|
1 |
kubectl get nodes |
Η εκτέλεση αυτής της εντολής θα πάρει κάποιο χρόνο, μετά τον οποίο θα δείτε το ακόλουθο αποτέλεσμα:

Πρέπει να ελέγξετε αν όλα τα nodes που αποτελούν μέρος του cluster βρίσκονται σε κατάσταση ετοιμότητας. Εάν μερικά nodes έχουν Not Ready ως STATUS, αυτό δείχνει ότι τα worker nodes δεν έχουν ολοκληρώσει ακόμη τη ρύθμισή τους. Ωστόσο, πριν εκτελέσετε ξανά το kubectl get nodes και ελέγξετε το ενημερωμένο αποτέλεσμα, θα πρέπει να περιμένετε άλλα πέντε έως δέκα λεπτά. Εάν ορισμένα από τα nodes εξακολουθούν να εμφανίζουν Not Ready ως κατάστασή τους, θα πρέπει να ελέγξετε και να επαληθεύσετε τα προηγούμενα βήματα και να εκτελέσετε ξανά τις εντολές. Μόνο εάν τα nodes έχουν την τιμή Ready για το STATUS, αποτελούν μέρος του cluster και είναι έτοιμα να εκτελέσουν φόρτους εργασίας. Μετά την επιτυχή εκτέλεση του 6ου βήματος, το cluster σας έχει πλέον επαληθευτεί. Τώρα ας προγραμματίσουμε μια υποδειγματική εφαρμογή Nginx στο cluster.
Βήμα 7 — Εκτέλεση μιας Εφαρμογής στο Cluster
Δημιουργία Deployment
Μετά την επιτυχή δημιουργία του cluster, μπορείτε να αναπτύξετε οποιαδήποτε containerized εφαρμογή στο cluster σας. Μπορείτε να χρησιμοποιήσετε τις παρακάτω εντολές για άλλες containerized εφαρμογές εάν βρίσκεστε εντός του master node. Στη συνέχεια, εκτελέστε την ακόλουθη εντολή για να δημιουργήσετε ένα deployment με το όνομα nginx :
|
1 |
kubectl create deployment nginx --image=nginx |
Πρέπει να αλλάξετε το όνομα της εικόνας Docker και τυχόν σχετικές παραμέτρους (όπως θύρες και volumes). Για να διατηρήσετε τα πράγματα οικεία, μπορείτε να αναπτύξετε το Nginx χρησιμοποιώντας deployments και services για να δείτε πώς μπορούν να αναπτυχθούν εφαρμογές στο cluster.
Ένα Kubernetes deployment είναι ένα αντικείμενο πόρου στο Kubernetes που παρέχει δηλωτικές ενημερώσεις σε εφαρμογές. Ένα deployment σάς επιτρέπει να περιγράψετε τον κύκλο ζωής μιας εφαρμογής, όπως την εικόνα κοντέινερ, τα αντίγραφα και τη στρατηγική ενημέρωσης. Ένα deployment διασφαλίζει ότι ο επιθυμητός αριθμός pods εκτελείται και είναι διαθέσιμος ανά πάσα στιγμή. Εάν ένα pod καταρρεύσει κατά τη διάρκεια ζωής του cluster, το δημιουργεί ξανά. Η διαδικασία ενημέρωσης καταγράφεται επίσης πλήρως και διαθέτει εκδόσεις με επιλογές παύσης, συνέχειας και επαναφοράς σε προηγούμενες εκδόσεις. Η παραπάνω εντολή για τη δημιουργία ενός deployment με το όνομα Nginx θα σας βοηθήσει να αναπτύξετε ένα pod με ένα κοντέινερ από το Nginx Docker Image του Docker registry.
Ρύθμιση Node Port
Στη συνέχεια, πρέπει να δημιουργήσουμε ένα NodePort. NodePort είναι μια ανοιχτή θύρα σε κάθε κόμβο του cluster σας. Το Kubernetes δρομολογεί με διαφανή τρόπο την εισερχόμενη κίνηση στο NodePort στην υπηρεσία σας, ακόμη και αν η εφαρμογή σας εκτελείται σε άλλον κόμβο. Για αυτό μπορούμε να χρησιμοποιήσουμε αυτήν την εντολή για να δημιουργήσουμε έναν πόρο NodePort με το όνομα Nginx που θα εκθέσει την εφαρμογή δημόσια:
|
1 |
kubectl expose deploy nginx --port 80 --target-port 80 --type NodePort |
Mια υπηρεσία είναι ένα άλλο αντικείμενο του Kubernetes υπεύθυνο για την έκθεση μιας διεπαφής σε αυτά τα pods, η οποία επιτρέπει την πρόσβαση στο δίκτυο είτε από το εσωτερικό του cluster είτε μεταξύ εξωτερικών διεργασιών και της υπηρεσίας. Μπορεί να οριστεί ως μια αφαίρεση πάνω από το pod, η οποία παρέχει μια ενιαία διεύθυνση IP και όνομα DNS μέσω των οποίων είναι δυνατή η πρόσβαση στα pods. Με την υπηρεσία, είναι πολύ εύκολο να διαχειριστείτε τη διαμόρφωση εξισορρόπησης φορτίου.
Εκτελέστε την ακόλουθη εντολή:
|
1 |
kubectl get services |
Αυτό θα εμφανίσει κείμενο παρόμοιο με το ακόλουθο:

Μετά τη λήψη του αποτελέσματος, το Kubernetes θα εκχωρήσει αυτόματα μια τυχαία θύρα που είναι μεγαλύτερη από 30000 , διασφαλίζοντας παράλληλα ότι η θύρα που εκχωρήθηκε δεν είναι ήδη δεσμευμένη από άλλη υπηρεσία. Η τρίτη γραμμή του παραπάνω αποτελέσματος θα σας βοηθήσει να βρείτε τη θύρα στην οποία εκτελείται το Nginx.
Για να επαληθεύσετε ότι λειτουργεί, επισκεφθείτε το http://worker_1_ip:nginx_port ή http://worker_2_ip:nginx_port μέσω ενός προγράμματος περιήγησης στον τοπικό σας υπολογιστή. Θα δείτε τη γνώριμη σελίδα καλωσορίσματος του Nginx.
Κατάργηση Deployment
Εάν θέλετε να καταργήσετε την εφαρμογή Nginx, πρέπει πρώτα να διαγράψετε την υπηρεσία nginx από τον κύριο κόμβο:
|
1 |
kubectl delete service nginx |
Για να επαληθεύσετε ότι η εφαρμογή έχει τελικά διαγραφεί, πρέπει να εκτελέσετε αυτήν την εντολή:
|
1 |
kubectl get services |
Θα λάβετε το ακόλουθο αποτέλεσμα:

Μετά από αυτό, πρέπει να διαγράψετε το deployment χρησιμοποιώντας την ακόλουθη εντολή:
|
1 |
kubectl delete deployment nginx |
Μπορείτε να χρησιμοποιήσετε αυτήν την εντολή για να επαληθεύσετε εάν το deployment έχει τελικά διαγραφεί:
|
1 |
kubectl get deployments |
![]()
Συμπέρασμα:
Αυτός ο οδηγός θα σας βοηθήσει να ρυθμίσετε σωστά ένα cluster στο Ubuntu 18.04 χρησιμοποιώντας το Kubeadm και το Ansible. Τώρα που το cluster σας έχει ρυθμιστεί, μπορείτε εύκολα να ξεκινήσετε την ανάπτυξη των δικών σας εφαρμογών και υπηρεσιών.
Ακολουθεί μια λίστα με συνδέσμους με πρόσθετες λεπτομέρειες που θα σας καθοδηγήσουν στη διαδικασία:
- Dockerizing εφαρμογών – Αυτός ο σύνδεσμος περιέχει παραδείγματα που σας καθοδηγούν στον τρόπο φόρτωσης εφαρμογών με χρήση του Docker. Όπως το Dockerizing της PostgreSQL, μιας υπηρεσίας CouchDB, κ.λπ.
- Επισκόπηση Pod – Αυτός ο σύνδεσμος παρουσιάζει λεπτομέρειες σχετικά με τον τρόπο χρήσης ενός pod, τη λειτουργία των pods και τον τρόπο με τον οποίο τα pods σχετίζονται με άλλα αντικείμενα του Kubernetes. Τα pods αποτελούν σημαντικό μέρος του Kubernetes, επομένως η κατανόησή τους θα σας βοηθήσει να πετύχετε στο έργο σας.
- Επισκόπηση Deployments – Θα σας βοηθήσει να μάθετε για τα deployments. Ένα deployment παρέχει δηλωτικές ενημερώσεις για Pods και ReplicaSets. Θα μάθετε πώς να ενημερώνετε, να μεταβαίνετε και να επαναφέρετε ένα deployment.
- Επισκόπηση Services -Αυτός ο σύνδεσμος θα σας καθοδηγήσει σχετικά με τις υπηρεσίες που αποτελούν ένα άλλο συχνά χρησιμοποιούμενο αντικείμενο σε Kubernetes clusters. Μια υπηρεσία στο Kubernetes είναι μια αφαίρεση που ορίζει ένα λογικό σύνολο από Pods και μια πολιτική με την οποία μπορείτε να έχετε πρόσβαση σε αυτά. Η κατανόηση των τύπων υπηρεσιών και των επιλογών που διαθέτουν είναι απαραίτητη για την εκτέλεση τόσο stateless όσο και stateful εφαρμογών.
Επιπλέον, ρίξτε μια ματιά στα άλλα σεμινάριά μας που εστιάζουν στα Docker και Kubernetes και τα οποία μπορείτε να βρείτε στο blog μας:
- Γνωρίζοντας το Kubernetes
- Καθαρισμός πόρων Docker – Images, Containers και Volumes
- Πώς να τρέξετε το Docker στο CloudSigma (με το CloudInit) Ενημερωμένο
- Εγκατάσταση και ρύθμιση του Docker σε CentOS 7
- Πώς να εγκαταστήσετε & να λειτουργήσετε το Docker στο Ubuntu στο δημόσιο cloud
Υπάρχουν επίσης πολλές άλλες σημαντικές έννοιες όπως Volumes, Ingresses, και Secrets που μπορείτε να χρησιμοποιήσετε κατά την ανάπτυξη εφαρμογών παραγωγής.
Happy Computing!
Σχόλια
Δεν υπάρχουν σχόλια ακόμα. Γράψτε το πρώτο.