Outomatiese kanarie-ontplooiings met Flagger en Istio

Outomatiese kanarie-ontplooiings met Flagger en Istio

CD word erken as 'n ondernemingsagtewarepraktyk en is die resultaat van 'n natuurlike evolusie van gevestigde CI-beginsels. CD is egter nog redelik skaars, miskien as gevolg van die kompleksiteit van bestuur en die vrees vir mislukte ontplooiings wat stelselbeskikbaarheid beïnvloed.

Vlag is 'n oopbron Kubernetes-operateur wat daarop gemik is om verwarrende verhoudings uit te skakel. Dit outomatiseer die bevordering van kanarie-ontplooiings deur Istio-verkeersoffset en Prometheus-statistieke te gebruik om toepassingsgedrag tydens 'n bestuurde ontplooiing te ontleed.

Hieronder is 'n stap-vir-stap-gids vir die opstel en gebruik van Flagger op Google Kubernetes Engine (GKE).

Stel 'n Kubernetes-kluster op

Jy begin deur 'n GKE-kluster met die Istio-byvoeging te skep (as jy nie 'n GCP-rekening het nie, kan jy aanmeld hier - om gratis krediete te kry).

Meld aan by Google Wolk, skep 'n projek en aktiveer fakturering daarvoor. Installeer die opdragreëlnutsding gwolk en stel jou projek op met gcloud init.

Stel verstekprojek, bereken area en sone (vervang PROJECT_ID vir jou projek):

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

Aktiveer die GKE-diens en skep 'n groepering met HPA- en Istio-byvoegings:

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

Die bogenoemde opdrag sal 'n verstek noduspoel skep wat twee VM's insluit n1-standard-2 (vCPU: 2, RAM 7,5 GB, skyf: 30 GB). Ideaal gesproke moet jy Istio-komponente van jou werkladings isoleer, maar daar is geen maklike manier om Istio Pods in 'n toegewyde poel nodusse te laat loop nie. Istio-manifeste word as leesalleen beskou en GKE sal enige veranderinge ongedaan maak, soos om aan 'n nodus te koppel of van 'n peul los te maak.

Stel eiebewyse op vir kubectl:

gcloud container clusters get-credentials istio

Skep 'n groepadministrateurrolbinding:

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

Installeer die opdragreëlinstrument Helm:

brew install kubernetes-helm

Homebrew 2.0 is nou ook beskikbaar vir Linux.

Skep 'n diensrekening en groeprolbinding vir Tiller:

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

Brei Tiller in naamruimte uit kube-system:

helm init --service-account tiller

U moet dit oorweeg om SSL tussen Helm en Tiller te gebruik. Vir meer inligting oor die beskerming van jou Helm-installasie, sien docs.helm.sh

Bevestig instellings:

kubectl -n istio-system get svc

Na 'n paar sekondes moet GCP 'n eksterne IP-adres vir die diens toewys istio-ingressgateway.

Konfigureer die Istio Ingress Gateway

Skep 'n statiese IP-adres met 'n naam istio-gatewaygebruik die IP-adres van die Istio-poort:

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

Nou benodig u 'n internetdomein en toegang tot u DNS-registrateur. Voeg twee A-rekords by (vervang example.com na jou domein):

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

Verifieer dat die DNS-jokerteken werk:

watch host test.istio.example.com

Skep 'n generiese Istio-poort om dienste buite die diensnetwerk oor HTTP te verskaf:

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:
        - "*"

Stoor die bogenoemde hulpbron as public-gateway.yaml en pas dit dan toe:

kubectl apply -f ./public-gateway.yaml

Geen produksiestelsel behoort dienste op die internet te verskaf sonder SSL nie. Om die Istio-ingangspoort met cert-manager, CloudDNS en Let's Encrypt te beveilig, lees asseblief dokumentasie Flagger G.K.E.

Flagger installasie

Die GKE Istio-byvoeging sluit nie 'n Prometheus-instansie in wat die Istio-telemetriediens skoonmaak nie. Omdat Flagger Istio HTTP-statistieke gebruik om kanarie-analise uit te voer, moet jy die volgende Prometheus-konfigurasie ontplooi, soortgelyk aan die een wat by die amptelike Istio Helm-skema kom.

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

Voeg die Flagger Helm-bewaarplek by:

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

Brei Vlagger uit na naamruimte istio-systemdeur Slack-kennisgewings te aktiveer:

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

Jy kan Flagger in enige naamruimte installeer solank dit met die Istio Prometheus-diens op poort 9090 kan kommunikeer.

Flagger het 'n Grafana-dashboard vir kanarie-analise. Installeer Grafana in naamruimte 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

Stel Grafana bloot deur 'n oop poort deur 'n virtuele diens te skep (vervang example.com na jou 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

Stoor die bogenoemde hulpbron as grafana-virtual-service.yaml en pas dit dan toe:

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

Wanneer verhuis na http://grafana.istio.example.com in die blaaier moet u na die Grafana-aanmeldbladsy verwys word.

Ontplooi webtoepassings met Flagger

Flagger ontplooi Kubernetes en skaal opsioneel outomaties uit (HPA), en skep dan 'n reeks voorwerpe (Kubernetes-ontplooiings, ClusterIP-dienste en Istio virtuele dienste). Hierdie voorwerpe stel die toepassing bloot aan die diensnetwerk en beheer kanarie-analise en -vordering.

Outomatiese kanarie-ontplooiings met Flagger en Istio

Skep 'n toetsnaamruimte met Istio Sidecar-inspuiting geaktiveer:

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

Skep 'n ontplooiing en 'n outomatiese uitskaalinstrument:

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

Ontplooi 'n toetslaaidiens om verkeer tydens kanarie-analise te genereer:

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

Skep 'n pasgemaakte kanarie-hulpbron (vervang example.com na jou 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/"

Stoor die bogenoemde hulpbron as podinfo-canary.yaml en pas dit dan toe:

kubectl apply -f ./podinfo-canary.yaml

Die bogenoemde ontleding, indien suksesvol, sal vir vyf minute duur en HTTP-statistieke elke halfminuut nagaan. U kan die minimum tyd bepaal wat benodig word om 'n kanarie-ontplooiing te bekragtig en te bevorder deur die volgende formule te gebruik: interval * (maxWeight / stepWeight). Kanariese CRD-velde word gedokumenteer hier.

Na 'n paar sekondes sal Flagger kanarie-voorwerpe skep:

# 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

Maak 'n blaaier oop en gaan na app.istio.example.com, moet jy die weergawenommer sien demo-toepassings.

Outomatiese kanarie-analise en bevordering

Flagger implementeer 'n beheerlus wat verkeer geleidelik na die kanarie beweeg, terwyl sleutelprestasiemaatstawwe soos HTTP-versoeksukseskoers, gemiddelde versoekduur en peulgesondheid gemeet word. Op grond van die KPI-analise word die kanarie bevorder of onderbreek, en die resultate van die analise word aan Slack gepubliseer.

Outomatiese kanarie-ontplooiings met Flagger en Istio

Kanarie-ontplooiing word geaktiveer wanneer een van die volgende voorwerpe verander:

  • Ontplooi PodSpec (houerbeeld, opdrag, poorte, env, ens.)
  • ConfigMaps word as volumes gemonteer of na omgewingsveranderlikes gekarteer
  • Geheime word as volumes gemonteer of omgeskakel na omgewingsveranderlikes

Begin kanarie-ontplooiing wanneer 'n houerbeeld opgedateer word:

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

Flagger bespeur dat die ontplooiingsweergawe verander het en begin dit ontleed:

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

Tydens ontleding kan kanarie-resultate opgespoor word met behulp van Grafana:

Outomatiese kanarie-ontplooiings met Flagger en Istio

Neem asseblief kennis dat as nuwe veranderinge toegepas word op 'n ontplooiing tydens kanarie-analise, dan sal Flagger die ontledingsfase herbegin.

Maak 'n lys van alle kanaries in jou groep:

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

As jy Slack-kennisgewings geaktiveer het, sal jy die volgende boodskappe ontvang:

Outomatiese kanarie-ontplooiings met Flagger en Istio

Outomatiese terugrol

Tydens kanarie-analise kan jy sintetiese HTTP 500-foute en hoë reaksie-vertraging genereer om te sien of Flagger die ontplooiing sal stop.

Skep 'n toetspod en doen die volgende daarin:

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

Genereer HTTP 500-foute:

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

Vertrag generering:

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

Wanneer die aantal mislukte kontroles die drempel bereik, word die verkeer na die primêre kanaal herlei, die kanarie word na nul afgeskaal en die ontplooiing word as misluk gemerk.

Kanarie-foute en vertragingspieke word as Kubernetes-gebeurtenisse aangeteken en deur Flagger in JSON-formaat aangeteken:

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

As jy Slack-kennisgewings geaktiveer het, sal jy 'n boodskap ontvang wanneer die sperdatum oorskry word of die maksimum aantal mislukte tjeks in die analise bereik word:

Outomatiese kanarie-ontplooiings met Flagger en Istio

Ten slotte

Om 'n diensnetwerk soos Istio bykomend tot Kubernetes te laat loop, sal outomatiese statistieke, logs en protokolle verskaf, maar werklading-ontplooiing hang steeds van eksterne nutsgoed af. Flagger beoog om dit te verander deur Istio-vermoëns by te voeg progressiewe aanbod.

Flagger is versoenbaar met enige Kubernetes CI/CD-oplossing, en kanarie-analise kan maklik uitgebrei word met webhooks om stelselintegrasie/aanvaardingstoetse, vragtoetse of enige ander pasgemaakte tjeks uit te voer. Aangesien Flagger verklarend is en op Kubernetes-gebeure reageer, kan dit in GitOps-pyplyne gebruik word Weef Flux of JenkinsX. As jy JenkinsX gebruik, kan jy Flagger installeer met jx addons.

Vlagger ondersteun Weefwerke en bied kanarie-ontplooiings in Weef Wolk. Die projek word getoets op GKE, EKS, en kaal metaal met kubeadm.

As jy voorstelle het om Flagger te verbeter, dien asseblief 'n kwessie of PR op GitHub in by stefanprodan/flagger. Bydraes is meer as welkom!

Dankie Ray Tsang.

Bron: will.com

Voeg 'n opmerking