Automatische canary-deploys met Flagger en Istio

Automatische canary-deploys met Flagger en Istio

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.

Flagger 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 hier voor gratis tegoeden).

Log in op Google Cloud, maak een project aan en activeer facturering daarvoor. Installeer de commandoregeltool gcloud 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-a

Schakel 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_PERMISSIVE

De 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 istio

Maak een rolbinding voor clusterbeheerder:

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

Installeer de commandoregeltool Helm:

brew install kubernetes-helm

Homebrew 2.0 is nu ook beschikbaar voor Linux.

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:tiller

DƩployeer Tiller in de namespace kube-system:

helm init --service-account tiller

Overweeg SSL te gebruiken tussen Helm en Tiller. Voor meer informatie over het beveiligen van de Helm-installatie, zie docs.helm.sh

Bevestig de instellingen:

kubectl -n istio-system get svc

Binnen 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-central1

Nu 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.com

Creƫ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.yaml

Geen 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 documentatie 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.yaml

Voeg 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=flagger

Je 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-me

Open 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-grafana

Sla de bovenstaande resource op als grafana-virtual-service.yaml en pas deze vervolgens toe:

kubectl apply -f ./grafana-virtual-service.yaml

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

Automatische canary-deploys met Flagger en Istio

Maak een testnamespace met ingeschakelde Istio Sidecar-injectie:

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml

Maak 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.yaml

DƩploieer een testlastservice om verkeer te genereren tijdens de canary-analyse:

helm upgrade -i flagger-loadtester flagger/loadtester 
--namepace=test

Maak 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.yaml

De 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. hier.

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/podinfo

Open de browser en ga naar app.istio.example.com, je zou het versienummer moeten zien van de demo-applicatie..

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.

Automatische canary-deploys met Flagger en Istio

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

Flagger 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.test

Tijdens de analyse kunnen de resultaten van de canary worden gevolgd met Grafana:

Automatische canary-deploys met Flagger en Istio

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:07Z

Als je Slack-notificaties hebt ingeschakeld, ontvang je de volgende berichten:

Automatische canary-deploys met Flagger en Istio

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 sh

Generatie van HTTP 500-fouten:

watch curl http://podinfo-canary:9898/status/500

Generatie van vertraging:

watch curl http://podinfo-canary:9898/delay/1

Wanneer 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.test

Als 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:

Automatische canary-deploys met Flagger en Istio

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 progressieve levering.

Flagger is compatibel met elke CI/CD-oplossing voor Kubernetes, en canary-analyse kan eenvoudig worden uitgebreid met webhooks 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 Weave Flux of JenkinsX. Als je JenkinsX gebruikt, kun je Flagger installeren met jx-plugins.

Flagger wordt ondersteund door Weaveworks en biedt canary-deploys in Weave Cloud. 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 stefanprodan/flagger. Bijdragen zijn meer dan welkom!

Dank Ray Tsan.

Bron: habr.com

Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers šŸ”„ Koop betrouwbare webhosting met bescherming tegen DDoS, VPS VDS servers | ProHoster