Kubernetes Basics
Βασικά του Kubernetes
Ο αρχικός συγγραφέας αυτής της σελίδας είναι Jorge (διαβάστε την αρχική του ανάρτηση εδώ)
Αρχιτεκτονική & Βασικά
Τι κάνει το Kubernetes;
Επιτρέπει την εκτέλεση ενός ή περισσότερων containers σε έναν κινητήρα container.
Ο προγραμματισμός επιτρέπει την αποστολή των containers με αποδοτικό τρόπο.
Διατηρεί τα containers ενεργά.
Επιτρέπει την επικοινωνία μεταξύ των containers.
Επιτρέπει τεχνικές αναπτύξεων.
Διαχειρίζεται όγκους πληροφοριών.
Αρχιτεκτονική
Κόμβος (Node): λειτουργικό σύστημα με pod ή pods.
Pod: Περιτύλιγμα γύρω από ένα container ή πολλαπλά containers. Ένα pod θα πρέπει να περιέχει μόνο μία εφαρμογή (συνήθως, ένα pod εκτελεί μόνο 1 container). Το pod είναι ο τρόπος με τον οποίο το Kubernetes αφαιρεί την τεχνολογία container που εκτελείται.
Υπηρεσία (Service): Κάθε pod έχει 1 εσωτερική διεύθυνση IP από την εσωτερική περιοχή του κόμβου. Ωστόσο, μπορεί επίσης να εκτίθεται μέσω μιας υπηρεσίας. Η υπηρεσία έχει επίσης μια διεύθυνση IP και ο στόχος της είναι να διατηρεί την επικοινωνία μεταξύ των pods, έτσι ώστε εάν ένα πεθαίνει, το νέο αντικατασταθέν (με διαφορετική εσωτερική IP) θα είναι προσβάσιμο και θα εκτίθεται στην ίδια IP της υπηρεσίας. Μπορεί να ρυθμιστεί ως εσωτερική ή εξωτερική. Η υπηρεσία επίσης λειτουργεί ως εξισορροπητής φορτίου όταν 2 pods είναι συνδεδεμένα στην ίδια υπηρεσία. Όταν δημιουργείται μια υπηρεσία μπορείτε να βρείτε τα σημεία πρόσβασης κάθε υπηρεσίας εκτελώντας
kubectl get endpoints
Kubelet: Κύριος πράκτορας κόμβου. Ο συστατικός που επιτρέπει την επικοινωνία μεταξύ του κόμβου και του kubectl, και μπορεί να εκτελέσει μόνο pods (μέσω του API server). Το kubelet δεν διαχειρίζεται containers που δεν δημιουργήθηκαν από το Kubernetes.
Kube-proxy: Είναι η υπηρεσία που αναλαμβάνει τις επικοινωνίες (υπηρεσίες) μεταξύ του apiserver και του κόμβου. Βασίζεται στο IPtables για τους κόμβους. Οι πιο έμπειροι χρήστες μπορούν να εγκαταστήσουν άλλους kube-proxy από άλλους προμηθευτές.
Sidecar container: Τα sidecar containers είναι τα containers που πρέπει να εκτελούνται μαζί με το κύριο container στο pod. Αυτό το πρότυπο sidecar επεκτείνε
Υποδομή PKI - Αρχή Πιστοποίησης Πιστοποιητικών CA:
Η CA είναι η αξιόπιστη ρίζα για όλα τα πιστοποιητικά μέσα στο cluster.
Επιτρέπει στα στοιχεία να επικυρώνονται μεταξύ τους.
Όλα τα πιστοποιητικά του cluster υπογράφονται από την CA.
Το ETCd έχει το δικό του πιστοποιητικό.
Τύποι:
πιστοποιητικό apiserver.
πιστοποιητικό kubelet.
πιστοποιητικό scheduler.
Βασικές Ενέργειες
Minikube
Το Minikube μπορεί να χρησιμοποιηθεί για να πραγματοποιήσει γρήγορες δοκιμές στο Kubernetes χωρίς να χρειάζεται να αναπτύξετε ολόκληρο περιβάλλον Kubernetes. Θα εκτελέσει τις διεργασίες master και node σε ένα μηχάνημα. Το Minikube θα χρησιμοποιήσει το virtualbox για να εκτελέσει τον κόμβο. Δείτε εδώ πώς να το εγκαταστήσετε.
Βασικά του Kubectl
Το Kubectl
είναι το εργαλείο γραμμής εντολών για τα κατανεμημένα συστήματα Kubernetes. Επικοινωνεί με τον διακομιστή Api της κύριας διεργασίας για να εκτελέσει ενέργειες στο Kubernetes ή να ζητήσει δεδομένα.
Πίνακας ελέγχου Minikube
Ο πίνακας ελέγχου σας επιτρέπει να βλέπετε ευκολότερα τι εκτελείται στο Minikube, μπορείτε να βρείτε το URL για πρόσβαση σε αυτό στο:
Παραδείγματα αρχείων ρυθμίσεων YAML
Κάθε αρχείο ρυθμίσεων έχει 3 μέρη: metadata, specification (τι πρέπει να εκκινηθεί), status (επιθυμητή κατάσταση). Μέσα στην προδιαγραφή του αρχείου ρυθμίσεων της αναπτυξιακής διαμόρφωσης μπορείτε να βρείτε το πρότυπο που έχει καθοριστεί με μια νέα δομή ρυθμίσεων που καθορίζει την εικόνα που θα εκτελεστεί:
Παράδειγμα αναπτυξιακής διαμόρφωσης + Υπηρεσίας που δηλώνονται στο ίδιο αρχείο ρυθμίσεων (από εδώ)
Καθώς μια υπηρεσία συνήθως σχετίζεται με μια ανάπτυξη, είναι δυνατόν να δηλωθούν και οι δύο στο ίδιο αρχείο ρυθμίσεων (η υπηρεσία που δηλώνεται σε αυτήν την ρύθμιση είναι προσβάσιμη μόνο εσωτερικά):
Παράδειγμα εξωτερικής διαμόρφωσης υπηρεσίας
Αυτή η υπηρεσία θα είναι προσβάσιμη εξωτερικά (ελέγξτε τα χαρακτηριστικά nodePort
και type: LoadBalancer
):
Αυτό είναι χρήσιμο για δοκιμές, αλλά για παραγωγή θα πρέπει να έχετε μόνο εσωτερικές υπηρεσίες και ένα Ingress για να εκθέσετε την εφαρμογή.
Παράδειγμα αρχείου ρύθμισης Ingress
Αυτό θα εκθέσει την εφαρμογή στο http://dashboard.com
.
Παράδειγμα αρχείου ρύθμισης μυστικών
Παρατηρήστε πώς οι κωδικοί πρόσβασης κωδικοποιούνται σε B64 (το οποίο δεν είναι ασφαλές!)
Παράδειγμα του ConfigMap
Ένα ConfigMap είναι η διαμόρφωση που δίνεται στα pods ώστε να γνωρίζουν πώς να εντοπίσουν και να έχουν πρόσβαση σε άλλες υπηρεσίες. Σε αυτήν την περίπτωση, κάθε pod θα γνωρίζει ότι το όνομα mongodb-service
είναι η διεύθυνση ενός pod με το οποίο μπορεί να επικοινωνήσει (αυτό το pod θα εκτελεί ένα mongodb):
Στη συνέχεια, μέσα σε ένα deployment config, αυτή η διεύθυνση μπορεί να καθοριστεί με τον εξής τρόπο, ώστε να φορτώνεται μέσα στο περιβάλλον του pod:
Παράδειγμα ρύθμισης όγκου
Μπορείτε να βρείτε διάφορα παραδείγματα αρχείων ρύθμισης αποθήκευσης σε μορφή yaml στο https://gitlab.com/nanuchi/youtube-tutorial-series/-/tree/master/kubernetes-volumes. Σημειώστε ότι οι όγκοι δεν βρίσκονται μέσα στα namespaces
Namespaces
Το Kubernetes υποστηρίζει πολλαπλά εικονικά clusters που υποστηρίζονται από το ίδιο φυσικό cluster. Αυτά τα εικονικά clusters ονομάζονται namespaces. Αυτά προορίζονται για χρήση σε περιβάλλοντα με πολλούς χρήστες που είναι διασκορπισμένοι σε πολλές ομάδες ή έργα. Για clusters με λίγους έως δεκάδες χρήστες, δεν θα χρειαστεί να δημιουργήσετε ή να σκεφτείτε για τα namespaces καθόλου. Θα πρέπει μόνο να αρχίσετε να χρησιμοποιείτε τα namespaces για να έχετε καλύτερο έλεγχο και οργάνωση κάθε μέρους της εφαρμογής που έχει αναπτυχθεί στο Kubernetes.
Τα namespaces παρέχουν ένα πεδίο ορατότητας για τα ονόματα. Τα ονόματα των πόρων πρέπει να είναι μοναδικά εντός ενός namespace, αλλά όχι ανάμεσα σε διάφορα namespaces. Τα namespaces δεν μπορούν να είναι εμφωλευμένα μέσα σε άλλα και κάθε πόρος του Kubernetes μπορεί να βρίσκεται μόνο σε ένα namespace.
Υπάρχουν 4 namespaces από προεπιλογή αν χρησιμοποιείτε το minikube:
kube-system: Δεν προορίζεται για χρήση από τους χρήστες και δεν πρέπει να το αγγίξετε. Χρησιμοποιείται για τις διεργασίες του master και του kubectl.
kube-public: Δημόσια προσβάσιμα δεδομένα. Περιέχει ένα configmap που περιέχει πληροφορίες για το cluster.
kube-node-lease: Καθορίζει τη διαθεσιμότητα ενός κόμβου.
default: Το namespace που ο χρήστης θα χρησιμοποιήσει για τη δημιουργία πόρων.
Σημειώστε ότι οι περισσότεροι πόροι του Kubernetes (π.χ. pods, services, replication controllers και άλλοι) βρίσκονται σε ορισμένα namespaces. Ωστόσο, άλλοι πόροι όπως οι πόροι των namespaces και οι χαμηλού επιπέδου πόροι, όπως οι κόμβοι και οι persistenVolumes, δεν βρίσκονται σε ένα namespace. Για να δείτε ποιοι πόροι του Kubernetes είναι και ποιοι δεν είναι σε ένα namespace:
Μπορείτε να αποθηκεύσετε το namespace για όλες τις επόμενες εντολές kubectl σε αυτό το πλαίσιο.
Helm
Το Helm είναι ο διαχειριστής πακέτων για το Kubernetes. Επιτρέπει την συσκευασία των αρχείων YAML και τη διανομή τους σε δημόσιους και ιδιωτικούς αποθετήριους. Αυτά τα πακέτα ονομάζονται Helm Charts.
Το Helm είναι επίσης ένα εργαλείο προτύπων που επιτρέπει τη δημιουργία αρχείων ρυθμίσεων με μεταβλητές:
Μυστικά του Kubernetes
Ένα Μυστικό είναι ένα αντικείμενο που περιέχει ευαίσθητα δεδομένα όπως ένας κωδικός πρόσβασης, ένα τοκέν ή ένα κλειδί. Τέτοιες πληροφορίες θα μπορούσαν αλλιώς να τοποθετηθούν σε μια προδιαγραφή Pod ή σε μια εικόνα. Οι χρήστες μπορούν να δημιουργήσουν Μυστικά και το σύστημα δημιουργεί επίσης Μυστικά. Το όνομα ενός αντικειμένου Μυστικού πρέπει να είναι ένα έγκυρο DNS υποτομέας. Διαβάστε εδώ την επίσημη τεκμηρίωση.
Τα Μυστικά μπορεί να είναι πράγματα όπως:
Κλειδιά API, SSH.
Τοκέν OAuth.
Διαπιστευτήρια, Κωδικοί πρόσβασης (κανονικό κείμενο ή b64 + κρυπτογράφηση).
Πληροφορίες ή σχόλια.
Κώδικας σύνδεσης βάσης δεδομένων, συμβολοσειρές... .
Υπάρχουν διάφοροι τύποι μυστικών στο Kubernetes
Ενσωματωμένος Τύπος | Χρήση |
---|---|
Opaque | αυθαίρετα ορισμένα δεδομένα από τον χρήστη (Προεπιλογή) |
kubernetes.io/service-account-token | διαπιστευτήριο λογαριασμού υπηρεσίας |
kubernetes.io/dockercfg | σειριοποιημένο αρχείο ~/.dockercfg |
kubernetes.io/dockerconfigjson | σειριοποιημένο αρχείο ~/.docker/config.json |
kubernetes.io/basic-auth | διαπιστευτήρια για βασική πιστοποίηση |
kubernetes.io/ssh-auth | διαπιστευτήρια για πιστοποίηση SSH |
kubernetes.io/tls | δεδομένα για έναν πελάτη ή διακομιστή TLS |
bootstrap.kubernetes.io/token | δεδομένα εκκίνησης του token |
Ο τύπος Opaque είναι ο προεπιλεγμένος, το κλασικό ζευγάρι κλειδιού-τιμής που καθορίζεται από τους χρήστες.
Πώς λειτουργούν τα μυστικά:
Το παρακάτω αρχείο ρυθμίσεων καθορίζει ένα μυστικό με το όνομα mysecret
που περιέχει 2 ζευγάρια κλειδιού-τιμής username: YWRtaW4=
και password: MWYyZDFlMmU2N2Rm
. Ορίζει επίσης ένα pod με το όνομα secretpod
που θα έχει το username
και το password
που καθορίζονται στο mysecret
προσβάσιμα στις μεταβλητές περιβάλλοντος SECRET_USERNAME
και SECRET_PASSWOR
. Επίσης, θα προσαρτήσει το μυστικό username
μέσα στο mysecret
στη διαδρομή /etc/foo/my-group/my-username
με δικαιώματα 0640
.
Μυστικά στο etcd
etcd είναι ένα συνεπές και υψηλής διαθεσιμότητας key-value store που χρησιμοποιείται ως αποθήκη υποστήριξης του Kubernetes για όλα τα δεδομένα του cluster. Ας αποκτήσουμε πρόσβαση στα μυστικά που αποθηκεύονται στο etcd:
Θα δείτε ότι τα πιστοποιητικά, τα κλειδιά και οι διευθύνσεις URL βρίσκονται στο σύστημα αρχείων. Μόλις τα αποκτήσετε, θα μπορείτε να συνδεθείτε στο etcd.
Μόλις επιτύχετε να εγκαθιδρύσετε επικοινωνία, θα μπορείτε να αποκτήσετε τα μυστικά:
Προσθήκη κρυπτογράφησης στο ETCD
Από προεπιλογή, όλα τα μυστικά αποθηκεύονται σε απλό κείμενο μέσα στο etcd εκτός αν εφαρμόσετε ένα επίπεδο κρυπτογράφησης. Το παρακάτω παράδειγμα βασίζεται στο https://kubernetes.io/docs/tasks/administer-cluster/encrypt-data/
Μετά από αυτό, πρέπει να ορίσετε τη σημαία --encryption-provider-config
στον kube-apiserver
για να δείχνει στην τοποθεσία του δημιουργημένου αρχείου ρυθμίσεων. Μπορείτε να τροποποιήσετε το /etc/kubernetes/manifest/kube-apiserver.yaml
και να προσθέσετε τις παρακάτω γραμμές:
Κατέβασε προς τα κάτω στο volumeMounts:
Κατέβετε στον κατάλογο volumeMounts και βρείτε το hostPath:
Επαλήθευση της κρυπτογράφησης των δεδομένων
Τα δεδομένα κρυπτογραφούνται κατά την εγγραφή τους στο etcd. Μετά την επανεκκίνηση του kube-apiserver
, οποιοδήποτε νέο ή ενημερωμένο μυστικό θα πρέπει να κρυπτογραφείται κατά την αποθήκευσή του. Για να ελέγξετε αυτό, μπορείτε να χρησιμοποιήσετε το πρόγραμμα γραμμής εντολών etcdctl
για να ανακτήσετε το περιεχόμενο του μυστικού σας.
Δημιουργήστε ένα νέο μυστικό με το όνομα
secret1
στο namespacedefault
:
Χρησιμοποιώντας το etcdctl στη γραμμή εντολών, διαβάστε αυτό το μυστικό από το etcd:
ETCDCTL_API=3 etcdctl get /registry/secrets/default/secret1 [...] | hexdump -C
όπου [...]
πρέπει να είναι οι επιπλέον παράμετροι για τη σύνδεση με τον εξυπηρετητή etcd. 3. Επαληθεύστε ότι το αποθηκευμένο μυστικό έχει πρόθεμα k8s:enc:aescbc:v1:
, το οποίο υποδηλώνει ότι ο πάροχος aescbc
έχει κρυπτογραφήσει τα δεδομένα. 4. Επαληθεύστε ότι το μυστικό αποκρυπτογραφείται σωστά όταν ανακτάται μέσω του API:
πρέπει να ταιριάζει με mykey: bXlkYXRh
, το mydata είναι κωδικοποιημένο, ελέγξτε το αποκωδικοποίηση ενός μυστικού για να αποκωδικοποιήσετε πλήρως το μυστικό.
Καθώς τα μυστικά κρυπτογραφούνται κατά την εγγραφή, η ενημέρωση ενός μυστικού θα κρυπτογραφήσει το περιεχόμενο αυτό:
Τελικές συμβουλές:
Προσπαθήστε να μην κρατάτε μυστικά στο FS, αλλά να τα αντλείτε από άλλα μέρη.
Ελέγξτε το https://www.vaultproject.io/ για να προσθέσετε περισσότερη προστασία στα μυστικά σας.
Αναφορές
Last updated