Automatesch Kanaresch Deployementer mat Flagger an Istio

Automatesch Kanaresch Deployementer mat Flagger an Istio

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.

flagger ass en Open Source Kubernetes Bedreiwer deen zielt fir konfus Bezéiungen ze eliminéieren. Et automatiséiert d'Promotioun vu Kanaresch Deployementer mat Istio Traffic Offset a Prometheus Metriken fir d'Applikatiounsverhalen während enger verwalteter Rollout ze analyséieren.

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 hei - fir gratis Credits ze kréien).

Mellt Iech bei Google Cloud un, erstellt e Projet an aktivéiert d'Rechnung dofir. Installéiert de Kommandozeil Utility gcloud an Ariichten Äre Projet mat 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 Helm:

brew install kubernetes-helm

Homebrew 2.0 ass elo och verfügbar fir Linux.

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 docs.helm.sh

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-gatewaybenotzt 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. Dokumentatioun Flagger G.K.E.

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-systemandeems 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.

Automatesch Kanaresch Deployementer mat Flagger an Istio

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 hei.

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 Demo Apps.

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.

Automatesch Kanaresch Deployementer mat Flagger an Istio

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:

Automatesch Kanaresch Deployementer mat Flagger an Istio

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 Kanaresch Deployementer mat Flagger an Istio

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:

Automatesch Kanaresch Deployementer mat Flagger an Istio

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 progressiv Liwwerung.

Flagger ass kompatibel mat all Kubernetes CI / CD Léisung, a Kanaresch Analyse kann einfach verlängert ginn webhooks fir Systemintegratioun / Akzeptanz Tester, Laaschtester oder all aner personaliséiert Kontrollen auszeféieren. Zënter Flagger deklarativ ass an op Kubernetes Eventer reagéiert, kann et a GitOps Pipelines zesumme mat Weave Flux oder Jenkins X. Wann Dir JenkinsX benotzt, kënnt Dir Flagger mat jx Addons installéieren.

Flagger ënnerstëtzt Weaveworks a stellt Kanaresch Deployementer an Weave Cloud. De Projet gëtt getest op GKE, EKS, a Bare Metal mat Kubeadm.

Wann Dir Suggestioune hutt fir Flagger ze verbesseren, gitt w.e.g. en Thema oder PR op GitHub bei stefanprodan/flagger. Beiträg si méi wéi wëllkomm!

Spass Ray Tsang.

Source: will.com

Setzt e Commentaire