Η συσκευή Helm και οι παγίδες της

Η συσκευή Helm και οι παγίδες της
Έννοια του φορτηγού φορτηγού Typhon, Anton Swanepoel

Το όνομά μου είναι Dmitry Sugrobov, είμαι προγραμματιστής στο Leroy Merlin. Σε αυτό το άρθρο θα σας πω γιατί χρειάζεται το Helm, πώς απλοποιεί την εργασία με το Kubernetes, τι έχει αλλάξει στην τρίτη έκδοση και πώς να το χρησιμοποιήσετε για την ενημέρωση εφαρμογών στην παραγωγή χωρίς διακοπές λειτουργίας.

Αυτή είναι μια περίληψη που βασίζεται σε μια ομιλία σε ένα συνέδριο Συνέδριο @Kubernetes by Mail.ru Cloud Solutions — αν δεν θέλετε να διαβάσετε, δείτε το βίντεο.

Γιατί χρησιμοποιούμε Kubernetes στην παραγωγή

Η Leroy Merlin είναι ηγέτης στην αγορά λιανικής DIY στη Ρωσία και την Ευρώπη. Η εταιρεία μας έχει περισσότερους από εκατό προγραμματιστές, 33 εσωτερικούς υπαλλήλους και έναν τεράστιο αριθμό ατόμων που επισκέπτονται τις υπεραγορές και τον ιστότοπο. Για να τους κάνουμε όλους χαρούμενους, αποφασίσαμε να ακολουθήσουμε τις τυπικές προσεγγίσεις του κλάδου. Ανάπτυξη νέων εφαρμογών χρησιμοποιώντας αρχιτεκτονική microservice. Χρησιμοποιήστε δοχεία για να απομονώσετε περιβάλλοντα και να εξασφαλίσετε τη σωστή παράδοση· και χρησιμοποιήστε το Kubernetes για ενορχήστρωση. Η τιμή της χρήσης ενορχηστρωτών γίνεται γρήγορα φθηνότερη: ο αριθμός των μηχανικών που γνωρίζουν την τεχνολογία αυξάνεται στην αγορά και οι πάροχοι εμφανίζονται να προσφέρουν το Kubernetes ως υπηρεσία.

Ό,τι κάνει η Kubernetes, φυσικά, μπορεί να γίνει με άλλους τρόπους, για παράδειγμα, καλύπτοντας μερικά Jenkins και docker-compose με σενάρια, αλλά γιατί να περιπλέκουμε τη ζωή αν υπάρχει μια έτοιμη και αξιόπιστη λύση; Γι' αυτό ήρθαμε στο Kubernetes και το χρησιμοποιούμε στην παραγωγή εδώ και ένα χρόνο. Αυτή τη στιγμή έχουμε είκοσι τέσσερα συμπλέγματα Kubernetes, το παλαιότερο από τα οποία είναι περισσότερο από ένα έτος, με περίπου διακόσια λοβούς.

Η κατάρα των μεγάλων αρχείων YAML στο Kubernetes

Για να ξεκινήσουμε μια microservice στο Kubernetes, θα δημιουργήσουμε τουλάχιστον πέντε αρχεία YAML: για Deployment, Service, Ingress, ConfigMap, Secrets - και θα τα στείλουμε στο σύμπλεγμα. Για την επόμενη εφαρμογή θα γράψουμε το ίδιο πακέτο τζαμαριών, με το τρίτο θα γράψουμε άλλο ένα κ.ο.κ. Εάν πολλαπλασιάσουμε τον αριθμό των εγγράφων με τον αριθμό των περιβαλλόντων, θα έχουμε ήδη εκατοντάδες αρχεία και αυτό δεν λαμβάνει ακόμη υπόψη τα δυναμικά περιβάλλοντα.

Η συσκευή Helm και οι παγίδες της
Ο Adam Reese, βασικός συντηρητής της Helm, εισήγαγε την έννοια του "Κύκλος ανάπτυξης στο Kubernetes", που μοιάζει με αυτό:

  1. Αντιγραφή YAML - αντιγράψτε ένα αρχείο YAML.
  2. Επικόλληση YAML - επικολλήστε το.
  3. Διορθώστε εσοχές - διορθώστε εσοχές.
  4. Επαναλάβετε - επαναλάβετε ξανά.

Η επιλογή λειτουργεί, αλλά πρέπει να αντιγράψετε τα αρχεία YAML πολλές φορές. Για να αλλάξει αυτός ο κύκλος, εφευρέθηκε το Helm.

Τι είναι το Helm

Πρώτον, Helm - διαχειριστής πακέτων, που σας βοηθά να βρείτε και να εγκαταστήσετε τα προγράμματα που χρειάζεστε. Για να εγκαταστήσετε, για παράδειγμα, το MongoDB, δεν χρειάζεται να μεταβείτε στον επίσημο ιστότοπο και να κάνετε λήψη δυαδικών αρχείων, απλώς εκτελέστε την εντολή helm install stable/mongodb.

Δεύτερον, Helm - κινητήρας προτύπου, βοηθά στην παραμετροποίηση αρχείων. Ας επιστρέψουμε στην κατάσταση με τα αρχεία YAML στο Kubernetes. Είναι πιο εύκολο να γράψετε το ίδιο αρχείο YAML, να προσθέσετε μερικά σύμβολα θέσης σε αυτό, στα οποία το Helm θα αντικαταστήσει τις τιμές. Δηλαδή, αντί για ένα μεγάλο σύνολο ικριωμάτων, θα υπάρχει ένα σύνολο προτύπων στα οποία θα αντικατασταθούν οι απαιτούμενες τιμές την κατάλληλη στιγμή.

Τρίτον, Helm - κύριος ανάπτυξης. Με αυτό μπορείτε να εγκαταστήσετε, να επαναφέρετε και να ενημερώσετε εφαρμογές. Ας καταλάβουμε πώς να το κάνουμε αυτό.

Η συσκευή Helm και οι παγίδες της

Πώς να χρησιμοποιήσετε το Helm για να αναπτύξετε τις δικές σας εφαρμογές

Ας εγκαταστήσουμε το πρόγραμμα-πελάτη Helm στον υπολογιστή σας, ακολουθώντας τα επίσημα οδηγίες. Στη συνέχεια, θα δημιουργήσουμε ένα σύνολο αρχείων YAML. Αντί να προσδιορίσουμε συγκεκριμένες τιμές, θα αφήσουμε σύμβολα κράτησης θέσης, τα οποία η Helm θα συμπληρώσει με πληροφορίες στο μέλλον. Ένα σύνολο τέτοιων αρχείων ονομάζεται διάγραμμα Helm. Μπορεί να σταλεί στον πελάτη της κονσόλας Helm με τρεις τρόπους:

  • υποδεικνύουν ένα φάκελο με πρότυπα.
  • συσκευάστε το αρχείο σε ένα .tar και τοποθετήστε το δείκτη σε αυτό.
  • Τοποθετήστε το πρότυπο σε ένα απομακρυσμένο αποθετήριο και προσθέστε έναν σύνδεσμο προς το χώρο αποθήκευσης στον πελάτη Helm.

Χρειάζεστε επίσης ένα αρχείο με τιμές - values.yaml. Τα δεδομένα από εκεί θα εισαχθούν στο πρότυπο. Ας το δημιουργήσουμε κι εμείς.

Η συσκευή Helm και οι παγίδες της
Η δεύτερη έκδοση του Helm έχει μια πρόσθετη εφαρμογή διακομιστή - το Tiller. Κρεμιέται έξω από το Kubernetes και περιμένει αιτήματα από τον πελάτη Helm, και όταν καλείται, αντικαθιστά τις απαιτούμενες τιμές στο πρότυπο και το στέλνει στο Kubernetes.

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

Πώς λειτουργούν όλα

Εκτελέστε την εντολή helm install. Ας υποδείξουμε το όνομα της έκδοσης της εφαρμογής και ας δώσουμε τη διαδρομή στο values.yaml. Στο τέλος θα υποδείξουμε το αποθετήριο στο οποίο βρίσκεται το γράφημα και το όνομα του γραφήματος. Στο παράδειγμα, αυτά είναι τα "lmru" και "bestchart", αντίστοιχα.

helm install --name bestapp --values values.yaml lmru/bestchart

Η εντολή μπορεί να εκτελεστεί μόνο μία φορά, όταν εκτελεστεί ξανά install ανάγκη χρήσης upgrade. Για απλότητα, αντί για δύο εντολές, μπορείτε να εκτελέσετε την εντολή upgrade με επιπλέον κλειδί --install. Όταν εκτελεστεί για πρώτη φορά, η Helm θα στείλει μια εντολή για την εγκατάσταση της έκδοσης και θα την ενημερώσει στο μέλλον.

helm upgrade --install bestapp --values values.yaml lmru/bestchart

Παγίδες ανάπτυξης νέων εκδόσεων μιας εφαρμογής με το Helm

Σε αυτό το σημείο της ιστορίας, παίζω Who Wants to Be a Millionaire με το κοινό και σκεφτόμαστε πώς να κάνουμε τον Helm να ενημερώσει την έκδοση της εφαρμογής. Δες το βίντεο.

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

Μέθοδος 1. Μην αλλάζετε τις πληροφορίες από την τελευταία εκκίνηση

Όπως λέει επίσημη ιστοσελίδα Helm, "Τα γραφήματα Kubernetes μπορεί να είναι μεγάλα και πολύπλοκα, οπότε ο Helm προσπαθεί να μην αγγίζει τίποτα πάρα πολύ." Επομένως, εάν ενημερώσετε την πιο πρόσφατη έκδοση της εικόνας της εφαρμογής στο μητρώο του docker και εκτελέσετε την εντολή helm upgrade, τότε δεν θα γίνει τίποτα. Ο Helm θα σκεφτεί ότι τίποτα δεν έχει αλλάξει και δεν χρειάζεται να στείλετε μια εντολή στο Kubernetes για να ενημερώσετε την εφαρμογή.

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

Μέθοδος 2. Ενημερώστε το LABEL στην εικόνα

Όπως γράφεται στο ίδιο τεκμηρίωση, "Η Helm θα ενημερώσει μια εφαρμογή μόνο εάν έχει αλλάξει από την τελευταία έκδοση." Μια λογική επιλογή για αυτό φαίνεται να είναι η ενημέρωση του LABEL στην ίδια την εικόνα του docker. Ωστόσο, η Helm δεν εξετάζει τις εικόνες της εφαρμογής και δεν έχει ιδέα για τυχόν αλλαγές σε αυτές. Κατά συνέπεια, κατά την ενημέρωση των ετικετών στην εικόνα, ο Helm δεν θα γνωρίζει γι' αυτές και η εντολή ενημέρωσης της εφαρμογής δεν θα σταλεί στο Kubernetes.

Μέθοδος 3: Χρησιμοποιήστε ένα κλειδί --force

Η συσκευή Helm και οι παγίδες της
Ας στραφούμε στα εγχειρίδια και ας αναζητήσουμε το απαιτούμενο κλειδί. Το κλειδί έχει το πιο νόημα --force. Παρά το προφανές όνομα, η συμπεριφορά είναι διαφορετική από την αναμενόμενη. Αντί να επιβάλλει μια ενημέρωση εφαρμογής, ο πραγματικός σκοπός της είναι να επαναφέρει μια έκδοση που βρίσκεται σε κατάσταση ΑΠΟΤΥΧΕΙΑ. Εάν δεν χρησιμοποιείτε αυτό το κλειδί, πρέπει να εκτελέσετε τις εντολές διαδοχικά helm delete && helm install --replace. Προτείνεται η χρήση του κλειδιού --force, που αυτοματοποιεί τη διαδοχική εκτέλεση αυτών των εντολών. Περισσότερες πληροφορίες σε αυτό αίτημα έλξης. Για να πείτε στον Helm να ενημερώσει την έκδοση της εφαρμογής, δυστυχώς, αυτό το κλειδί δεν θα λειτουργήσει.

Μέθοδος 4. Αλλάξτε τις ετικέτες απευθείας στο Kubernetes

Η συσκευή Helm και οι παγίδες της
Ενημέρωση ετικέτας απευθείας στο σύμπλεγμα χρησιμοποιώντας την εντολή kubectl edit - κακή ιδέα. Αυτή η ενέργεια θα οδηγήσει σε ασυνέπεια των πληροφοριών μεταξύ της εφαρμογής που εκτελείται και αυτής που στάλθηκε αρχικά για ανάπτυξη. Η συμπεριφορά του Helm κατά την ανάπτυξη σε αυτήν την περίπτωση διαφέρει από την έκδοσή του: το Helm 2 δεν θα κάνει τίποτα και το Helm 3 θα αναπτύξει τη νέα έκδοση της εφαρμογής. Για να καταλάβετε γιατί, πρέπει να καταλάβετε πώς λειτουργεί το Helm.

Πώς λειτουργεί το Helm;

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

  • εκτέλεση εφαρμογής στο Kubernetes.
  • νέες τιμές.yaml και τρέχον γράφημα.
  • Πληροφορίες εσωτερικής έκδοσης Helm.

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

Η συσκευή Helm και οι παγίδες της
Υπάρχουν επίσης λεπτομερείς πληροφορίες σχετικά με τα πρότυπα και τις τιμές που αποστέλλονται. Μπορούμε να το ζητήσουμε:

Η συσκευή Helm και οι παγίδες της
Στη δεύτερη έκδοση του Helm, αυτές οι πληροφορίες βρίσκονται στον ίδιο χώρο ονομάτων όπου εκτελείται το Tiller (σύστημα kube από προεπιλογή), στο ConfigMap, σημειωμένο με την ετικέτα "OWNER=TILLER":

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

Η συσκευή Helm και οι παγίδες της

Το δεύτερο Helm, όταν προσπαθεί να καταλάβει εάν χρειάζεται μια ενημέρωση, χρησιμοποιεί μόνο δύο πηγές πληροφοριών: αυτό που του παρέχεται τώρα και εσωτερικές πληροφορίες σχετικά με τις εκδόσεις, οι οποίες βρίσκονται στο ConfigMap.

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

Η συσκευή Helm και οι παγίδες της
Για το λόγο αυτό, η παλιά έκδοση του Helm δεν θα κάνει τίποτα, αφού δεν λαμβάνει υπόψη τις πληροφορίες της εφαρμογής στο σύμπλεγμα, αλλά το Helm 3 θα λάβει τις αλλαγές και θα στείλει τη νέα εφαρμογή για ανάπτυξη.

Μέθοδος 5. Χρησιμοποιήστε το διακόπτη --recreate-pods

Με κλειδί --recreate-pods μπορείς να πετύχεις αυτό που αρχικά σχεδίαζες να πετύχεις με το κλειδί --force. Τα κοντέινερ θα κάνουν επανεκκίνηση και, σύμφωνα με την πολιτική imagePullPolicy: Always για την πιο πρόσφατη ετικέτα (περισσότερα για αυτό στην παραπάνω υποσημείωση), η Kubernetes θα πραγματοποιήσει λήψη και εκκίνηση μιας νέας έκδοσης της εικόνας. Αυτό δεν θα γίνει με τον καλύτερο τρόπο: χωρίς να ληφθεί υπόψη το StrategyType της ανάπτυξης, θα απενεργοποιήσει απότομα όλες τις παλιές παρουσίες εφαρμογών και θα ξεκινήσει την εκκίνηση νέων. Κατά την επανεκκίνηση, το σύστημα δεν θα λειτουργήσει, οι χρήστες θα υποφέρουν.

Στο ίδιο το Kubernetes, ένα παρόμοιο πρόβλημα υπήρχε επίσης για μεγάλο χρονικό διάστημα. Και τώρα, 4 χρόνια μετά το άνοιγμα Ζήτημα, το πρόβλημα επιδιορθώθηκε και ξεκινώντας με την έκδοση 1.15 του Kubernetes, εμφανίζεται η δυνατότητα roll-restart pods.

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

Πώς να ενημερώσετε την έκδοση της εφαρμογής χρησιμοποιώντας το Helm;

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

  1. Τυχαία τιμή χρησιμοποιώντας την τυπική συνάρτηση - {{ randAlphaNum 6 }}.
    Υπάρχει μια προειδοποίηση: μετά από κάθε ανάπτυξη χρησιμοποιώντας ένα γράφημα με μια τέτοια μεταβλητή, η τιμή του σχολιασμού θα είναι μοναδική και η Helm θα υποθέσει ότι υπάρχουν αλλαγές. Αποδεικνύεται ότι θα κάνουμε πάντα επανεκκίνηση της εφαρμογής, ακόμα κι αν δεν έχουμε αλλάξει την έκδοσή της. Αυτό δεν είναι κρίσιμο, καθώς δεν θα υπάρχει χρόνος διακοπής λειτουργίας, αλλά εξακολουθεί να είναι δυσάρεστο.
  2. Επικόλληση ρεύματος ημερομηνία και ώρα - {{ .Release.Date }}.
    Μια παραλλαγή είναι παρόμοια με μια τυχαία τιμή με μια μόνιμα μοναδική μεταβλητή.
  3. Ένας πιο σωστός τρόπος είναι η χρήση αθροίσματα ελέγχου. Αυτό είναι το SHA της εικόνας ή το SHA του τελευταίου commit στο git - {{ .Values.sha }}.
    Θα χρειαστεί να καταμετρηθούν και να σταλούν στον πελάτη Helm στην πλευρά που καλεί, για παράδειγμα στο Jenkins. Εάν η εφαρμογή έχει αλλάξει, τότε το άθροισμα ελέγχου θα αλλάξει. Επομένως, η Helm θα ενημερώσει την εφαρμογή μόνο όταν χρειάζεται.

Ας συνοψίσουμε τις προσπάθειές μας

  • Η Helm κάνει αλλαγές με τον λιγότερο επεμβατικό τρόπο, επομένως οποιαδήποτε αλλαγή στο επίπεδο εικόνας της εφαρμογής στο Μητρώο Docker δεν θα οδηγήσει σε ενημέρωση: τίποτα δεν θα συμβεί μετά την εκτέλεση της εντολής.
  • Κλειδί --force χρησιμοποιείται για την επαναφορά προβληματικών εκδόσεων και δεν σχετίζεται με αναγκαστικές ενημερώσεις.
  • Κλειδί --recreate-pods θα ενημερώσει αναγκαστικά τις εφαρμογές, αλλά θα το κάνει με βανδαλικό τρόπο: θα απενεργοποιήσει απότομα όλα τα κοντέινερ. Οι χρήστες θα υποφέρουν από αυτό· δεν πρέπει να το κάνετε αυτό στην παραγωγή.
  • Κάντε απευθείας αλλαγές στο σύμπλεγμα Kubernetes χρησιμοποιώντας την εντολή kubectl edit don't: θα σπάσουμε τη συνοχή και η συμπεριφορά θα διαφέρει ανάλογα με την έκδοση του Helm.
  • Με την κυκλοφορία της νέας έκδοσης του Helm, έχουν εμφανιστεί πολλές αποχρώσεις. Τα ζητήματα στο αποθετήριο Helm περιγράφονται με σαφή γλώσσα, θα σας βοηθήσουν να κατανοήσετε τις λεπτομέρειες.
  • Η προσθήκη ενός επεξεργάσιμου σχολιασμού σε ένα γράφημα θα το κάνει πιο ευέλικτο. Αυτό θα σας επιτρέψει να ανοίξετε την εφαρμογή σωστά, χωρίς διακοπές λειτουργίας.

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

Άλλοι σχετικοί σύνδεσμοι:

  1. Γνωριμία Πηδάλιο 3
  2. Επίσημος ιστότοπος Helm
  3. Αποθετήριο Helm στο GitHub
  4. 25 Χρήσιμα εργαλεία Kubernetes: Ανάπτυξη και Διαχείριση

Αυτή η έκθεση παρουσιάστηκε για πρώτη φορά στο Συνέδριο @Kubernetes από τη Mail.ru Cloud Solutions. Κοίτα βίντεο άλλες παραστάσεις και εγγραφείτε σε ανακοινώσεις εκδηλώσεων στο Telegram Γύρω από το Kubernetes στο Mail.ru Group.

Πηγή: www.habr.com

Προσθέστε ένα σχόλιο