Βιβλίο "Kubernetes για DevOps"

Βιβλίο "Kubernetes για DevOps" Γεια σας, κάτοικοι του Χάμπρο! Το Kubernetes είναι ένα από τα βασικά στοιχεία του σύγχρονου οικοσυστήματος cloud. Αυτή η τεχνολογία παρέχει αξιοπιστία, επεκτασιμότητα και ανθεκτικότητα στην εικονικοποίηση κοντέινερ. Οι John Arundel και Justin Domingus εξερευνούν το οικοσύστημα Kubernetes και παρέχουν αποδεδειγμένες λύσεις σε καθημερινά προβλήματα. Βήμα προς βήμα, θα δημιουργήσετε τη δική σας εφαρμογή cloud-native και θα δημιουργήσετε την υποδομή για να την υποστηρίξετε, θα ρυθμίσετε ένα περιβάλλον ανάπτυξης και μια συνεχή διαδικασία ανάπτυξης που θα σας βοηθήσει όταν εργάζεστε σε μελλοντικές εφαρμογές.

• Ξεκινήστε με τα κοντέινερ και τα Kubernetes από την αρχή: δεν απαιτείται ιδιαίτερη εμπειρία για να μάθετε το θέμα. • Εκτελέστε τα δικά σας clusters ή επιλέξτε μια διαχειριζόμενη υπηρεσία Kubernetes από την Amazon, την Google και άλλες εταιρείες. • Χρησιμοποιήστε το Kubernetes για τη διαχείριση του κύκλου ζωής των κοντέινερ και της κατανάλωσης πόρων. • Βελτιστοποίηση συμπλεγμάτων για κόστος, απόδοση, ανθεκτικότητα, χωρητικότητα και επεκτασιμότητα. • Μάθετε τα καλύτερα εργαλεία για την ανάπτυξη, τη δοκιμή και την ανάπτυξη των εφαρμογών σας. • Αξιοποίηση των τρεχουσών πρακτικών του κλάδου για τη διασφάλιση της ασφάλειας και του ελέγχου. • Εφαρμόστε τις αρχές DevOps σε ολόκληρο τον οργανισμό σας για να βοηθήσετε τις ομάδες ανάπτυξης να γίνουν πιο ευέλικτες, γρήγορες και αποτελεσματικές.

Σε ποιον απευθύνεται αυτό το βιβλίο;

Το βιβλίο είναι ιδιαίτερα σημαντικό για τους υπαλλήλους των διοικητικών τμημάτων που είναι υπεύθυνα για διακομιστές, εφαρμογές και υπηρεσίες, καθώς και για τους προγραμματιστές που ασχολούνται είτε με την κατασκευή νέων υπηρεσιών cloud είτε με τη μετεγκατάσταση υπαρχουσών εφαρμογών στο Kubernetes και το cloud. Μην ανησυχείτε, δεν χρειάζεται να ξέρετε πώς να εργάζεστε με Kubernetes και κοντέινερ - θα σας διδάξουμε τα πάντα.

Οι έμπειροι χρήστες του Kubernetes θα βρουν επίσης πολλά να εκτιμήσουν, με εις βάθος κάλυψη θεμάτων όπως το RBAC, η συνεχής ανάπτυξη, η διαχείριση απορρήτου και η παρατηρησιμότητα. Ελπίζουμε ότι οι σελίδες αυτού του βιβλίου σίγουρα θα περιέχουν κάτι ενδιαφέρον για εσάς, ανεξάρτητα από τις δεξιότητες και την εμπειρία σας.

Σε ποιες ερωτήσεις απαντά το βιβλίο;

Κατά τον σχεδιασμό και τη συγγραφή του βιβλίου, συζητήσαμε για το cloud computing και το Kubernetes με εκατοντάδες άτομα, μιλώντας με ηγέτες και ειδικούς στον κλάδο, καθώς και με εντελώς αρχάριους. Παρακάτω παρατίθενται μερικές από τις ερωτήσεις που θα ήθελαν να δουν απαντήσεις σε αυτήν την έκδοση.

  • «Ενδιαφέρομαι γιατί θα πρέπει να αφιερώσετε χρόνο σε αυτήν την τεχνολογία. Ποια προβλήματα θα βοηθήσει εμένα και την ομάδα μου να λύσουμε;»
  • «Το Kubernetes φαίνεται ενδιαφέρον, αλλά έχει αρκετά υψηλό εμπόδιο εισόδου. Η δημιουργία ενός απλού παραδείγματος είναι εύκολη, αλλά η περαιτέρω διαχείριση και ο εντοπισμός σφαλμάτων είναι τρομακτικά. Θα θέλαμε να λάβουμε κάποιες στέρεες συμβουλές σχετικά με το πώς οι χρήστες διαχειρίζονται τα συμπλέγματα Kubernetes στο φυσικό περιβάλλον και ποια προβλήματα είναι πιθανό να αντιμετωπίσουμε.»
  • «Οι υποκειμενικές συμβουλές θα ήταν χρήσιμες. Το οικοσύστημα Kubernetes προσφέρει πάρα πολλές επιλογές για να διαλέξουν οι νέες ομάδες. Όταν υπάρχουν διάφοροι τρόποι για να κάνει κανείς το ίδιο πράγμα, πώς ξέρεις ποιος είναι ο καλύτερος; Πώς να κάνεις μια επιλογή;»

Και ίσως το πιο σημαντικό ερώτημα από όλα:

  • "Πώς μπορώ να χρησιμοποιήσω το Kubernetes χωρίς να διαταράξω την επιχείρησή μου;"

Απόσπασμα. Διαμόρφωση και μυστικά αντικείμενα

Η δυνατότητα διαχωρισμού της λογικής μιας εφαρμογής Kubernetes από τη διαμόρφωσή της (δηλαδή από τυχόν τιμές ή ρυθμίσεις που ενδέχεται να αλλάξουν με την πάροδο του χρόνου) είναι πολύ χρήσιμη. Οι τιμές διαμόρφωσης συνήθως περιλαμβάνουν ρυθμίσεις που αφορούν συγκεκριμένα το περιβάλλον, διευθύνσεις DNS για υπηρεσίες τρίτων και διαπιστευτήρια ελέγχου ταυτότητας.

Φυσικά, όλα αυτά μπορούν να τοποθετηθούν απευθείας στον κώδικα, αλλά αυτή η προσέγγιση δεν είναι αρκετά ευέλικτη. Για παράδειγμα, η αλλαγή μιας τιμής διαμόρφωσης θα απαιτούσε στη συνέχεια την ανακατασκευή και την εκ νέου ανάπτυξη του κώδικά σας. Μια πολύ καλύτερη λύση θα ήταν να διαχωρίσετε τη διαμόρφωση από τον κώδικα και να την διαβάσετε από ένα αρχείο ή μεταβλητές περιβάλλοντος.

Το Kubernetes παρέχει διάφορους τρόπους διαχείρισης της διαμόρφωσης. Αρχικά, μπορείτε να μεταβιβάσετε τιμές στην εφαρμογή μέσω μεταβλητών περιβάλλοντος που καθορίζονται στην προδιαγραφή του κελύφους pod (ανατρέξτε στην υποενότητα Μεταβλητές Περιβάλλοντος στη σελίδα 192). Δεύτερον, τα δεδομένα διαμόρφωσης μπορούν να αποθηκευτούν απευθείας στο Kubernetes χρησιμοποιώντας αντικείμενα ConfigMap και Secret.

Σε αυτό το κεφάλαιο, θα εξερευνήσουμε αυτά τα αντικείμενα λεπτομερώς και θα εξετάσουμε ορισμένες πρακτικές προσεγγίσεις για τη διαχείριση της διαμόρφωσης και της ιδιωτικότητας χρησιμοποιώντας μια εφαρμογή επίδειξης.

Ενημέρωση κελυφών pod όταν αλλάζει η διαμόρφωση

Φανταστείτε ότι έχετε μια ανάπτυξη στο σύμπλεγμά σας και θέλετε να αλλάξετε ορισμένες τιμές στο ConfigMap της. Αν χρησιμοποιείτε ένα διάγραμμα Helm (βλ. "Helm: Ένας διαχειριστής πακέτων για Kubernetes" στη σελίδα 102), μπορείτε να εντοπίσετε αλλαγές στη διαμόρφωση και να επαναφορτώσετε αυτόματα τα pod σας με ένα έξυπνο κόλπο. Προσθέστε την ακόλουθη σχολίαση στις προδιαγραφές ανάπτυξής σας:

checksum/config: {{ include (print $.Template.BasePath "/configmap.yaml") .
       | sha256sum }}

Το πρότυπο ανάπτυξης περιέχει πλέον ένα άθροισμα ελέγχου των παραμέτρων διαμόρφωσης: όταν αλλάξουν οι παράμετροι, το άθροισμα ελέγχου θα ενημερωθεί. Εάν εκτελέσετε την εντολή αναβάθμισης helm, το Helm θα εντοπίσει ότι οι προδιαγραφές ανάπτυξης έχουν αλλάξει και θα επανεκκινήσει όλα τα pod.

Ευαίσθητα δεδομένα στο Kubernetes

Γνωρίζουμε ήδη ότι το αντικείμενο ConfigMap παρέχει έναν ευέλικτο μηχανισμό για την αποθήκευση και την πρόσβαση σε δεδομένα διαμόρφωσης στο σύμπλεγμα. Ωστόσο, οι περισσότερες εφαρμογές έχουν πληροφορίες που είναι μυστικές και εμπιστευτικές, όπως κωδικούς πρόσβασης ή κλειδιά API. Μπορεί να αποθηκευτεί στο ConfigMap, αλλά αυτή η λύση δεν είναι ιδανική.

Αντ' αυτού, το Kubernetes προσφέρει έναν ειδικό τύπο αντικειμένου που έχει σχεδιαστεί για την αποθήκευση ευαίσθητων δεδομένων: Secret. Στη συνέχεια, ας δούμε ένα παράδειγμα για το πώς μπορεί να χρησιμοποιηθεί αυτό το αντικείμενο στην εφαρμογή επίδειξης.

Αρχικά, ρίξτε μια ματιά στο μανιφέστο Kubernetes για το αντικείμενο Secret (δείτε hello-secret-env/k8s/secret.yaml):

apiVersion: v1
kind: Secret
metadata:
    name: demo-secret
stringData:
    magicWord: xyzzy

Σε αυτό το παράδειγμα, το ιδιωτικό κλειδί του magicWord είναι xyzzy (en.wikipedia.org/wiki/Xyzzy_(computing)). Η λέξη xyzzy είναι στην πραγματικότητα πολύ χρήσιμη στον κόσμο των υπολογιστών. Όπως και με το ConfigMap, το αντικείμενο Secret μπορεί να περιέχει πολλά κλειδιά και τιμές. Εδώ, για λόγους απλότητας, χρησιμοποιούμε μόνο ένα ζεύγος κλειδιού-τιμής.

Χρήση μυστικών αντικειμένων ως μεταβλητών περιβάλλοντος

Όπως ένα ConfigMap, ένα αντικείμενο Secret μπορεί να διατεθεί μέσα σε ένα κοντέινερ ως μεταβλητές περιβάλλοντος ή ως αρχείο στον δίσκο του. Στο ακόλουθο παράδειγμα, θα αντιστοιχίσουμε την τιμή από το Secret σε μια μεταβλητή περιβάλλοντος:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-env
          ports:
             - containerPort: 8888
          env:
             - name: GREETING
               valueFrom:
               secretKeyRef:
                  name: demo-secret
                  key: magicWord

Εκτελέστε την ακόλουθη εντολή στο αποθετήριο επίδειξης για να εφαρμόσετε τα μανιφέστα:

kubectl apply -f hello-secret-env/k8s/
deployment.extensions "demo" configured
secret "demo-secret" created

Όπως και πριν, προωθήστε την τοπική θύρα στην ανάπτυξη για να δείτε το αποτέλεσμα στο πρόγραμμα περιήγησής σας:

kubectl port-forward deploy/demo 9999:8888
Forwarding from 127.0.0.1:9999 -> 8888
Forwarding from [::1]:9999 -> 8888

Κατά το άνοιγμα μιας διεύθυνσης localhost:9999/ θα πρέπει να δείτε τα εξής:

The magic word is "xyzzy"

Εγγραφή μυστικών αντικειμένων σε αρχεία

Σε αυτό το παράδειγμα, θα επισυνάψουμε το αντικείμενο Secret στο κοντέινερ ως αρχείο. Ο κώδικας βρίσκεται στον φάκελο hello-secret-file του αποθετηρίου demo.

Για να συνδέσουμε το Secret ως αρχείο, θα χρησιμοποιήσουμε την ακόλουθη ανάπτυξη:

spec:
   containers:
       - name: demo
          image: cloudnatived/demo:hello-secret-file
          ports:
              - containerPort: 8888
          volumeMounts:
              - name: demo-secret-volume
                mountPath: "/secrets/"
                readOnly: true
   volumes:
      - name: demo-secret-volume
        secret:
           secretName: demo-secret

Όπως στην ενότητα "Δημιουργία αρχείων διαμόρφωσης από αντικείμενα ConfigMap" στη σελίδα 240, δημιουργούμε έναν τόμο (σε αυτήν την περίπτωση είναι ο demo-secret-volume) και τον μοντάρουμε στο κοντέινερ στην ενότητα volumeMounts της προδιαγραφής. Το πεδίο mountPath καθορίζει /secrets, επομένως το Kubernetes θα δημιουργήσει ένα αρχείο σε αυτόν τον φάκελο για κάθε ζεύγος κλειδιού-τιμής που ορίζεται στο αντικείμενο Secret.

Στο παράδειγμά μας, έχουμε ορίσει μόνο ένα ζεύγος κλειδιού-τιμής με το όνομα magicWord, επομένως το μανιφέστο θα δημιουργήσει ένα αρχείο /secrets/magicWord μόνο για ανάγνωση στο κοντέινερ με ευαίσθητα δεδομένα.

Αν εφαρμόσετε αυτό το μανιφέστο με τον ίδιο τρόπο όπως στο προηγούμενο παράδειγμα, θα πρέπει να λάβετε το ίδιο αποτέλεσμα:

The magic word is "xyzzy"

Ανάγνωση μυστικών αντικειμένων

Στην προηγούμενη ενότητα, χρησιμοποιήσαμε την εντολή kubectl describe για να παραθέσουμε τα περιεχόμενα του ConfigMap. Μπορεί να γίνει το ίδιο και με το Secret;

kubectl describe secret/demo-secret
Name:          demo-secret

Namespace:      default
Labels:             <none>
Annotations:
Type:               Opaque

Data
====
magicWord: 5   bytes

Λάβετε υπόψη ότι τα ίδια τα δεδομένα δεν εμφανίζονται. Τα μυστικά στο Kubernetes είναι τύπου Opaque, που σημαίνει ότι το περιεχόμενό τους δεν εμφανίζεται στην περιγραφή εξόδου, αρχείων καταγραφής ή του τερματικού του kubectl, καθιστώντας αδύνατη την τυχαία αποκάλυψη ευαίσθητων πληροφοριών.

Για να δείτε την κωδικοποιημένη έκδοση YAML των ευαίσθητων δεδομένων, χρησιμοποιήστε την εντολή kubectl get:

kubectl get secret/demo-secret -o yaml
apiVersion: v1
data:
   magicWord: eHl6enk=
kind: Secret
metadata:
...
type: Opaque

base64

Τι είναι το eHl6enk=, εντελώς διαφορετικό από την αρχική μας σημασία; Αυτό είναι στην πραγματικότητα ένα αντικείμενο Secret με κωδικοποίηση base64. Το Base64 είναι ένα σχήμα για την κωδικοποίηση αυθαίρετων δυαδικών δεδομένων ως συμβολοσειρά χαρακτήρων.

Δεδομένου ότι οι ευαίσθητες πληροφορίες μπορεί να είναι δυαδικές και μη εκτυπώσιμες (όπως ένα κλειδί κρυπτογράφησης TLS), τα μυστικά αντικείμενα αποθηκεύονται πάντα σε μορφή base64.

Το κείμενο beHl6enk= είναι μια κωδικοποιημένη έκδοση base64 της μυστικής μας λέξης xyzzy. Μπορείτε να το επαληθεύσετε αυτό εκτελώντας την εντολή base64 --decode στο τερματικό:

echo "eHl6enk=" | base64 --decode
xyzzy

Έτσι, ενώ το Kubernetes σας προστατεύει από την τυχαία απόρριψη ευαίσθητων δεδομένων στο τερματικό σας ή στα αρχεία καταγραφής, εάν έχετε δικαιώματα ανάγνωσης στο Secrets σε έναν συγκεκριμένο χώρο ονομάτων, μπορείτε να ανακτήσετε αυτά τα δεδομένα σε μορφή base64 και στη συνέχεια να τα αποκωδικοποιήσετε.

Αν χρειάζεται να κωδικοποιήσετε κάποιο κείμενο στο base64 (για παράδειγμα, να το βάλετε σε ένα Secret), χρησιμοποιήστε την εντολή base64 χωρίς ορίσματα:

echo xyzzy | base64
eHl6enkK

Πρόσβαση σε μυστικά αντικείμενα

Ποιος μπορεί να διαβάσει και να επεξεργαστεί μυστικά αντικείμενα; Αυτό καθορίζεται από το RBAC, έναν μηχανισμό ελέγχου πρόσβασης (θα το συζητήσουμε λεπτομερώς στην υποενότητα «Εισαγωγή στον έλεγχο πρόσβασης βάσει ρόλων» στη σελίδα 258). Εάν εκτελείτε ένα σύμπλεγμα που δεν διαθέτει RBAC ή δεν το έχει ενεργοποιημένο, όλα τα μυστικά σας είναι προσβάσιμα σε οποιονδήποτε χρήστη ή κοντέινερ (θα εξηγήσουμε αργότερα ότι δεν θα πρέπει να έχετε κανένα σύμπλεγμα παραγωγής χωρίς RBAC).

Παθητική κρυπτογράφηση δεδομένων

Τι γίνεται με όσους έχουν πρόσβαση στη βάση δεδομένων etcd όπου το Kubernetes αποθηκεύει όλες τις πληροφορίες του; Μπορούν να διαβάσουν ευαίσθητα δεδομένα χωρίς να έχουν άδεια ανάγνωσης μυστικών αντικειμένων μέσω του API;

Ξεκινώντας από την έκδοση 1.7, το Kubernetes υποστηρίζει παθητική κρυπτογράφηση δεδομένων. Αυτό σημαίνει ότι οι ευαίσθητες πληροφορίες μέσα στο etcd αποθηκεύονται στον δίσκο σε κρυπτογραφημένη μορφή και δεν μπορούν να διαβαστούν ακόμη και από κάποιον που έχει άμεση πρόσβαση στη βάση δεδομένων. Για να το αποκρυπτογραφήσετε, χρειάζεστε ένα κλειδί που διαθέτει μόνο ο διακομιστής API του Kubernetes. Ένα σωστά διαμορφωμένο σύμπλεγμα θα πρέπει να έχει ενεργοποιημένη την παθητική κρυπτογράφηση.

Μπορείτε να ελέγξετε αν η παθητική κρυπτογράφηση λειτουργεί στο σύμπλεγμά σας ως εξής:

kubectl describe pod -n kube-system -l component=kube-apiserver |grep encryption
        --experimental-encryption-provider-config=...

Εάν δεν βλέπετε τη σημαία experimental-encryption-provider-config, η παθητική κρυπτογράφηση δεν είναι ενεργοποιημένη. Όταν χρησιμοποιείτε το Google Kubernetes Engine ή άλλες υπηρεσίες διαχείρισης Kubernetes, τα δεδομένα σας κρυπτογραφούνται χρησιμοποιώντας διαφορετικό μηχανισμό, επομένως η σημαία θα λείπει. Επικοινωνήστε με τον πάροχο Kubernetes για να δείτε εάν το περιεχόμενο etcd είναι κρυπτογραφημένο.

Αποθήκευση εμπιστευτικών δεδομένων

Υπάρχουν ορισμένοι πόροι Kubernetes που δεν πρέπει ποτέ να αφαιρούνται από το σύμπλεγμα, όπως ευαίσθητα μυστικά αντικείμενα. Μπορείτε να αποτρέψετε τη διαγραφή ενός πόρου χρησιμοποιώντας μια σχολίαση που παρέχεται από τον διαχειριστή Helm:

kind: Secret
metadata:
    annotations:
        "helm.sh/resource-policy": keep

Στρατηγικές Διαχείρισης Μυστικών Αντικειμένων

Στο παράδειγμα από την προηγούμενη ενότητα, τα ευαίσθητα δεδομένα προστατεύτηκαν από μη εξουσιοδοτημένη πρόσβαση αμέσως μετά την αποθήκευσή τους στο σύμπλεγμα. Αλλά στα αρχεία manifest αποθηκεύονταν σε απλό κείμενο.

Δεν πρέπει ποτέ να τοποθετείτε εμπιστευτικές πληροφορίες σε αρχεία που βρίσκονται υπό έλεγχο έκδοσης. Πώς μπορούμε λοιπόν να διαχειριστούμε και να αποθηκεύσουμε με ασφάλεια αυτές τις πληροφορίες πριν τις εφαρμόσουμε σε ένα σύμπλεγμα Kubernetes;

Μπορείτε να επιλέξετε οποιαδήποτε εργαλεία ή στρατηγικές θέλετε να χρησιμοποιήσετε για να χειριστείτε ευαίσθητα δεδομένα στις εφαρμογές σας, αλλά θα πρέπει να απαντήσετε τουλάχιστον στις ακόλουθες ερωτήσεις.

  • Πού να αποθηκεύω ευαίσθητα δεδομένα ώστε να είναι άμεσα διαθέσιμα;
  • Πώς να διαθέσετε ευαίσθητα δεδομένα στις ενεργές εφαρμογές σας;
  • Τι θα πρέπει να συμβεί στις εφαρμογές σας όταν αντικαθιστάτε ή επεξεργάζεστε ευαίσθητα δεδομένα;

Σχετικά με τους συγγραφείς

Τζον Αρουντέλ είναι σύμβουλος με 30 χρόνια εμπειρίας στον κλάδο των υπολογιστών. Έχει γράψει πολλά βιβλία και συνεργάζεται με πολλές εταιρείες σε όλο τον κόσμο, παρέχοντας συμβουλές σε υποδομές cloud-native και Kubernetes. Στον ελεύθερο χρόνο του απολαμβάνει το σερφ, είναι καλός σκοπευτής με πιστόλι και παίζει πιάνο ερασιτεχνικά. Ζει σε ένα υπέροχο εξοχικό στην Κορνουάλη της Αγγλίας.

Τζάστιν Ντόμινγκους — μηχανικός διαχείρισης συστημάτων που εργάζεται σε περιβάλλον DevOps με Kubernetes και τεχνολογίες cloud. Του αρέσει να περνάει χρόνο σε εξωτερικούς χώρους, να πίνει καφέ, να πιάνει καβούρια και να κάθεται μπροστά στον υπολογιστή. Ζει στο Σιάτλ της Ουάσινγκτον με την καταπληκτική γάτα του και την ακόμα πιο καταπληκτική σύζυγό του και καλύτερή του φίλη, την Αντριέν.

» Περισσότερες λεπτομέρειες για το βιβλίο μπορείτε να βρείτε στη διεύθυνση ιστοσελίδα του εκδότη
» πίνακας περιεχομένων
» Απόσπασμα

Για Khabrozhiteley 25% έκπτωση με χρήση κουπονιού - Kubernetes

Με την πληρωμή της έντυπης έκδοσης του βιβλίου, θα αποσταλεί ηλεκτρονικό βιβλίο με e-mail.

Πηγή: www.habr.com