Automatiske kanari-utplasseringer med Flagger og Istio

Automatiske kanari-utplasseringer med Flagger og Istio

CD er anerkjent som en bedriftsprogramvarepraksis og er et resultat av en naturlig utvikling av etablerte CI-prinsipper. Imidlertid er CD fortsatt ganske sjelden, kanskje på grunn av kompleksiteten i administrasjonen og frykten for mislykkede distribusjoner som påvirker systemtilgjengeligheten.

flagger er en åpen kildekode Kubernetes-operatør som har som mål å eliminere forvirrende forhold. Den automatiserer markedsføringen av kanarie-distribusjoner ved å bruke Istio-trafikkoffset og Prometheus-beregninger for å analysere applikasjonsatferd under en administrert utrulling.

Nedenfor er en trinnvis veiledning for å sette opp og bruke Flagger på Google Kubernetes Engine (GKE).

Sette opp en Kubernetes-klynge

Du starter med å opprette en GKE-klynge med Istio-tillegget (hvis du ikke har en GCP-konto, kan du registrere deg her - for å få gratis kreditter).

Logg på Google Cloud, opprett et prosjekt og aktiver fakturering for det. Installer kommandolinjeverktøyet gcloud og sett opp prosjektet ditt med gcloud init.

Angi standardprosjekt, beregningsområde og sone (erstatt PROJECT_ID for prosjektet ditt):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

Aktiver GKE-tjenesten og lag en klynge med HPA- og Istio-tillegg:

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

Kommandoen ovenfor vil opprette en standard nodepool inkludert to VM-er n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideelt sett bør du isolere Istio-komponenter fra arbeidsbelastningene dine, men det er ingen enkel måte å kjøre Istio Pods i en dedikert pool av noder. Istio-manifester betraktes som skrivebeskyttet, og GKE vil angre eventuelle endringer, for eksempel kobling til en node eller frakobling fra en pod.

Sett opp legitimasjon for kubectl:

gcloud container clusters get-credentials istio

Opprett en klyngeadministratorrollebinding:

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

Installer kommandolinjeverktøyet Helm:

brew install kubernetes-helm

Homebrew 2.0 er nå også tilgjengelig for Linux.

Opprett en tjenestekonto og klyngerollebinding for Tiller:

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

Utvid Tiller i navneområdet kube-system:

helm init --service-account tiller

Du bør vurdere å bruke SSL mellom Helm og Tiller. For mer informasjon om beskyttelse av Helm-installasjonen, se docs.helm.sh

Bekreft innstillinger:

kubectl -n istio-system get svc

Etter noen sekunder bør GCP tilordne en ekstern IP-adresse for tjenesten istio-ingressgateway.

Konfigurere Istio Ingress Gateway

Opprett en statisk IP-adresse med et navn istio-gatewayved å bruke IP-adressen til Istio-gatewayen:

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

Nå trenger du et internettdomene og tilgang til DNS-registratoren din. Legg til to A-poster (erstatt example.com til ditt domene):

istio.example.com   A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}

Bekreft at DNS-jokertegnet fungerer:

watch host test.istio.example.com

Opprett en generisk Istio-gateway for å tilby tjenester utenfor tjenestenettverket over 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:
        - "*"

Lagre ressursen ovenfor som public-gateway.yaml og bruk den deretter:

kubectl apply -f ./public-gateway.yaml

Ingen produksjonssystem skal tilby tjenester på Internett uten SSL. For å sikre Istio-inngangsporten med cert-manager, CloudDNS og Let's Encrypt, vennligst les dokumentasjon Flagger G.K.E.

Flagger installasjon

GKE Istio-tillegget inkluderer ikke en Prometheus-forekomst som rydder opp i Istio-telemetritjenesten. Fordi Flagger bruker Istio HTTP-beregninger til å utføre kanariøyneanalyse, må du distribuere følgende Prometheus-konfigurasjon, lik den som følger med det offisielle Istio Helm-skjemaet.

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

Legg til Flagger Helm-depotet:

helm repo add flagger [https://flagger.app](https://flagger.app/)

Utvid Flagger til navneområde istio-systemved å aktivere Slack-varsler:

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

Du kan installere Flagger i et hvilket som helst navneområde så lenge det kan kommunisere med Istio Prometheus-tjenesten på port 9090.

Flagger har et Grafana-dashbord for kanari-analyse. Installer Grafana i navneområdet 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

Utsett Grafana gjennom en åpen gateway ved å lage en virtuell tjeneste (erstatt example.com til ditt domene):

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

Lagre ressursen ovenfor som grafana-virtual-service.yaml og bruk den deretter:

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

Ved flytting til http://grafana.istio.example.com i nettleseren skal du ledes til Grafanas påloggingsside.

Utrulling av nettapplikasjoner med Flagger

Flagger distribuerer Kubernetes og skalerer ut automatisk (HPA), og lager deretter en serie objekter (Kubernetes-distribusjoner, ClusterIP-tjenester og virtuelle Istio-tjenester). Disse objektene utsetter applikasjonen for tjenestenettverket og kontrollerer kanariøyeanalyse og fremgang.

Automatiske kanari-utplasseringer med Flagger og Istio

Opprett et testnavneområde med Istio Sidecar-injeksjon aktivert:

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

Opprett en distribusjon og et automatisk utskaleringsverktøy for pod:

kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml

Implementer en testinnlastingstjeneste for å generere trafikk under kanari-analyse:

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

Lag en tilpasset kanari-ressurs (erstatt example.com til ditt domene):

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

Lagre ressursen ovenfor som podinfo-canary.yaml og bruk den deretter:

kubectl apply -f ./podinfo-canary.yaml

Analysen ovenfor, hvis den lykkes, vil kjøre i fem minutter, og sjekke HTTP-beregninger hvert halve minutt. Du kan bestemme minimumstiden som kreves for å validere og promotere en kanari-utplassering ved å bruke følgende formel: interval * (maxWeight / stepWeight). Canary CRD-felt er dokumentert her.

Etter et par sekunder vil Flagger lage kanariobjekter:

# 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

Åpne en nettleser og gå til app.istio.example.com, bør du se versjonsnummeret demo-apper.

Automatisk kanariøyneanalyse og promotering

Flagger implementerer en kontrollsløyfe som gradvis flytter trafikk til kanarifuglen mens den måler nøkkelytelsesmålinger som HTTP-forespørslers suksessrate, gjennomsnittlig forespørselsvarighet og podhelse. Basert på KPI-analysen blir kanarifuglen promotert eller avbrutt, og resultatene av analysen publiseres til Slack.

Automatiske kanari-utplasseringer med Flagger og Istio

Canary-distribusjon utløses når ett av følgende objekter endres:

  • Distribuer PodSpec (beholderbilde, kommando, porter, env, etc.)
  • ConfigMaps er montert som volumer eller tilordnet miljøvariabler
  • Hemmeligheter monteres som volumer eller konverteres til miljøvariabler

Kjør Canary-distribusjon når du oppdaterer et beholderbilde:

kubectl -n test set image deployment/podinfo 
podinfod=quay.io/stefanprodan/podinfo:1.4.1

Flagger oppdager at distribusjonsversjonen er endret og begynner å analysere den:

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

Under analyse kan kanarifuglresultater spores ved hjelp av Grafana:

Automatiske kanari-utplasseringer med Flagger og Istio

Vær oppmerksom på at hvis nye endringer blir brukt på en distribusjon under kanari-analyse, vil Flagger starte analysefasen på nytt.

Lag en liste over alle kanarifuglene i klyngen din:

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

Hvis du har aktivert Slack-varsler, vil du motta følgende meldinger:

Automatiske kanari-utplasseringer med Flagger og Istio

Automatisk tilbakerulling

Under kanari-analyse kan du generere syntetiske HTTP 500-feil og høy responsforsinkelse for å se om Flagger stopper distribusjonen.

Lag en testpod og gjør følgende 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 sh

Genererer HTTP 500-feil:

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

Forsinkelsesgenerering:

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

Når antallet mislykkede kontroller når terskelen, rutes trafikken tilbake til primærkanalen, kanarifuglen skaleres til null, og distribusjonen merkes som mislykket.

Kanarifeil og forsinkelsestopper logges som Kubernetes-hendelser og logges av Flagger i JSON-format:

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

Hvis du har aktivert Slack-varsler, vil du motta en melding når fristen er overskredet eller maksimalt antall feilslåtte kontroller i analysen er nådd:

Automatiske kanari-utplasseringer med Flagger og Istio

i konklusjonen

Å kjøre et tjenestenettverk som Istio i tillegg til Kubernetes vil gi automatiske beregninger, logger og protokoller, men distribusjon av arbeidsbelastning avhenger fortsatt av eksterne verktøy. Flagger har som mål å endre dette ved å legge til Istio-funksjoner progressiv forsyning.

Flagger er kompatibel med alle Kubernetes CI/CD-løsninger, og kanari-analyse kan enkelt utvides med webhooks for å utføre systemintegrasjon/akseptetester, belastningstester eller andre tilpassede kontroller. Siden Flagger er deklarativ og reagerer på Kubernetes-hendelser, kan den brukes i GitOps-pipelines sammen med Vev Flux eller JenkinsX. Hvis du bruker JenkinsX, kan du installere Flagger med jx-tillegg.

Flagger støttet Vevverk og gir kanari-utplasseringer i Vev sky. Prosjektet testes på GKE, EKS, og bart metall med kubeadm.

Hvis du har forslag for å forbedre Flagger, vennligst send inn et problem eller PR på GitHub på stefanprodan/flagger. Bidrag er mer enn velkommen!

Takk Ray Tsang.

Kilde: www.habr.com

Legg til en kommentar