
CD wordt erkend als een praktijk voor bedrijfssoftware, dit is het resultaat van de natuurlijke evolutie van gevestigde CI-principes. CD blijft echter vrij zeldzaam, mogelijk vanwege de complexiteit van het beheer en de angst voor mislukte deploys die de beschikbaarheid van het systeem beĆÆnvloeden.
is een open-source Kubernetes-operator met als doel verwarrende afhankelijkheden te elimineren. Het automatiseert de promotie van canary-deploys door gebruik te maken van verkeerstoewijzing in Istio en metrics van Prometheus om het gedrag van de applicatie te analyseren tijdens een gecontroleerde uitrol.
Hieronder volgt een stapsgewijze handleiding voor het instellen en gebruiken van Flagger in Google Kubernetes Engine (GKE).
Kubernetes-cluster instellen
Begin met het maken van een GKE-cluster met de Istio-add-on (als je nog geen GCP-account hebt, kun je je aanmelden voor gratis tegoeden).
Log in op Google Cloud, maak een project aan en activeer facturering daarvoor. Installeer de commandoregeltool en configureer je project met gcloud init.
Stel het standaardproject, de compute-regio en de zone in (vervang PROJECT_ID door jouw project):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-aSchakel de GKE-service in en maak een cluster met HPA en 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_PERMISSIVEDe bovenstaande opdracht zal een standaard clusterpool aanmaken met twee VM's n1-standard-2 (vCPU: 2, RAM 7,5 GB, schijf: 30 GB). Idealiter moet je de Istio-componenten isoleren van je workloads, maar er bestaat geen eenvoudige manier om Istio-pods in een speciale clusterpool uit te voeren. Istio-manifesten worden als alleen-lezen beschouwd en GKE zal eventuele wijzigingen, zoals een knooppuntbinding of loskoppeling van een pod, ongedaan maken.
Stel de inloggegevens in voor kubectl:
gcloud container clusters get-credentials istioMaak een rolbinding voor clusterbeheerder:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Installeer de commandoregeltool :
brew install kubernetes-helmHomebrew 2.0 is nu ook beschikbaar voor .
Maak een service-account en koppel een clusterrol aan Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerDƩployeer Tiller in de namespace kube-system:
helm init --service-account tillerOverweeg SSL te gebruiken tussen Helm en Tiller. Voor meer informatie over het beveiligen van de Helm-installatie, zie
Bevestig de instellingen:
kubectl -n istio-system get svcBinnen enkele seconden zou GCP een extern IP-adres moeten toewijzen aan de service istio-ingressgateway.
Configuratie van de Istio-ingangsgateway
Creƫer een statisch IP-adres met de naam istio-gateway, met behulp van het IP-adres van de 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 heb je een domeinnaam en toegang tot je DNS-registrar nodig. Voeg twee A-records toe (vervang example.com door je domein):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Zorg ervoor dat het wildcard-DNS werkt:
watch host test.istio.example.comCreƫer een openbare Istio-gateway voor het aanbieden van diensten buiten de 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:
- "*"Sla de bovenstaande resource op als public-gateway.yaml en pas deze vervolgens toe:
kubectl apply -f ./public-gateway.yamlGeen enkele productiesysteem mag diensten op het internet aanbieden zonder SSL. Om de Istio-ingangsgateway te beveiligen met cert-manager, CloudDNS en Letās Encrypt, lees alsjeblieft Flagger GKE.
Installatie van Flagger
De GKE Istio-add-on omvat geen Prometheus-instantie die verantwoordelijk is voor de opschoning van de Istio-telemetriediensten. Aangezien Flagger Istio HTTP-metrics gebruikt voor het uitvoeren van canary-analyse, moet je de volgende Prometheus-configuratie implementeren, vergelijkbaar met de configuratie die wordt geleverd met het officiƫle Istio Helm-schema.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlVoeg de Flagger Helm-repo toe:
helm repo add flagger [https://flagger.app](https://flagger.app/)DƩployeer Flagger in de namespace istio-system, met Slack-notificaties ingeschakeld:
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=flaggerJe kunt Flagger in elke namespace installeren, zolang deze kan communiceren met de Istio Prometheus-service via poort 9090.
Flagger heeft een Grafana-dashboard voor canary-analyse. Installeer Grafana in de namespace 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-meOpen Grafana via de openbare gateway door een virtuele service te creƫren (vervang example.com door uw domein):
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-grafanaSla de bovenstaande resource op als grafana-virtual-service.yaml en pas deze vervolgens toe:
kubectl apply -f ./grafana-virtual-service.yamlBij het navigeren naar http://grafana.istio.example.com moet uw browser u naar de inlogpagina van Grafana leiden.
Implementatie van webapplicaties met Flagger
Flagger implementeert Kubernetes en, indien nodig, horizontale autoscaling (HPA), vervolgens maakt het een reeks objecten (Kubernetes-deployments, ClusterIP-services en Istio-virtuele services). Deze objecten maken de applicatie openbaar in de service mesh en beheren canary-analyse en promotie.
Maak een testnamespace met ingeschakelde Istio Sidecar-injectie:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlMaak een deployment en een automatische horizontale schaaltool voor de pod:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlDƩploieer een testlastservice om verkeer te genereren tijdens de canary-analyse:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testMaak een aangepaste canary-resource (vervang example.com door je domein):
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/"Sla de bovenstaande resource op als podinfo-canary.yaml en pas deze vervolgens toe:
kubectl apply -f ./podinfo-canary.yamlDe bovenstaande analyse, indien succesvol, zal gedurende vijf minuten worden uitgevoerd, met controle van HTTP-metrics elke halve minuut. U kunt de minimale tijd die nodig is voor de verificatie en promotie van de canary-deployment bepalen aan de hand van de volgende formule: interval * (maxWeight / stepWeight). De Canary CRD-velden worden gedocumenteerd. .
Over een paar seconden zal Flagger canary-objecten aanmaken:
# 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/podinfoOpen de browser en ga naar app.istio.example.com, je zou het versienummer moeten zien van .
Automatische canary-analyse en promotie.
Flagger implementeert een beheercyclus die geleidelijk verkeer naar de canary verplaatst, terwijl het belangrijke prestatiestatistieken zoals het percentage succesvolle HTTP-verzoeken, de gemiddelde responsetijd en de pod-beschikbaarheid meet. Op basis van de KPI-analyse wordt de canary gepromoot of teruggedraaid, en de analysemethoden worden gepubliceerd in Slack.
De canary-deploy wordt geactiveerd bij de wijziging van een van de volgende objecten:
- PodSpec deployment (containerafbeelding, commando, poorten, env, enz.)
- ConfigMaps worden gemonteerd als volumes of omgezet in omgevingsvariabelen.
- Secrets worden gemonteerd als volumes of omgezet in omgevingsvariabelen.
Start de canary-deploy bij het bijwerken van de containerafbeelding:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger detecteert dat de versie van de deployment is veranderd en begint deze te analyseren:
kubectl -n test describe canary/podinfo
Events:
Nieuwe revisie gedetecteerd podinfo.test
Podinfo.test opschalen
Wachten op de uitrol van podinfo.test om te voltooien: 0 van de 1 bijgewerkte replica's zijn beschikbaar
Verhoog podinfo.test canary-gewicht 5
Verhoog podinfo.test canary-gewicht 10
Verhoog podinfo.test canary-gewicht 15
Verhoog podinfo.test canary-gewicht 20
Verhoog podinfo.test canary-gewicht 25
Verhoog podinfo.test canary-gewicht 30
Verhoog podinfo.test canary-gewicht 35
Verhoog podinfo.test canary-gewicht 40
Verhoog podinfo.test canary-gewicht 45
Verhoog podinfo.test canary-gewicht 50
Kopiƫren van podinfo.test sjabloon specificatie naar podinfo-primary.test
Wachten op de uitrol van podinfo-primary.test om te voltooien: 1 van de 2 bijgewerkte replica's zijn beschikbaar
Promotie voltooid! Afbouwen van podinfo.testTijdens de analyse kunnen de resultaten van de canary worden gevolgd met Grafana:
Let op: als nieuwe wijzigingen worden toegepast op de deployment tijdens de canary-analyse, zal Flagger de analyselfase opnieuw starten.
Maak een lijst van alle canaries in je 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:07ZAls je Slack-notificaties hebt ingeschakeld, ontvang je de volgende berichten:
Automatische rollback.
Tijdens de canary-analyse kunnen synthetische HTTP 500-fouten en hoge responsetijden worden gegenereerd om te controleren of Flagger de deployment stopt.
Maak een testpod en voer de volgende actie uit:
kubectl -n test run tester
--image=quay.io/stefanprodan/podinfo:1.2.1
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx shGeneratie van HTTP 500-fouten:
watch curl http://podinfo-canary:9898/status/500Generatie van vertraging:
watch curl http://podinfo-canary:9898/delay/1Wanneer het aantal mislukt controles de drempelwaarde bereikt, wordt het verkeer teruggeleid naar het primaire kanaal, wordt de canary naar nul geschaald en wordt de deploy als mislukt gemarkeerd.
Canary-fouten en pieken in vertragingen worden geregistreerd als Kubernetes-evenementen en door Flagger vastgelegd in JSON-indeling:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Start canary-deploy voor podinfo.test
Verhoog podinfo.test canary-gewicht 5
Verhoog podinfo.test canary-gewicht 10
Verhoog podinfo.test canary-gewicht 15
Halt podinfo.test voortgangs succescijfers 69,17% < 99%
Halt podinfo.test voortgangs succescijfers 61,39% < 99%
Halt podinfo.test voortgangs succescijfers 55,06% < 99%
Halt podinfo.test voortgangs succescijfers 47,00% < 99%
Halt podinfo.test voortgangs succescijfers 37,00% 500ms
Halt podinfo.test voortgangs verzoekduur 1,600s > 500ms
Halt podinfo.test voortgangs verzoekduur 1,915s > 500ms
Halt podinfo.test voortgangs verzoekduur 2,050s > 500ms
Halt podinfo.test voortgangs verzoekduur 2,515s > 500ms
Rollback podinfo.test mislukt controles drempel bereikt 10
Canary is mislukt! Verkleinen van podinfo.testAls je Slack-meldingen hebt ingeschakeld, ontvang je een bericht wanneer de deadline voor uitvoering of het maximum aantal mislukte controles tijdens de analyse wordt overschreden:
Ter conclusie
Het starten van een service mesh, zoals Istio, bovenop Kubernetes biedt automatische metrics, logs en tracering, maar de deploy van workloads is nog steeds afhankelijk van externe tools. Flagger streeft ernaar deze situatie te veranderen door Istio-functionaliteiten toe te voegen .
Flagger is compatibel met elke CI/CD-oplossing voor Kubernetes, en canary-analyse kan eenvoudig worden uitgebreid met voor het uitvoeren van systeemtests, integratietests, prestatietests of andere gebruikerscontroles. Aangezien Flagger declaratief is en reageert op Kubernetes-evenementen, kan het worden gebruikt in GitOps-pijplijnen samen met of . Als je JenkinsX gebruikt, kun je Flagger installeren met jx-plugins.
Flagger wordt ondersteund door en biedt canary-deploys in . Het project wordt getest op GKE, EKS en bare metal met kubeadm.
Als je suggesties hebt om Flagger te verbeteren, stuur dan een vraag of PR op GitHub naar . Bijdragen zijn meer dan welkom!
Dank .
Bron: habr.com
