Το CD αναγνωρίζεται ως πρακτική λογισμικού για επιχειρήσεις και αποτελεί φυσική εξέλιξη των καθιερωμένων αρχών CI. Ωστόσο, το CD εξακολουθεί να είναι αρκετά σπάνιο, ίσως λόγω της πολυπλοκότητας της διαχείρισης και του φόβου για αποτυχημένες αναπτύξεις που επηρεάζουν τη διαθεσιμότητα του συστήματος.
Ακολουθεί ένας οδηγός βήμα προς βήμα για τη ρύθμιση και τη χρήση του Flagger στο Google Kubernetes Engine (GKE).
Ρύθμιση ενός συμπλέγματος Kubernetes
Ξεκινάτε δημιουργώντας ένα σύμπλεγμα GKE με το πρόσθετο Istio (αν δεν έχετε λογαριασμό GCP, μπορείτε να εγγραφείτε
Συνδεθείτε στο Google Cloud, δημιουργήστε ένα έργο και ενεργοποιήστε τη χρέωση για αυτό. Εγκαταστήστε το βοηθητικό πρόγραμμα γραμμής εντολών 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 είναι πλέον διαθέσιμο και για
Δημιουργία λογαριασμού υπηρεσίας και δεσμευτικού ρόλου συμπλέγματος για το 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. Για περισσότερες πληροφορίες σχετικά με την προστασία της εγκατάστασης του κράνους, βλ
Επιβεβαίωση ρυθμίσεων:
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). Αυτά τα αντικείμενα εκθέτουν την εφαρμογή στο πλέγμα υπηρεσιών και διαχειρίζονται την ανάλυση και την προώθηση καναρινιών.
Δημιουργήστε έναν δοκιμαστικό χώρο ονομάτων με ενεργοποιημένη την υλοποίηση 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.
Η ανάπτυξη 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 θα επανεκκινήσει τη φάση ανάλυσης.
Κάντε μια λίστα με όλα τα καναρίνια στο σύμπλεγμα σας:
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, θα λάβετε τα ακόλουθα μηνύματα:
Αυτόματη επαναφορά
Κατά τη διάρκεια της ανάλυσης καναρινιών, μπορείτε να δημιουργήσετε συνθετικά σφάλματα 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, θα λάβετε ένα μήνυμα όταν ξεπεραστεί η προθεσμία για την ολοκλήρωση ή την επίτευξη του μέγιστου αριθμού αποτυχημένων κριτικών σε μια ανάλυση:
Εν κατακλείδι
Η εκτέλεση ενός πλέγματος υπηρεσιών όπως το Istio πάνω από το Kubernetes θα παρέχει αυτόματες μετρήσεις, αρχεία καταγραφής και αρχεία καταγραφής, αλλά η ανάπτυξη φόρτου εργασίας εξακολουθεί να εξαρτάται από εξωτερικά εργαλεία. Το Flagger στοχεύει να το αλλάξει αυτό προσθέτοντας δυνατότητες Istio
Το Flagger είναι συμβατό με οποιαδήποτε λύση CI/CD για Kubernetes και η ανάλυση καναρινιών μπορεί εύκολα να επεκταθεί με
Υποστηρίζεται το Flagger
Εάν έχετε προτάσεις για τη βελτίωση του Flagger, υποβάλετε ένα ζήτημα ή PR στο GitHub στη διεύθυνση
σας ευχαριστώ
Πηγή: www.habr.com