Θα εκτελέσουμε την ανάπτυξη Canary με μη αυτόματο τρόπο μέσω του GitOps και δημιουργώντας/τροποποιώντας τους κύριους πόρους Kubernetes. Αυτό το άρθρο προορίζεται κυρίως για εισαγωγή με το πώς λειτουργεί η ανάπτυξη στο Kubernetes Canary, αφού υπάρχουν πιο αποτελεσματικές μέθοδοι αυτοματισμού, τις οποίες θα εξετάσουμε στα επόμενα άρθρα.
Με τη στρατηγική Canary, οι ενημερώσεις εφαρμόζονται πρώτα μόνο σε ένα υποσύνολο χρηστών. Μέσω παρακολούθησης, δεδομένων καταγραφής, μη αυτόματων δοκιμών ή άλλων καναλιών ανατροφοδότησης, η έκδοση ελέγχεται πριν κυκλοφορήσει σε όλους τους χρήστες.
Ανάπτυξη Kubernetes (κυλιόμενη ενημέρωση)
Η προεπιλεγμένη στρατηγική για το Kubernetes Deployment είναι η κυλιόμενη ενημέρωση, όπου ένας συγκεκριμένος αριθμός pod εκκινείται με νέες εκδόσεις των εικόνων. Εάν δημιουργήθηκαν χωρίς προβλήματα, οι ομάδες με παλιές εκδόσεις εικόνων τερματίζονται και δημιουργούνται νέες ομάδες παράλληλα.
GitOps
Χρησιμοποιούμε το GitOps σε αυτό το παράδειγμα επειδή:
χρησιμοποιώντας το Git ως ενιαία πηγή αλήθειας
χρησιμοποιούμε Λειτουργίες Git για δημιουργία και ανάπτυξη (δεν απαιτούνται άλλες εντολές εκτός από την ετικέτα git/συγχώνευση)
Παράδειγμα
Ας κάνουμε μια καλή πρακτική - να έχουμε ένα αποθετήριο για τον κώδικα εφαρμογής και ένα για την υποδομή.
Αποθετήριο εφαρμογών
Αυτό είναι ένα πολύ απλό Python+Flask API που επιστρέφει μια απάντηση ως JSON. Θα δημιουργήσουμε το πακέτο μέσω του GitlabCI και θα προωθήσουμε το αποτέλεσμα στο μητρώο του Gitlab. Στο μητρώο έχουμε δύο διαφορετικές εκδόσεις έκδοσης:
wuestkamp/k8s-deployment-example-app:v1
wuestkamp/k8s-deployment-example-app:v2
Η μόνη διαφορά μεταξύ τους είναι η αλλαγή στο επιστρεφόμενο αρχείο JSON. Χρησιμοποιούμε αυτήν την εφαρμογή για να οπτικοποιήσουμε όσο πιο εύκολα γίνεται με ποια έκδοση επικοινωνούμε.
Αποθετήριο υποδομής
Σε αυτό το γογγύλι θα αναπτύξουμε μέσω GitlabCI στο Kubernetes, .gitlab-ci.yml μοιάζει με αυτό:
Λάβετε υπόψη ότι η ανάπτυξη εφαρμογής δεν έχει ορίσει ακόμη αντίγραφα.
Εκτέλεση αρχικής ανάπτυξης
Για να ξεκινήσετε την αρχική ανάπτυξη, μπορείτε να ξεκινήσετε τη διοχέτευση GitlabCI με μη αυτόματο τρόπο στον κύριο κλάδο. Μετά από αυτό kubectl θα πρέπει να εξάγει τα εξής:
Βλέπουμε app ανάπτυξη με 10 αντίγραφα και app-canary με 0. Υπάρχει επίσης ένα LoadBalancer από το οποίο μπορούμε να έχουμε πρόσβαση μέσω curl μέσω εξωτερικής IP:
while true; do curl -s 35.198.149.232 | grep label; sleep 0.1; done
Βλέπουμε ότι η δοκιμαστική εφαρμογή μας επιστρέφει μόνο "v1".
Εκτέλεση ανάπτυξης Canary
Βήμα 1: κυκλοφορήστε μια νέα έκδοση για ορισμένους χρήστες
Ορίσαμε τον αριθμό των αντιγράφων σε 1 στο αρχείο deploy-canary.yaml και στην εικόνα της νέας έκδοσης:
Πιέζουμε αυτές τις αλλαγές στο αποθετήριο από το οποίο θα ξεκινήσει η ανάπτυξη (μέσω GitlabCI) και βλέπουμε ως αποτέλεσμα:
Η Υπηρεσία μας θα υποδείξει και τις δύο αναπτύξεις, καθώς και οι δύο έχουν τον επιλογέα εφαρμογής. Λόγω της προεπιλεγμένης τυχαιοποίησης του Kubernetes, θα πρέπει να δούμε διαφορετικές απαντήσεις για το ~10% των αιτημάτων:
Η τρέχουσα κατάσταση της εφαρμογής μας (GitOps, που λαμβάνεται από το Git as a Single Source Of Truth) είναι η παρουσία δύο αναπτύξεων με ενεργά αντίγραφα, ένα για κάθε έκδοση.
~10% των χρηστών εξοικειώνονται με μια νέα έκδοση και τη δοκιμάζουν ακούσια. Τώρα είναι η ώρα να ελέγξετε για σφάλματα στα αρχεία καταγραφής και στα δεδομένα παρακολούθησης για να βρείτε προβλήματα.
Βήμα 2: Κυκλοφορήστε τη νέα έκδοση σε όλους τους χρήστες
Αποφασίσαμε ότι όλα πήγαν καλά και τώρα πρέπει να διαθέσουμε τη νέα έκδοση σε όλους τους χρήστες. Για να γίνει αυτό, απλώς ενημερώνουμε deploy.yaml εγκατάσταση μιας νέας έκδοσης της εικόνας και ο αριθμός των αντιγράφων είναι ίσος με 10. Σε deploy-canary.yaml επαναφέρουμε τον αριθμό των αντιγράφων στο 0. Μετά την ανάπτυξη, το αποτέλεσμα θα είναι το εξής:
Ανακεφαλαίωση
Για μένα, η μη αυτόματη εκτέλεση της ανάπτυξης με αυτόν τον τρόπο βοηθά να κατανοήσω πόσο εύκολα μπορεί να ρυθμιστεί χρησιμοποιώντας το k8s. Δεδομένου ότι το Kubernetes σάς επιτρέπει να ενημερώνετε τα πάντα μέσω ενός API, αυτά τα βήματα μπορούν να αυτοματοποιηθούν μέσω σεναρίων.
Ένα άλλο πράγμα που πρέπει να εφαρμοστεί είναι ένα σημείο εισόδου δοκιμαστή (LoadBalancer ή μέσω Ingress) μέσω του οποίου είναι δυνατή η πρόσβαση μόνο στη νέα έκδοση. Μπορεί να χρησιμοποιηθεί για χειροκίνητη περιήγηση.
Σε μελλοντικά άρθρα, θα δούμε άλλες αυτοματοποιημένες λύσεις που υλοποιούν το μεγαλύτερο μέρος των όσων έχουμε κάνει.