CD gëtt als Enterprise Software Praxis unerkannt an ass d'Resultat vun enger natierlecher Evolutioun vun etabléierten CI Prinzipien. Wéi och ëmmer, CD ass nach ëmmer zimlech seelen, vläicht wéinst der Komplexitéit vun der Gestioun an der Angscht vu gescheiterten Deployementer déi d'Systemverfügbarkeet beaflossen.
Drënner ass e Schrëtt fir Schrëtt Guide fir Flagger op Google Kubernetes Engine (GKE) opzestellen an ze benotzen.
E Kubernetes Cluster opbauen
Dir fänkt un mat engem GKE Cluster mam Istio Add-on ze kreéieren (wann Dir kee GCP Kont hutt, kënnt Dir Iech umellen
Mellt Iech bei Google Cloud un, erstellt e Projet an aktivéiert d'Rechnung dofir. Installéiert de Kommandozeil Utility gcloud init
.
Setzt Standardprojet, Berechnungsgebitt an Zone (ersetzen PROJECT_ID
fir Äre Projet):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Aktivéiert de GKE Service a kreéiert e Cluster mat HPA an Istio Add-ons:
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
Deen uewe genannte Kommando erstellt e Standard Node Pool mat zwee VMs n1-standard-2
(vCPU: 2, RAM 7,5 GB, Scheif: 30 GB). Idealerweis sollt Dir Istio Komponenten vun Ären Aarbechtslaascht isoléieren, awer et gëtt keen einfache Wee fir Istio Pods an engem dedizéierten Pool vun Noden ze lafen. Istio Manifester ginn als Lies-nëmmen ugesinn an GKE wäert all Ännerunge réckgängeg maachen, sou wéi d'Verbindung mat engem Node oder d'Ofdreiwung vun engem Pod.
Ariichten Umeldungsinformatiounen fir kubectl
:
gcloud container clusters get-credentials istio
Erstellt eng Cluster Administrator Rollverbindung:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Installéiert de Kommandozeil Tool
brew install kubernetes-helm
Homebrew 2.0 ass elo och verfügbar fir
Erstellt e Servicekonto a Clusterrollbindung fir Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Erweideren Tiller am Nummraum kube-system
:
helm init --service-account tiller
Dir sollt iwwerleeën SSL tëscht Helm an Tiller ze benotzen. Fir méi Informatiounen iwwer Är Helm Installatioun ze schützen, kuckt
Confirméieren Astellungen:
kubectl -n istio-system get svc
No e puer Sekonnen soll GCP eng extern IP Adress fir de Service zouginn istio-ingressgateway
.
D'Istio Ingress Gateway konfiguréieren
Erstellt eng statesch IP Adress mat engem Numm istio-gateway
benotzt d'IP Adress vum Istio Gateway:
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
Elo braucht Dir en Internet Domain an Zougang zu Ärem DNS Registrar. Füügt zwee A-Records derbäi (ersetzen example.com
op Är Domain):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Vergewëssert Iech datt d'DNS Wildcard funktionnéiert:
watch host test.istio.example.com
Erstellt e generesche Istio Paart fir Servicer ausserhalb vum Service Mesh iwwer HTTP ze bidden:
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:
- "*"
Späichert déi uewe genannte Ressource als public-gateway.yaml an gëlt se dann un:
kubectl apply -f ./public-gateway.yaml
Kee Produktiounssystem soll Servicer um Internet ouni SSL ubidden. Fir den Istio Ingress Gateway mat Certificat-Manager, CloudDNS a Let's Encrypt ze sécheren, liest w.e.g.
Flagger Installatioun
De GKE Istio Add-on enthält keng Prometheus Instanz déi den Istio Telemetrie Service botzt. Well Flagger Istio HTTP Metriken benotzt fir Kanaresch Analyse auszeféieren, musst Dir déi folgend Prometheus Konfiguratioun ofsetzen, ähnlech wéi déi, déi mam offiziellen Istio Helm Schema kënnt.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Füügt de Flagger Helm Repository:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Erweidert Flagger op Nummraum istio-system
andeems Dir Slack Notifikatiounen aktivéiert:
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
Dir kënnt Flagger an all Nummraum installéieren soulaang et mam Istio Prometheus Service um Hafen 9090 kommunizéiere kann.
Flagger huet e Grafana Dashboard fir Kanaresch Analyse. Installéiert Grafana am Nummraum 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
Exposéiert Grafana duerch en oppene Paart andeems Dir e virtuelle Service erstellt (ersetzen example.com
op Är Domain):
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
Späichert déi uewe genannte Ressource als grafana-virtual-service.yaml an gëlt se dann un:
kubectl apply -f ./grafana-virtual-service.yaml
Wann Plënneren op http://grafana.istio.example.com
am Browser, Dir sollt op d'Grafana Login Säit geleet ginn.
Webapplikatioune mat Flagger ofsetzen
Flagger deployéiert Kubernetes an scales optional automatesch (HPA), erstellt dann eng Serie vun Objeten (Kubernetes Deployment, ClusterIP Servicer, an Istio virtuell Servicer). Dës Objeten aussetzt d'Applikatioun dem Service Mesh a Kontroll Kanaresch Analyse a Fortschrëtt.
Erstellt en Testnummraum mat Istio Sidecar Injektioun aktivéiert:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Erstellt en Deployment an e Pod Auto Skala Tool:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Deploy en Testload-Service fir Traffic während der Kanaresch Analyse ze generéieren:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Erstellt eng personaliséiert Kanaresch Ressource (ersetzen example.com
op Är Domain):
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/"
Späichert déi uewe genannte Ressource als podinfo-canary.yaml an gëlt se dann un:
kubectl apply -f ./podinfo-canary.yaml
Déi uewe genannte Analyse, wann et erfollegräich ass, leeft fir fënnef Minutten, kontrolléiert HTTP Metriken all hallef Minutt. Dir kënnt d'Mindestzäit bestëmmen déi néideg ass fir eng Kanaresch Deployment ze validéieren an ze förderen mat der folgender Formel: interval * (maxWeight / stepWeight)
. Kanaresch CRD Felder sinn dokumentéiert
No e puer Sekonnen erstellt Flagger Kanaresch Objeten:
# 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
Öffnen e Browser a gitt op app.istio.example.com
, Dir sollt d'Versiounsnummer gesinn
Automatesch Kanaresch Analyse a Promotioun
Flagger implementéiert eng Kontrollschleife déi lues a lues de Traffic op de Kanaresch beweegt wärend Schlësselleistungsmetriken wéi HTTP-Ufro Erfollegsquote, duerchschnëttlech Ufro-Dauer a Pod-Gesondheet gemooss ginn. Baséierend op der KPI Analyse gëtt de Kanaresch gefördert oder ënnerbrach, an d'Resultater vun der Analyse ginn op Slack publizéiert.
Kanaresch Deployment gëtt ausgeléist wann ee vun de folgenden Objeten ännert:
- Deploy PodSpec (Containerbild, Kommando, Ports, Env, etc.)
- ConfigMaps ginn als Volumen montéiert oder op Ëmfeldvariablen kartéiert
- Geheimnisser ginn als Bänn montéiert oder an Ëmfeldvariablen ëmgewandelt
Run Canary Deploy wann Dir e Containerbild aktualiséiert:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger erkennt datt d'Deployment Versioun geännert huet a fänkt se un:
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
Wärend der Analyse kënne Kanaresch Resultater mat Grafana verfollegt ginn:
Notéiert w.e.g. datt wann nei Ännerungen op eng Deployment während der Kanaresch Analyse applizéiert ginn, da wäert Flagger d'Analysephase nei starten.
Maacht eng Lëscht vun all Kanaren an Ärem Cluster:
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
Wann Dir Slack Notifikatiounen aktivéiert hutt, kritt Dir déi folgend Messagen:
Automatesch Réckroll
Wärend der Kanaresch Analyse kënnt Dir synthetesch HTTP 500 Fehler an héich Äntwertlatenz generéieren fir ze kucken ob Flagger d'Deployment stoppt.
Erstellt en Testpod a maacht déi folgend dran:
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
Generéiere HTTP 500 Feeler:
watch curl http://podinfo-canary:9898/status/500
Verzögerung Generatioun:
watch curl http://podinfo-canary:9898/delay/1
Wann d'Zuel vun de gescheiterte Kontrollen d'Schwell erreecht, gëtt de Verkéier zréck an de primäre Kanal geréckelt, de Kanaresch gëtt op Null skaléiert, an d'Deployment gëtt als gescheitert markéiert.
Kanaresch Feeler a latency Peaks ginn als Kubernetes Eventer protokolléiert a vum Flagger am JSON Format protokolléiert:
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
Wann Dir Slack Notifikatiounen aktivéiert hutt, kritt Dir e Message wann d'Deadline iwwerschratt ass oder d'maximal Unzuel vu gescheiterte Kontrollen an der Analyse erreecht gëtt:
Conclusioun
E Service Mesh wéi Istio auszeféieren nieft Kubernetes wäert automatesch Metriken, Logbicher a Protokoller ubidden, awer d'Aarbechtslaaschtdeployment hänkt nach ëmmer vun externen Tools of. Flagger zielt dëst z'änneren andeems Dir Istio Fäegkeeten bäidréit
Flagger ass kompatibel mat all Kubernetes CI / CD Léisung, a Kanaresch Analyse kann einfach verlängert ginn
Flagger ënnerstëtzt
Wann Dir Suggestioune hutt fir Flagger ze verbesseren, gitt w.e.g. en Thema oder PR op GitHub bei
Spass
Source: will.com