
CD erkänns som en praktik inom företagsprogramvara; det är resultatet av en naturlig evolution av etablerade CI-principer. Trots det är CD fortfarande en ganska sällsynt förekomst, kanske på grund av svårigheten att hantera det och rädslan för misslyckade deploys som påverkar systemets tillgänglighet.
är en Kubernetes-operator med öppen källkod, vars mål är att undvika komplicerade beroenden. Den automatiserar främjandet av canary-deploys med användning av trafikskifte i Istio och Prometheus-metriker för att analysera applikationens beteende under en kontrollerad utrullning.
Nedan följer en steg-för-steg-guide för att konfigurera och använda Flagger i Google Kubernetes Engine (GKE).
Konfigurera Kubernetes-klustret
Du börjar med att skapa ett GKE-kluster med Istio-tillägg (om du inte har ett GCP-konto kan du registrera dig för att få gratis krediter).
Logga in på Google Cloud, skapa ett projekt och aktivera fakturering för det. Installera kommandoradsverktyget och ställ in ditt projekt med gcloud init.
Ställ in standardprojektet, beräkningsregionen och zonen (ersätt PROJECT_ID med ditt projekt):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-aAktivera GKE-tjänsten och skapa ett kluster med HPA och Istio-tillägg:
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_PERMISSIVEOvanstående kommando kommer att skapa en standard nodpool med två VM:ar n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Idealiskt bör komponenterna i Istio isoleras från sina arbetsbelastningar, men det finns inget enkelt sätt att köra Istio-pods i en dedikerad nodpool. Istios manifest anses vara skrivskyddade, och GKE kommer att avbryta eventuella ändringar, såsom nodbindning eller bortkoppling från en pod.
Konfigurera autentiseringsuppgifter för kubectl:
gcloud container clusters get-credentials istioSkapa en rollbindning för klusteradministratör:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Installera kommandoradsverktyget :
brew install kubernetes-helmHomebrew 2.0 är nu också tillgängligt för .
Skapa ett tjänstekonto och en klusterrollbindning för Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerDistribuera Tiller i namespace kube-system:
helm init --service-account tillerDu bör överväga att använda SSL mellan Helm och Tiller. För mer information om att skydda Helm-installationen, se
Bekräfta inställningarna:
kubectl -n istio-system get svcInom några sekunder bör GCP tilldela en extern IP-adress till tjänsten istio-ingressgateway.
Konfigurera Istios ingångsgateway
Skapa en statisk IP-adress med namnet istio-gateway, med hjälp av Istio-gatewayens IP-adress:
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-central1Nu behöver du en internetdomän och tillgång till din DNS-registrator. Lägg till två A-poster (ersätt example.com med din domän):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Säkerställ att wildcard-DNS fungerar:
watch host test.istio.example.comSkapa en offentlig Istio-gateway för att tillhandahålla tjänster utanför service mesh via 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:
- "*"Spara den ovanstående resursen som public-gateway.yaml och applicera den sedan:
kubectl apply -f ./public-gateway.yamlIngen produktionssystem bör tillhandahålla tjänster på Internet utan SSL. För att skydda Istios ingångsgateway med cert-manager, CloudDNS och Let’s Encrypt, läs vänligen Flagger GKE.
Installera Flagger
GKE Istio-upgrade inkluderar inte en Prometheus-instans som hanterar städningen av Istios telemetritjänster. Eftersom Flagger använder Istio HTTP-metrik för att utföra canary-analyser, behöver du distribuera följande Prometheus-konfiguration, liknande den som följer med den officiella Istio Helm-mallen.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlLägg till Flagger Helm-repo:
helm repo add flagger [https://flagger.app](https://flagger.app/)Distribuera Flagger i namespace istio-system, aktivera Slack-notifikationer:
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=flaggerDu kan installera Flagger i valfritt namespace, så länge det kan interagera med Istio Prometheus-tjänsten via port 9090.
Flagger har en Grafana-övervakningspanel för canary-analys. Installera Grafana i namnutrymmet 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Öppna Grafana via en offentlig gateway genom att skapa en virtuell tjänst (ersätt example.com med din domän):
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-grafanaSpara den ovanstående resursen som grafana-virtual-service.yaml och tillämpa den sedan:
kubectl apply -f ./grafana-virtual-service.yamlNär du går till http://grafana.istio.example.com i webbläsaren bör du dirigeras till inloggningssidan för Grafana.
Distribuering av webbtjänster med Flagger
Flagger distribuerar Kubernetes och, om nödvändigt, horisontell automatisk skalning (HPA), och skapar sedan en serie objekt (Kubernetes-deployment, ClusterIP-tjänster och Istio virtuella tjänster). Dessa objekt avslöjar applikationen i service mesh och hanterar canary-analys och distributionsprocessen.
Skapa ett testnamnutrymme med aktiverad Istio Sidecar-integration:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlSkapa en deployment och en pod automatiskt för horisontell skalning:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlDistribuera en testbelastningstjänst för att generera trafik under canary-analysen:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testSkapa en anpassad canary-resurs (ersätt example.com med din domän):
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/"Spara den ovanstående resursen som podinfo-canary.yaml och tillämpa den sedan:
kubectl apply -f ./podinfo-canary.yamlDen ovanstående analysen, vid framgång, kommer att pågå i fem minuter, med HTTP-metriker som kontrolleras var 30:e sekund. Du kan bestämma den minimala tiden som krävs för att kontrollera och avancera canary-distributionen enligt följande formel: interval * (maxWeight / stepWeight). Canary CRD-fälten dokumenteras .
Om några sekunder kommer Flagger att skapa canary-objekt:
# 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Öppna webbläsaren och gå till app.istio.example.com, du bör se versionsnumret .
Automatisk canary-analys och promotion
Flagger implementerar en styrcykel som gradvis flyttar trafik till canary samtidigt som den mäter nyckelprestandaindikatorer, såsom framgångsnivån för HTTP-förfrågningar, genomsnittlig svarstid och podens tillförlitlighet. Baserat på KPI-analysen avancerar eller avbryts canary, och analysresultaten publiceras i Slack.
Canary-deploy starten initieras vid ändring av något av följande objekt:
- Deploy PodSpec (containerns bild, kommandon, portar, env etc.)
- ConfigMaps monteras som volymer eller omvandlas till miljövariabler
- Hemligheter monteras som volymer eller omvandlas till miljövariabler
Starta canary-deploy vid uppdatering av containerbild:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger upptäcker att versionen av deploy har ändrats och börjar analysera:
kubectl -n test describe canary/podinfo
Händelser:
Ny revision detekterad podinfo.test
Höjer upp podinfo.test
Väntar på att podinfo.test rollout ska slutföras: 0 av 1 uppdaterade repliker är tillgängliga
Främja podinfo.test canary vikt 5
Främja podinfo.test canary vikt 10
Främja podinfo.test canary vikt 15
Främja podinfo.test canary vikt 20
Främja podinfo.test canary vikt 25
Främja podinfo.test canary vikt 30
Främja podinfo.test canary vikt 35
Främja podinfo.test canary vikt 40
Främja podinfo.test canary vikt 45
Främja podinfo.test canary vikt 50
Kopiera podinfo.test mall-spec till podinfo-primary.test
Väntar på att podinfo-primary.test rollout ska slutföras: 1 av 2 uppdaterade repliker är tillgängliga
Promotion slutförd! Sänker ner podinfo.testUnder analysen kan resultaten av canary spåras med Grafana:
Observera: om nya ändringar tillämpas på deploy under canary-analysen, kommer Flagger att starta om analysfasen.
Skapa en lista över alla "kanariefåglar" i din kluster:
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:07ZOm du har aktiverat Slack-notiser kommer du att få följande meddelanden:
Automatisk återställning
Under canary-analysen kan du generera syntetiska HTTP 500-fel och hög svarstid för att kontrollera om Flagger stoppar deploy.
Skapa en testpod och utför följande åtgärd i den:
kubectl -n test run tester
--image=quay.io/stefanprodan/podinfo:1.2.1
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx shGenerering av HTTP 500-fel:
watch curl http://podinfo-canary:9898/status/500Generering av fördröjning:
watch curl http://podinfo-canary:9898/delay/1När antalet misslyckade kontroller når en tröskel, dirigeras trafiken tillbaka till den primära kanalen, canary skalas ner till noll, och distributionen markeras som misslyckad.
Canary-fel och fördröjningsspikar registreras som Kubernetes-händelser och loggas av Flagger i JSON-format:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Startar canary-distribution för podinfo.test
Fortsätt podinfo.test canary-vikt 5
Fortsätt podinfo.test canary-vikt 10
Fortsätt podinfo.test canary-vikt 15
Avbryt podinfo.test framsteg framgångsgrad 69,17% < 99%
Avbryt podinfo.test framsteg framgångsgrad 61,39% < 99%
Avbryt podinfo.test framsteg framgångsgrad 55,06% < 99%
Avbryt podinfo.test framsteg framgångsgrad 47,00% < 99%
Avbryt podinfo.test framsteg framgångsgrad 37,00% < 99%
Avbryt podinfo.test framsteg begärningstid 1,515s > 500ms
Avbryt podinfo.test framsteg begärningstid 1,600s > 500ms
Avbryt podinfo.test framsteg begärningstid 1,915s > 500ms
Avbryt podinfo.test framsteg begärningstid 2,050s > 500ms
Avbryt podinfo.test framsteg begärningstid 2,515s > 500ms
Tillbaka rullning podinfo.test misslyckade kontroller tröskel nådd 10
Canary misslyckades! Skalning ner av podinfo.testOm du har aktiverat Slack-notifikationer får du ett meddelande när tidsgränsen överskrids eller det maximala antalet misslyckade kontroller uppnås under analysen:
Avslutningsvis
Att köra en service mesh, som Istio, ovanpå Kubernetes ger automatiska mått, loggar och protokoll, men distribution av arbetsbelastningar beror fortfarande på externa verktyg. Flagger strävar efter att förändra detta genom att lägga till Istio-möjligheter .
Flagger är kompatibel med alla CI/CD-lösningar för Kubernetes, och canary-analyser kan enkelt utvidgas med för att utföra systemintegrationstest, acceptanstest, belastningstest eller andra användarkontroller. Eftersom Flagger är deklarativt och reagerar på Kubernetes-händelser kan det användas i GitOps-flöden tillsammans med eller . Om du använder JenkinsX kan du installera Flagger med jx-tillägg.
Flagger stöds av och möjliggör canary-distributioner i . Projektet testas på GKE, EKS och "bare metal" med kubeadm.
Om du har förslag på förbättringar av Flagger, vänligen skicka en fråga eller PR på GitHub till . Bidrag är mer än välkomna!
Tack .
Källa: habr.com
