Αυτόματες αναπτύξεις καναρινιών με Flagger και Istio

Αυτόματες αναπτύξεις καναρινιών με Flagger και Istio

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

Σηματοδότης είναι ένας χειριστής Kubernetes ανοιχτού κώδικα που στοχεύει στην εξάλειψη των μπερδεμένων σχέσεων. Αυτοματοποιεί την προώθηση αναπτύξεων καναρινιών χρησιμοποιώντας αντισταθμίσεις κυκλοφορίας Istio και μετρήσεις Prometheus για την ανάλυση της συμπεριφοράς της εφαρμογής κατά τη διάρκεια μιας διαχειριζόμενης διάθεσης.

Ακολουθεί ένας οδηγός βήμα προς βήμα για τη ρύθμιση και τη χρήση του Flagger στο Google Kubernetes Engine (GKE).

Ρύθμιση ενός συμπλέγματος Kubernetes

Ξεκινάτε δημιουργώντας ένα σύμπλεγμα GKE με το πρόσθετο Istio (αν δεν έχετε λογαριασμό GCP, μπορείτε να εγγραφείτε εδώ - για να λάβετε δωρεάν πιστώσεις).

Συνδεθείτε στο Google Cloud, δημιουργήστε ένα έργο και ενεργοποιήστε τη χρέωση για αυτό. Εγκαταστήστε το βοηθητικό πρόγραμμα γραμμής εντολών gcloud και διαμορφώστε το έργο σας με gcloud init.

Ορίστε το προεπιλεγμένο έργο, την περιοχή υπολογισμού και τη ζώνη (αντικαταστήστε PROJECT_ID για το έργο σας):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

Ενεργοποιήστε την υπηρεσία GKE και δημιουργήστε ένα σύμπλεγμα με πρόσθετα HPA και Istio:

gcloud services enable container.googleapis.com
K8S_VERSION=$(gcloud beta container get-server-config --format=json | jq -r '.validMasterVersions[0]')
gcloud beta container clusters create istio 
--cluster-version=${K8S_VERSION} 
--zone=us-central1-a 
--num-nodes=2 
--machine-type=n1-standard-2 
--disk-size=30 
--enable-autorepair 
--no-enable-cloud-logging 
--no-enable-cloud-monitoring 
--addons=HorizontalPodAutoscaling,Istio 
--istio-config=auth=MTLS_PERMISSIVE

Η παραπάνω εντολή θα δημιουργήσει μια προεπιλεγμένη ομάδα κόμβων που θα αποτελείται από δύο VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, δίσκος: 30 GB). Στην ιδανική περίπτωση, τα στοιχεία Istio θα πρέπει να απομονώνονται από τον φόρτο εργασίας τους, αλλά δεν υπάρχει εύκολος τρόπος να εκτελεστούν τα pods Istio σε μια ειδική ομάδα κόμβων. Οι δηλώσεις Istio θεωρούνται μόνο για ανάγνωση και το GKE θα επαναφέρει οποιεσδήποτε αλλαγές, όπως σύνδεση σε έναν κόμβο ή αποσύνδεση από μια ομάδα.

Ρύθμιση διαπιστευτηρίων για kubectl:

gcloud container clusters get-credentials istio

Δημιουργία δέσμευσης ρόλου διαχειριστή συμπλέγματος:

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

Εγκαταστήστε το εργαλείο γραμμής εντολών Πηδάλιο:

brew install kubernetes-helm

Το Homebrew 2.0 είναι πλέον διαθέσιμο και για Linux.

Δημιουργία λογαριασμού υπηρεσίας και δεσμευτικού ρόλου συμπλέγματος για το Tiller:

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

Αναπτύξτε το Tiller στον χώρο ονομάτων kube-system:

helm init --service-account tiller

Θα πρέπει να εξετάσετε το ενδεχόμενο χρήσης SSL μεταξύ Helm και Tiller. Για περισσότερες πληροφορίες σχετικά με την προστασία της εγκατάστασης του κράνους, βλ docs.helm.sh

Επιβεβαίωση ρυθμίσεων:

kubectl -n istio-system get svc

Μετά από λίγα δευτερόλεπτα, το GCP θα πρέπει να εκχωρήσει μια εξωτερική διεύθυνση IP στην υπηρεσία istio-ingressgateway.

Εγκατάσταση πύλης εισόδου στο Ιστιο

Δημιουργήστε μια στατική διεύθυνση IP με το όνομα istio-gatewayχρησιμοποιώντας τη διεύθυνση IP της πύλης Istio:

export GATEWAY_IP=$(kubectl -n istio-system get svc/istio-ingressgateway -ojson | jq -r .status.loadBalancer.ingress[0].ip)
gcloud compute addresses create istio-gateway --addresses ${GATEWAY_IP} --region us-central1

Τώρα χρειάζεστε έναν τομέα Διαδικτύου και πρόσβαση στο μητρώο καταχώρισης DNS. Προσθέστε δύο εγγραφές A (αντικαταστήστε example.com στον τομέα σας):

istio.example.com   A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}

Βεβαιωθείτε ότι ο μπαλαντέρ DNS λειτουργεί:

watch host test.istio.example.com

Δημιουργήστε μια γενική πύλη Istio για την παροχή υπηρεσιών εκτός του πλέγματος υπηρεσιών μέσω HTTP:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: public-gateway
  namespace: istio-system
spec:
  selector:
    istio: ingressgateway
  servers:
    - port:
        number: 80
        name: http
        protocol: HTTP
      hosts:
        - "*"

Αποθηκεύστε τον παραπάνω πόρο ως public-gateway.yaml και, στη συνέχεια, εφαρμόστε τον:

kubectl apply -f ./public-gateway.yaml

Κανένα σύστημα παραγωγής δεν πρέπει να παρέχει υπηρεσίες στο Διαδίκτυο χωρίς SSL. Για να ασφαλίσετε την πύλη εισόδου Istio με το cert-manager, το CloudDNS και το Let's Encrypt, διαβάστε τεκμηρίωση Σημαιοφόρος Γ.Κ.Ε.

Εγκατάσταση σημαίας

Το πρόσθετο GKE Istio δεν περιλαμβάνει την παρουσία Prometheus που εκκαθαρίζει την υπηρεσία τηλεμετρίας Istio. Εφόσον το Flagger χρησιμοποιεί μετρήσεις Istio HTTP για την εκτέλεση ανάλυσης καναρίνι, πρέπει να αναπτύξετε την ακόλουθη διαμόρφωση Prometheus, παρόμοια με αυτή που συνοδεύει το επίσημο σχήμα Istio Helm.

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml

Προσθέστε το αποθετήριο Flagger Helm:

helm repo add flagger [https://flagger.app](https://flagger.app/)

Αναπτύξτε το Flagger σε χώρο ονομάτων istio-systemενεργοποιώντας τις ειδοποιήσεις Slack:

helm upgrade -i flagger flagger/flagger 
--namespace=istio-system 
--set metricsServer=http://prometheus.istio-system:9090 
--set slack.url=https://hooks.slack.com/services/YOUR-WEBHOOK-ID 
--set slack.channel=general 
--set slack.user=flagger

Μπορείτε να εγκαταστήσετε το Flagger σε οποιοδήποτε χώρο ονομάτων, εφόσον μπορεί να επικοινωνεί με την υπηρεσία Istio Prometheus στη θύρα 9090.

Το Flagger διαθέτει ταμπλό Grafana για ανάλυση καναρινιών. Εγκαταστήστε το Grafana στον χώρο ονομάτων istio-system:

helm upgrade -i flagger-grafana flagger/grafana 
--namespace=istio-system 
--set url=http://prometheus.istio-system:9090 
--set user=admin 
--set password=change-me

Εκθέστε το Grafana μέσω μιας ανοιχτής πύλης δημιουργώντας μια εικονική υπηρεσία (αντικαταστήστε example.com στον τομέα σας):

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: grafana
  namespace: istio-system
spec:
  hosts:
    - "grafana.istio.example.com"
  gateways:
    - public-gateway.istio-system.svc.cluster.local
  http:
    - route:
        - destination:
            host: flagger-grafana

Αποθηκεύστε τον παραπάνω πόρο ως grafana-virtual-service.yaml και, στη συνέχεια, εφαρμόστε τον:

kubectl apply -f ./grafana-virtual-service.yaml

Όταν πρόκειται να http://grafana.istio.example.com Το πρόγραμμα περιήγησής σας θα πρέπει να σας ανακατευθύνει στη σελίδα σύνδεσης Grafana.

Ανάπτυξη εφαρμογών Ιστού με το Flagger

Το Flagger αναπτύσσει το Kubernetes και, εάν είναι απαραίτητο, την οριζόντια αυτόματη κλιμάκωση (HPA), στη συνέχεια δημιουργεί μια σειρά αντικειμένων (αναπτύξεις Kubernetes, υπηρεσίες ClusterIP και εικονικές υπηρεσίες Istio). Αυτά τα αντικείμενα εκθέτουν την εφαρμογή στο πλέγμα υπηρεσιών και διαχειρίζονται την ανάλυση και την προώθηση καναρινιών.

Αυτόματες αναπτύξεις καναρινιών με Flagger και Istio

Δημιουργήστε έναν δοκιμαστικό χώρο ονομάτων με ενεργοποιημένη την υλοποίηση Istio Sidecar:

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml

Δημιουργήστε μια ανάπτυξη και ένα εργαλείο αυτόματης οριζόντιας κλίμακας για το pod:

kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml

Αναπτύξτε μια υπηρεσία δοκιμής φορτίου για τη δημιουργία κίνησης κατά την ανάλυση καναρινιών:

helm upgrade -i flagger-loadtester flagger/loadtester 
--namepace=test

Δημιουργήστε έναν προσαρμοσμένο πόρο καναρίνι (αντικαταστήστε example.com στον τομέα σας):

apiVersion: flagger.app/v1alpha3
kind: Canary
metadata:
  name: podinfo
  namespace: test
spec:
  targetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: podinfo
  progressDeadlineSeconds: 60
  autoscalerRef:
    apiVersion: autoscaling/v2beta1
    kind: HorizontalPodAutoscaler
    name: podinfo
  service:
    port: 9898
    gateways:
    - public-gateway.istio-system.svc.cluster.local
    hosts:
    - app.istio.example.com
  canaryAnalysis:
    interval: 30s
    threshold: 10
    maxWeight: 50
    stepWeight: 5
    metrics:
    - name: istio_requests_total
      threshold: 99
      interval: 30s
    - name: istio_request_duration_seconds_bucket
      threshold: 500
      interval: 30s
    webhooks:
      - name: load-test
        url: http://flagger-loadtester.test/
        timeout: 5s
        metadata:
          cmd: "hey -z 1m -q 10 -c 2 http://podinfo.test:9898/"

Αποθηκεύστε τον παραπάνω πόρο ως podinfo-canary.yaml και μετά εφαρμόστε τον:

kubectl apply -f ./podinfo-canary.yaml

Η παραπάνω ανάλυση, εάν είναι επιτυχής, θα εκτελεστεί για πέντε λεπτά, ελέγχοντας τις μετρήσεις HTTP κάθε μισό λεπτό. Μπορείτε να προσδιορίσετε τον ελάχιστο χρόνο που απαιτείται για να δοκιμάσετε και να προωθήσετε την ανάπτυξη ενός καναρινιού χρησιμοποιώντας τον ακόλουθο τύπο: interval * (maxWeight / stepWeight). Τα πεδία CRD Canary είναι τεκμηριωμένα εδώ.

Μετά από μερικά δευτερόλεπτα, το Flagger θα δημιουργήσει αντικείμενα καναρίνι:

# applied 
deployment.apps/podinfo
horizontalpodautoscaler.autoscaling/podinfo
canary.flagger.app/podinfo
# generated 
deployment.apps/podinfo-primary
horizontalpodautoscaler.autoscaling/podinfo-primary
service/podinfo
service/podinfo-canary
service/podinfo-primary
virtualservice.networking.istio.io/podinfo

Ανοίξτε το πρόγραμμα περιήγησής σας και μεταβείτε στο app.istio.example.com, θα πρέπει να δείτε τον αριθμό έκδοσης εφαρμογές επίδειξης.

Αυτόματη ανάλυση και προώθηση καναρινιών

Το Flagger εφαρμόζει έναν βρόχο ελέγχου που μετακινεί σταδιακά την επισκεψιμότητα στο καναρίνι ενώ μετράει βασικούς δείκτες απόδοσης, όπως το ποσοστό επιτυχίας αιτημάτων HTTP, τη μέση διάρκεια αιτήματος και την υγεία του pod. Με βάση την ανάλυση KPI, το καναρίνι προωθείται ή τερματίζεται και τα αποτελέσματα της ανάλυσης δημοσιεύονται στο Slack.

Αυτόματες αναπτύξεις καναρινιών με Flagger και Istio

Η ανάπτυξη Canary ενεργοποιείται όταν αλλάξει ένα από τα ακόλουθα αντικείμενα:

  • Ανάπτυξη PodSpec (εικόνα κοντέινερ, εντολή, θύρες, env, κ.λπ.)
  • Τα ConfigMaps προσαρτώνται ως τόμοι ή μετατρέπονται σε μεταβλητές περιβάλλοντος
  • Τα μυστικά τοποθετούνται ως τόμοι ή μετατρέπονται σε μεταβλητές περιβάλλοντος

Εκτελέστε την ανάπτυξη καναρίνι κατά την ενημέρωση της εικόνας του κοντέινερ:

kubectl -n test set image deployment/podinfo 
podinfod=quay.io/stefanprodan/podinfo:1.4.1

Το Flagger εντοπίζει ότι η έκδοση ανάπτυξης έχει αλλάξει και αρχίζει να την αναλύει:

kubectl -n test describe canary/podinfo

Events:

New revision detected podinfo.test
Scaling up podinfo.test
Waiting for podinfo.test rollout to finish: 0 of 1 updated replicas are available
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Advance podinfo.test canary weight 20
Advance podinfo.test canary weight 25
Advance podinfo.test canary weight 30
Advance podinfo.test canary weight 35
Advance podinfo.test canary weight 40
Advance podinfo.test canary weight 45
Advance podinfo.test canary weight 50
Copying podinfo.test template spec to podinfo-primary.test
Waiting for podinfo-primary.test rollout to finish: 1 of 2 updated replicas are available
Promotion completed! Scaling down podinfo.test

Κατά τη διάρκεια της ανάλυσης, τα αποτελέσματα των καναρίνι μπορούν να παρακολουθηθούν χρησιμοποιώντας το Grafana:

Αυτόματες αναπτύξεις καναρινιών με Flagger και Istio

Σημειώστε: εάν εφαρμοστούν νέες αλλαγές στην ανάπτυξη κατά την ανάλυση καναρίνι, το Flagger θα επανεκκινήσει τη φάση ανάλυσης.

Κάντε μια λίστα με όλα τα καναρίνια στο σύμπλεγμα σας:

watch kubectl get canaries --all-namespaces
NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
test        podinfo   Progressing   15       2019-01-16T14:05:07Z
prod        frontend  Succeeded     0        2019-01-15T16:15:07Z
prod        backend   Failed        0        2019-01-14T17:05:07Z

Εάν έχετε ενεργοποιήσει τις ειδοποιήσεις Slack, θα λάβετε τα ακόλουθα μηνύματα:

Αυτόματες αναπτύξεις καναρινιών με Flagger και Istio

Αυτόματη επαναφορά

Κατά τη διάρκεια της ανάλυσης καναρινιών, μπορείτε να δημιουργήσετε συνθετικά σφάλματα HTTP 500 και υψηλή καθυστέρηση απόκρισης για να ελέγξετε εάν το Flagger θα σταματήσει την ανάπτυξη.

Δημιουργήστε μια ομάδα δοκιμής και κάντε τα εξής σε αυτήν:

kubectl -n test run tester 
--image=quay.io/stefanprodan/podinfo:1.2.1 
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx sh

Δημιουργία σφαλμάτων HTTP 500:

watch curl http://podinfo-canary:9898/status/500

Καθυστέρηση δημιουργίας:

watch curl http://podinfo-canary:9898/delay/1

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

Τα σφάλματα Canary και οι αιχμές καθυστέρησης καταγράφονται ως συμβάντα Kubernetes και καταγράφονται από το Flagger σε μορφή JSON:

kubectl -n istio-system logs deployment/flagger -f | jq .msg

Starting canary deployment for podinfo.test
Advance podinfo.test canary weight 5
Advance podinfo.test canary weight 10
Advance podinfo.test canary weight 15
Halt podinfo.test advancement success rate 69.17% < 99%
Halt podinfo.test advancement success rate 61.39% < 99%
Halt podinfo.test advancement success rate 55.06% < 99%
Halt podinfo.test advancement success rate 47.00% < 99%
Halt podinfo.test advancement success rate 37.00% < 99%
Halt podinfo.test advancement request duration 1.515s > 500ms
Halt podinfo.test advancement request duration 1.600s > 500ms
Halt podinfo.test advancement request duration 1.915s > 500ms
Halt podinfo.test advancement request duration 2.050s > 500ms
Halt podinfo.test advancement request duration 2.515s > 500ms
Rolling back podinfo.test failed checks threshold reached 10
Canary failed! Scaling down podinfo.test

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

Αυτόματες αναπτύξεις καναρινιών με Flagger και Istio

Εν κατακλείδι

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

Το Flagger είναι συμβατό με οποιαδήποτε λύση CI/CD για Kubernetes και η ανάλυση καναρινιών μπορεί εύκολα να επεκταθεί με webhooks για την εκτέλεση δοκιμών ενοποίησης/αποδοχής συστήματος, δοκιμών φόρτωσης ή οποιωνδήποτε άλλων προσαρμοσμένων δοκιμών. Επειδή το Flagger είναι δηλωτικό και ανταποκρίνεται σε συμβάντα Kubernetes, μπορεί να χρησιμοποιηθεί σε αγωγούς GitOps μαζί με Ροή ύφανσης ή Τζένκινς. Εάν χρησιμοποιείτε το JenkinsX, μπορείτε να εγκαταστήσετε το Flagger με πρόσθετα jx.

Υποστηρίζεται το Flagger Υφαντουργία και παρέχει αναπτύξεις καναρινιών σε Weave Cloud. Το έργο είναι δοκιμασμένο σε GKE, EKS και γυμνό μέταλλο με kubeadm.

Εάν έχετε προτάσεις για τη βελτίωση του Flagger, υποβάλετε ένα ζήτημα ή PR στο GitHub στη διεύθυνση stefanprodan/flagger. Οι συνεισφορές είναι περισσότερο από ευπρόσδεκτες!

σας ευχαριστώ Ρέι Τσάνγκ.

Πηγή: www.habr.com

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