
CD er anerkendt som en praksis inden for virksomhedens software og er resultatet af en naturlig evolution af etablerede CI-principper. Dog er CD stadig en ret sjælden forekomst, muligvis på grund af kompleksiteten ved at administrere og frygten for mislykkede udrulninger, der påvirker systemets tilgængelighed.
er en open source Kubernetes-operatør, hvis mål er at fjerne forvirrende sammenhænge. Den automatiserer udrulningen af canary-udrulninger ved at bruge Istios trafikfordeling og Prometheus-metrikker til at analysere applikationens opførsel under en kontrolleret udrulning.
Nedenfor er en trin-for-trin vejledning til opsætning og brug af Flagger i Google Kubernetes Engine (GKE).
Opsætning af Kubernetes-kluster
Du starter med at oprette et GKE-kluster med Istio-tilføjelsen (hvis du ikke har en GCP-konto, kan du tilmelde dig for at få gratis kreditter).
Log ind på Google Cloud, opret et projekt og aktiver fakturering for det. Installer kommandolinje-værktøjet og konfigurer dit projekt med gcloud init.
Indstil standardprojektet, compute-region og -zone (erstat PROJECT_ID med dit projekt):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-aAktiver GKE-tjenesten og opret et kluster med HPA og Istio-tilføjelser:
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_PERMISSIVEDen ovenstående kommando vil skabe en standard nodpulje, der inkluderer to VM'er n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideelt set bør Istio-komponenterne isoleres fra deres arbejdsbelastninger, men der findes ikke en enkel måde at køre Istio-pods på i en dedikeret nodpulje. Istios manifester anses for at være kun læselige, og GKE vil annullere eventuelle ændringer, såsom bindning til en node eller afkobling fra en pod.
Konfigurer legitimationsoplysninger for kubectl:
gcloud container clusters get-credentials istioOpret en cluster-administrator rollebindning:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Installer kommandolinjeværktøjet :
brew install kubernetes-helmHomebrew 2.0 er nu også tilgængeligt for .
Opret en tjenestekonto og bind en clusterrolle til Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerUdrul Tiller i navnerummet kube-system:
helm init --service-account tillerDu bør overveje at bruge SSL mellem Helm og Tiller. For mere information om at sikre Helm-installationen, se
Bekræft indstillingerne:
kubectl -n istio-system get svcEfter et par sekunder skal GCP tildele en offentlig IP-adresse til tjenesten istio-ingressgateway.
Konfigurer Istio indgangsgateway
Opret en statisk IP-adresse med navnet istio-gateway, ved hjælp af IP-adressen for 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-central1Nu har du brug for et internetdomæne og adgang til din DNS-registrator. Tilføj to A-poster (erstat example.com med dit domæne):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Sørg for, at wildcard DNS fungerer:
watch host test.istio.example.comOpret en offentlig Istio-gateway til at levere tjenester uden for 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:
- "*"Gem ovenstående ressource som public-gateway.yaml og anvend den derefter:
kubectl apply -f ./public-gateway.yamlIngen produktionssystemer bør levere tjenester på internettet uden SSL. For at sikre Istio indgangsgatewayen med cert-manager, CloudDNS og Let’s Encrypt, se venligst Flagger GKE.
Installation af Flagger
GKE Istio opgradering inkluderer ikke en instance af Prometheus, som håndterer rensningen af Istio telemetritjenester. Da Flagger bruger Istio HTTP-metrikker til at udføre canary-analyse, skal du udrulle følgende Prometheus-konfiguration, som svarer til den, der følger med den officielle Istio Helm skema.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlTilføj Flagger Helm-repositoriet:
helm repo add flagger [https://flagger.app](https://flagger.app/)Udrul Flagger i navnerummet istio-system, med Slack-meddelelser:
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 installere Flagger i ethvert navnerum, hvis det kan interagere med Istio Prometheus-tjenesten via port 9090.
Flagger har et Grafana-dashboard til canary-analyse. Installer Grafana i navnerummet 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Åbn Grafana gennem den åbne gateway ved at oprette en virtuel tjeneste (erstat example.com med dit domæne):
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-grafanaGem ovenstående ressource som grafana-virtual-service.yaml, og anvend den derefter:
kubectl apply -f ./grafana-virtual-service.yamlNår du navigerer til http://grafana.istio.example.com bør du blive omdirigeret til login-siden for Grafana.
Udrulning af webapplikationer med Flagger
Flagger udruller Kubernetes og, om nødvendigt, horisontal automatisk skalering (HPA), og opretter derefter en sekvens af objekter (Kubernetes-deployments, ClusterIP-tjenester og Istio-virtuelle tjenester). Disse objekter gør applikationen synlig i servicenetværket og håndterer canary-analyse og fremdrift.
Opret et testnavnerum med aktiveret Istio Sidecar-implementering:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlOpret en deployment og en automatisk horisontal skalering for pod:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlUdrul en testbelastningstjeneste for at generere trafik under canary-analysen:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testOpret en brugerdefineret canary-ressource (erstat example.com med dit domæne):
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/"Gem ovenstående ressource som podinfo-canary.yaml, og anvend den derefter:
kubectl apply -f ./podinfo-canary.yamlDen ovennævnte analyse, i tilfælde af succes, vil blive udført i fem minutter med kontrol af HTTP-metrikker hver halve minut. Du kan bestemme minimumstiden nødvendig for at validere og fremme canary-deployeringen med følgende formel: interval * (maxWeight / stepWeight). Felter Canary CRD dokumenteres .
Om et par sekunder vil Flagger oprette canary-objekter:
# 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Åbn browseren og gå til app.istio.example.com, du skal se versionsnummeret .
Automatisk canary-analyse og fremme
Flagger implementerer en styringscyklus, der gradvist flytter trafikken til canary, samtidig med at den måler nøglepræstationsindikatorer, såsom succesrate for HTTP-anmodninger, gennemsnitlig svartid og pods tilgængelighed. Baseret på KPI-analysen fremmes eller afbrydes canary, og analyse resultaterne offentliggøres i Slack.
Canary-udrulningen startes ved ændring af en af følgende objekter:
- Deployment PodSpec (containerbillede, kommando, porte, miljø osv.)
- ConfigMaps monteres som volumener eller transformeres til miljøvariabler
- Secrets monteres som volumener eller transformeres til miljøvariabler
Start canary-udrulningen ved opdatering af containerbilledet:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger opdager, at versionen af deployment er ændret og begynder at analysere den:
kubectl -n test describe canary/podinfo
Begivenheder:
Ny revision opdaget podinfo.test
Opdaterer podinfo.test
Venter på at podinfo.test udrulningen skal afsluttes: 0 af 1 opdaterede replikaer er tilgængelige
Fremgang podinfo.test canary vægt 5
Fremgang podinfo.test canary vægt 10
Fremgang podinfo.test canary vægt 15
Fremgang podinfo.test canary vægt 20
Fremgang podinfo.test canary vægt 25
Fremgang podinfo.test canary vægt 30
Fremgang podinfo.test canary vægt 35
Fremgang podinfo.test canary vægt 40
Fremgang podinfo.test canary vægt 45
Fremgang podinfo.test canary vægt 50
Kopiere podinfo.test skabelonspecifikation til podinfo-primary.test
Venter på at podinfo-primary.test udrulningen skal afsluttes: 1 af 2 opdaterede replikaer er tilgængelige
Fremme fuldført! Nedskalering af podinfo.testUnder analysen kan resultaterne af canary overvåges ved hjælp af Grafana:
Bemærk: Hvis nye ændringer anvendes til deployment under canary-analysen, vil Flagger genstarte analysefasen.
Lav en liste over alle "canaries" i din klynge:
watch kubectl get canaries --all-namespaces
NAMESPACE NAVN STATUS VÆGT SIDSTEOVERGANGSTID
test podinfo Fremskridter 15 2019-01-16T14:05:07Z
prod frontend Fuldført 0 2019-01-15T16:15:07Z
prod backend Fejlet 0 2019-01-14T17:05:07ZHvis du har aktiveret Slack-notifikationer, vil du modtage følgende beskeder:
Automatisk tilbagetrækning
Under canary-analysen kan der genereres syntetiske HTTP 500-fejl og høj svartid for at tjekke, om Flagger stopper deployment.
Opret en testpod og udfør følgende handling:
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 af HTTP 500-fejl:
watch curl http://podinfo-canary:9898/status/500Generering af forsinkelse:
watch curl http://podinfo-canary:9898/delay/1Når antallet af mislykkede kontroller når tærskelværdien, dirigeres trafikken tilbage til den primære kanal, canary skaleres ned til nul, og deploymentet bliver markeret som mislykket.
Canary-fejl og forsinkelsespidser registreres som Kubernetes-begivenheder og gemmes af Flagger i JSON-format:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Starter canary-deployment for podinfo.test
Fremdrift af podinfo.test canary-vægt 5
Fremdrift af podinfo.test canary-vægt 10
Fremdrift af podinfo.test canary-vægt 15
Stop podinfo.test fremdrift succesrate 69.17% < 99%
Stop podinfo.test fremdrift succesrate 61.39% < 99%
Stop podinfo.test fremdrift succesrate 55.06% < 99%
Stop podinfo.test fremdrift succesrate 47.00% < 99%
Stop podinfo.test fremdrift succesrate 37.00% 500ms
Stop podinfo.test fremdrift anmodningsvarighed 1.600s > 500ms
Stop podinfo.test fremdrift anmodningsvarighed 1.915s > 500ms
Stop podinfo.test fremdrift anmodningsvarighed 2.050s > 500ms
Stop podinfo.test fremdrift anmodningsvarighed 2.515s > 500ms
Ruller tilbage podinfo.test mislykkede kontroller tærskel nået 10
Canary mislykkedes! Skalerer ned podinfo.testHvis du har aktiveret Slack-notifikationer, vil du modtage en besked, når tærsklen for udførelsestid eller det maksimale antal mislykkede kontroller under analysen er overskredet:
Afslutningsvis
At køre en service mesh, som Istio, ud over Kubernetes, giver automatisk metrikker, logs og protokoller, men deployment af arbejdsbyrder afhænger stadig af eksterne værktøjer. Flagger stræber efter at ændre denne situation ved at tilføje Istio-kapaciteter .
Flagger er kompatibel med enhver CI/CD-løsning for Kubernetes, og canary-analysen kan nemt udvides med til at udføre systemintegration/acceptancetests, belastningstests eller enhver anden brugerdefineret kontrol. Da Flagger er deklarativ og reagerer på Kubernetes-begivenheder, kan den bruges i GitOps-pipelines sammen med eller . Hvis du bruger JenkinsX, kan du installere Flagger med jx-udvidelser.
Flagger understøttes af og muliggør canary-deployments i . Projektet testes på GKE, EKS og 'bare metal' med kubeadm.
Hvis du har forslag til forbedringer af Flagger, bedes du sende et spørgsmål eller PR til GitHub på . Bidrag er mere end velkomne!
Tak .
Kilde: habr.com
