Automaatne canary-deploy koos Flaggeri ja Istio'ga

Automaatne canary-deploy koos Flaggeri ja Istio'ga

CD tunnustatakse ettevõtte tarkvara praktikaks, mis on ettevõtte järkjärgulise arengutee loomulik tulemus. Siiski on CD endiselt üsna haruldane nähtus, mis võib olla tingitud keerukustest haldamisel ja hirmust ebaõnnestunud juurutamiste ees, mis mõjutavad süsteemi kergesti.

Flagger on avatud lähtekoodiga Kubernetes'i operaator, mille eesmärk on vältida eksitavaid keskkondi. See automatiseerib kanaride juurutuste edendamise, kasutades liiklusjaotust Istio ja Prometheuse mõõdikuid, et analüüsida rakenduse käitumist juhitud juurutamise ajal.

Siin on samm-sammuline juhend Flagger'i seadistamiseks ja kasutamiseks Google Kubernetes Engine'is (GKE).

Kubernetes'i klastrite seadistamine

Alustate GKE klastri loomisega Istio laiendusega (kui teil pole GCP kontot, saate registreeruda siit — tasuta krediidi saamiseks).

Logige sisse Google Cloud'i, looge projekt ja aktiveerige selle jaoks arvelduse. Installige käsurea utiliit gcloud ja seadistage oma projekt koos gcloud init.

Seadistage vaikimisi projekt, arvutuspiirkond ja tsoon (asendage PROJECT_ID oma projektiga):

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

Lülitage sisse GKE teenus ja looge HPA ja Istio laienditega klaster:

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

Ülaltoodud käsk loob vaikimisi sõlmpooli, mis sisaldab kahte virtuaalmasinat n1-standard-2 (vCPU: 2, RAM 7,5 GB, ketas: 30 GB). Ideaalis tuleks Istio komponente eraldada oma töökoormustest, kuid ei ole lihtsat viisi Istio podide käitamiseks eraldi sõlmpoolides. Istio manifestid on lugemiseks, ja GKE tühistab kõik muudatused, näiteks sõlme sidumise või podist lahti ühendamise.

Seadistage volitused kubectl:

gcloud container clusters get-credentials istio

Looge klastrihalduse rolli sidumine:

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

Installige käsurea tööriist Helm:

brew install kubernetes-helm

Homebrew 2.0 on nüüd saadaval ka Linux.

Looge teenusekonto ja klastrihalduse rolli sidumine Tillerile:

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

Käivitage Tiller nimede ruumis kube-system:

helm init --service-account tiller

Soovitame kasutada SSL-i Helm'i ja Tilleri vahel. Lisainformatsiooni Helm'i paigaldamise kaitsmise kohta leiate docs.helm.sh

Kinnitage seadistused:

kubectl -n istio-system get svc

Mõne sekundi pärast peaks GCP määrama teenusele välise IP-aadressi istio-ingressgateway.

Istio sisenemistee seadistamine

Looge staatiline IP-aadress nimega istio-gateway, kasutades Istio sisenemistee IP-aadressi:

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üüd vajate interneti domeeni ja pääsu oma DNS-registraatorile. Lisage kaks A-kirjet (asendage example.com oma domeeniga):

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

Veenduge, et DNS-i wildcard töötab:

watch host test.istio.example.com

Looge ühine Istio sisenemistee, et pakkuda teenuseid service mesh'i hulgast HTTP kaudu:

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

Salvesta ülaltoodud ressurss kui public-gateway.yaml ja rakenda see siis:

kubectl apply -f ./public-gateway.yaml

Ükski tootmisüsteem ei tohi pakkuda teenuseid internetis ilma SSL-ita. Et kaitsta Istio sisenemissenet cert-manager, CloudDNS ja Let’s Encrypt, palun loe: dokumentatsiooni Flagger GKE.

Flaggeri installimine

GKE Istio täiendus ei hõlma Prometheuse instantsi, mis haldab Istio telemeetriateenuste koristamist. Kuna Flagger kasutab canary analüüsi tegemiseks Istio HTTP mõõdikuid, pead välja raporteerima järgmise Prometheuse konfigureerimise, mis on sarnane sellele, mis tarnitakse ametliku Istio Helm skeemiga.

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

Lisa Flaggeri Helm repo:

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

Paigalda Flagger nimede ruumis istio-system, aktiveerides Slacki teavitused:

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

Sa saad installida Flaggeri igas nimede ruumis, kui see suudab suhelda Istio Prometheuse teenusega läbi port 9090.

Flaggeril on Grafana armatuurlaud kanari analüüsi jaoks. Installige Grafana nimetuses 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

Avage Grafana, luues virtuaalse teenuse (asendage example.com oma domeeniga):

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

Salvestage ülaltoodud ressurss nimega grafana-virtual-service.yaml ja seejärel rakendage see:

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

Kui külastate http://grafana.istio.example.com brauseris, peaksite suunama Grafana sisselogimislehele.

Veebirakenduste juurutamine Flaggeriga

Flagger juurutab Kubernetes't ja vajadusel horisontaalset automaatset skaleerimist (HPA), seejärel loob seeria objekte (Kubernetes'i juurutusi, ClusterIP teenuseid ja Istio virtuaalseid teenuseid). Need objektid avavad rakenduse teenusteside ja haldavad kanari analüüsi ja edendamist.

Automaatne canary-deploy koos Flaggeri ja Istio'ga

Looge Testimine nime ruum, kus on lubatud Istio Sidecar'i juurutamine:

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

Looge rakendus ja automaatne horisontaalne skaleerimisvahend pod'i jaoks:

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

Käitage koormustesti teenust liikluse genereerimiseks canary analüüsi ajal:

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

Looge kohandatud canary ressurss (asendage example.com oma domeeniga):

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

Salvage ülaltoodud ressurss nimega podinfo-canary.yaml ja rakendage see seejärel:

kubectl apply -f ./podinfo-canary.yaml

Ülaltoodud analüüs, juhul kui see õnnestub, toimub viie minuti jooksul koos HTTP mõõdikute kontrollimisega iga poole minuti tagant. Saate määrata minimaalset aega canary-deploy kontrollimiseks ja edendamiseks, kasutades järgmist valemit: interval * (maxWeight / stepWeight). Canary CRD väljad on dokumenteeritud siit.

Mõne sekundi pärast loob Flagger canary-objektid:

# 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

Avage brauser ja minge aadressile app.istio.example.com, peaksite nägema versiooninumbrit demonduse rakendusest.

Automaatne canary analüüs ja edendamine

Flagger rakendab juhtimistsüklit, mis viib järk-järgult liikluse canary'le, samal ajal mõõtes võtme tulemuslikkuse näitajaid, nagu HTTP-päringute edukuse määr, keskmine päringu kestus ja pundi töökindlus. KPI analüüsi põhjal edendatakse või katkestatakse canary, ning analüüsi tulemused avaldatakse Slackis.

Automaatne canary-deploy koos Flaggeri ja Istio'ga

Canary-deploy algab, kui muudetakse ühte järgmistest objektidest:

  • PodSpeci juurutamine (konteineri pilt, käsk, port, env jne)
  • ConfigMapid kaardistatakse kui mahtusid või muudetakse keskkonnamuutujateks
  • Saladused kaardistatakse kui mahtusid või muudetakse keskkonnamuutujateks

Canary-deploy käivitamine konteineri pildi uuendamisel:

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

Flagger tuvastab, et deploy versioon on muutunud, ja hakkab seda analüüsima:

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

Analüüsi käigus saab canary tulemusi jälgida Grafana abil:

Automaatne canary-deploy koos Flaggeri ja Istio'ga

Pange tähele: kui uusi muudatusi rakendatakse deploy suhtes canary analüüsi ajal, siis Flagger käivitab analüüsifaasi uuesti.

Koguge kokku kõik „kanarikad” teie klastris:

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

Kui olete sisse lülitanud Slacki teavitused, saate järgmised sõnumid:

Automaatne canary-deploy koos Flaggeri ja Istio'ga

Automaatne tagasivõtt

Canary analüüsi käigus saab genereerida sünteetilisi HTTP 500 vigu ja kõrget vastuse viivitust, et kontrollida, kas Flagger peatab juurutamise.

Looge testpod ja tehke järgmine tõuge:

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

HTTP 500 vigade genereerimine:

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

Viivituse genereerimine:

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

Kui ebaõnnestumiste arv jõuab lävendi väärtuseni, suunatakse liiklus tagasi põhivoolu, canary skaleeritakse nulli ja juurutamine märgitakse ebaõnnestunuks.

Canary vead ja viivituse tipud registreeritakse Kubernetes sündmustena ja Flagger salvestab need JSON formaadis:

kubectl -n istio-system logs deployment/flagger -f | jq .msg

Kaanari juurutamine podinfo.test jaoks
Suurenda podinfo.test kanali kaalu 5
Suurenda podinfo.test kanali kaalu 10
Suurenda podinfo.test kanali kaalu 15
Peata podinfo.test edenemise edukus 69.17% < 99%
Peata podinfo.test edenemise edukus 61.39% < 99%
Peata podinfo.test edenemise edukus 55.06% < 99%
Peata podinfo.test edenemise edukus 47.00% < 99%
Peata podinfo.test edenemise edukus 37.00%  500ms
Peata podinfo.test edenemise taotluse kestus 1.600s > 500ms
Peata podinfo.test edenemise taotluse kestus 1.915s > 500ms
Peata podinfo.test edenemise taotluse kestus 2.050s > 500ms
Peata podinfo.test edenemise taotluse kestus 2.515s > 500ms
Tagasi pöördumine podinfo.test ebaõnnestunud kontrollide künnis on saavutatud 10
Kaanar ebaõnnestus! Väheneme podinfo.test

Kui olete sisse lülitanud Slacki teadete, siis saate teate, kui tähtaeg on ületatud või kui on saavutatud maksimaalne ebaõnnestunud kontrollide arv analüüsi käigus:

Automaatne canary-deploy koos Flaggeri ja Istio'ga

Kokkuvõtteks

Teenuse võrgu, näiteks Istio, käivitamine koos Kubernetesega обеспечит automaatika mõõdikud, logid ja protokollid, kuid töökoormuste juurutamine sõltub endiselt välise tööriistadest. Flagger püüab seda olukorda muuta, lisades Istio võimalusi progressiivne tarnimine.

Flagger on ühilduv kõikide CI/CD lahendustega Kuberneteses ning kanari analüüsi saab kergesti laiendada veebihookide abil süsteemitesti, kasutuskatsete, koormustestide või muude kasutajate kontrollide teostamiseks. Kuna Flagger on deklaratiivne ja reageerib Kubernetes'e sündmustele, saab seda kasutada GitOps'i torudes koos Weave Flux või JenkinsX. Kui kasutate JenkinsX'i, saate installida Flagger'i koos jx-lisanditega.

Flagger'it toetab Weaveworks ja see võimaldab canary-deploy'e Weave Cloud. Projekti testitakse GKE-s, EKS-s ja 'puhtal riistvaral', kasutades kubeadm'i.

Kui teil on ettepanekuid Flagger'i parandamiseks, saatke palun küsimus või PR GitHub'is aadressil stefanprodan/flagger. Ükskõik millised panused on rohkem kui teretulnud!

Aitäh Rey Tsan.

Allikas: habr.com

Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid 🔥 Osta usaldusväärne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster