Automaatne canary-deploy Flaggeri ja Istio abil

Automaatne canary-deploy Flaggeri ja Istio abil

CD on tunnustatud kui ettevõtte tarkvara praktika, see on CI kehtestatud põhimõtete loomulik evolutsioon. Siiski on CD endiselt üsna haruldane nähtus, tõenäoliselt seetõttu, et selle haldamine on keeruline ja kardetakse ebaõnnestunud juurutamisi, mis mõjutavad süsteemi kättesaadavust.

Flagger on avatud lähtekoodiga Kubernetes'i operaator, mille eesmärk on välistada keerulised seosed. See automatiseerib kanarbiku juurutuste edendamist, kasutades Istio liikluse nihutamist ja Prometheuse metrikaid rakenduse käitumise analüüsimiseks juhitud väljalaskmise ajal.

Allpool on samm-sammult juhend Flaggeri seadistamiseks ja kasutamiseks Google Kubernetes Engine (GKE) keskkonnas.

Kubernetes'i klastrite seadistamine

Alustage GKE klastri loomisega Istio lisandiga (kui teil ei ole GCP konto, saate registreeruda siin — et saada tasuta krediite).

Logige sisse Google Cloudi, looge projekt ja aktiveerige selle jaoks arveldamine. Installige käsurea utiliit gcloud ja seadistage oma projekt kasutades gcloud init.

Seadistage vaikeprojekt, 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

Aktiveerige GKE teenus ja looge klaster HPA ja Istio lisanditega:

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 vaikekauguse sõlmede grupi, mis sisaldab kahte VM-i n1-standard-2 (vCPU: 2, RAM 7,5 GB, kett: 30 GB). Ideaalis tuleks Istio komponente eraldada oma töökoormustest, kuid lihtsat viisi Istio poodide käitamiseks eraldatud sõlmede grupis ei ole. Istio manifestid on lugemiseks saadaval, ja GKE tühistab kõik muudatused, näiteks sõlme sidumine või poosi eemaldamine.

Seadistage autentimisandmed kubectl:

gcloud container clusters get-credentials istio

Looge klastrihalduri 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 klastrirooli sidumine Tillerile:

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

Omandage Tiller namespace'is kubectl -n kube-system edit cm kubelet-config-1.16:

helm init --service-account tiller

Peaksite kaaluda SSL kasutamist Helm'i ja Tilleri vahel. Rohkem teavet Helm'i installatsiooni turvalisuse kohta leiate aadressilt docs.helm.sh

Kinnitage seaded:

kubectl -n istio-system get svc

Mõne sekundi jooksul peab GCP määrama teenusele välise IP-aadressi istio-ingressgateway.

Istio sissepääsu värava seadistamine

Looge staatiline IP-aadress nimega istio-gateway, kasutades Istio värava 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 juurdepääsu oma DNS-registraatorile. Lisage kaks A-vandet (asendage example.com oma domeeniga):

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

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

watch host test.istio.example.com

Looge ühine Istio värav, et pakkuda teenuseid väljaspool teenuste võrku 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 failina public-gateway.yaml ja seejärel rakenda see:

kubectl apply -f ./public-gateway.yaml

Ükski tootmissüsteem ei tohiks pakkuda teenuseid internetis ilma SSL-ita. Istio sissepääsu värava kaitsmiseks cert-manager'i, CloudDNS ja Let's Encryptiga lugege palun dokumentatsioon Flagger GKE.

Flaggeri paigaldamine

GKE Istio täienduses ei ole Prometheuse eksemplari, mis tegeleb Istio telemeetriateenuse puhastamisega. Kuna Flagger kasutab kannu analüüsimiseks Istio HTTP meetrikaid, peate paigaldama järgmise Prometheuse seadistuse, mis on sarnane ametlikule Istio Helmi skeemile.

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

Lisage Flagger Helm'i repo:

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

Omandage Flagger namespace'is istio-system, sealhulgas Slack'i 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

Saate Flaggerit paigaldada igasse namespace'i, kui see suudab suhelda Istio Prometheuse teenusega pordi 9090 kaudu.

Flaggeril on Grafana paneel kannu analüüsimiseks. Paigaldage Grafana namespace'is 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 avatuks avatud värava kaudu, 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 eelmainitud ressurss failina grafana-virtual-service.yaml ja seejärel rakendage see:

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

Kui lähete aadressile http://grafana.istio.example.com peaks teid suunama Grafana sisselogimise lehele.

Veebirakenduste juurutamine Flaggeriga

Flagger juurutab Kuberneteses ja vajadusel horisontaalse automaatse skaleerimise (HPA), seejärel loob rea objekte (Kubernetese juurutamised, ClusterIP teenused ja Istio virtuaalsed teenused). Need objektid avavad rakenduse teenuse meshis ja haldavad kanali analüüsi ja edendamist.

Automaatne canary-deploy Flaggeri ja Istio abil

Looge testneimi ruum, kus on sisse lülitatud Istio Sidecari juurutamine:

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

Looge juurutamine ja automaatne horisontaalne skaleerimisriist:

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

Deployige testkoormuse teenus, et genereerida liiklust kanali analüüsi ajal:

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

Looge kohandatud kanali 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/"

Salvestage eelmainitud ressurss failina podinfo-canary.yaml ja seejärel rakendage see:

kubectl apply -f ./podinfo-canary.yaml

Ülaltoodud analüüs, kui see õnnestub, toimib viie minuti jooksul, kontrollides HTTP mõõdikuid iga poole minuti järel. Saate määrata minimaalset aega kanali juurutamise kontrollimiseks ja edendamiseks järgmise valemi alusel: interval * (maxWeight / stepWeight). Kanali CRD väljendid on dokumenteeritud siin.

Mõne sekundi jooksul loob Flagger kannali objekte:

# 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 versiooni numbrit demonäidisest.

Automaatne kanari analüüs ja edendamine

Flagger rakendab halduse tsükli, mis samm-sammult suunab liiklust kanarile, samal ajal mõõtes olulisi tulemuslikkuse näitajaid, nagu HTTP-päringute edukuse määr, päringute keskmine kestus ja pods'i töökindlus. KPI analüüsi põhjal kas edendatakse või peatatakse kanari ning analüüsi tulemused avaldatakse Slackis.

Automaatne canary-deploy Flaggeri ja Istio abil

Kanari juurutus käivitatakse, kui muudatakse mõnda järgmistest objektidest:

  • Juurutus PodSpec (konteineri pilt, käsk, pordid, keskkond jne)
  • ConfigMaps monteeritakse mahtudena või muudetakse keskkonnamuutujateks
  • Saladused monteeritakse mahtudena või muudetakse keskkonnamuutujateks

Kanari juurutuse käivitamine konteineri pildi uuendamisel:

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

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

kubectl -n test describe canary/podinfo

Sündmused:

Uus versioon tuvastatud podinfo.test
Skaalimine üles podinfo.test
Ootan, et podinfo.test juurutamine lõpetataks: 0 1-st värskendatud koopiast on saadaval
Edelda podinfo.test kanari kaalu 5
Edelda podinfo.test kanari kaalu 10
Edelda podinfo.test kanari kaalu 15
Edelda podinfo.test kanari kaalu 20
Edelda podinfo.test kanari kaalu 25
Edelda podinfo.test kanari kaalu 30
Edelda podinfo.test kanari kaalu 35
Edelda podinfo.test kanari kaalu 40
Edelda podinfo.test kanari kaalu 45
Edelda podinfo.test kanari kaalu 50
Kopeeri podinfo.test malli spetsifikatsioon podinfo-primary.test
Ootan, et podinfo-primary.test juurutamine lõpetataks: 1 2-st värskendatud koopiast on saadaval
Edendamine lõpetatud! Skaalimine allapoole podinfo.test

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

Automaatne canary-deploy Flaggeri ja Istio abil

Pange tähele: kui uusi muudatusi rakendada juurutusele kanari analüüsi ajal, siis Flagger käivitab analüüsifaasi uuesti.

Koostage nimekiri kõigist „kanaridest“ 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, siis saate järgmised sõnumid:

Automaatne canary-deploy Flaggeri ja Istio abil

Automaatne tagasivõtmine

Kanari analüüsi käigus saab genereerida sünteetilisi HTTP 500 vigu ja kõrgeid vastuse viivitusi, et kontrollida, kas Flagger peatab juurutuse.

Looge testpood ja käitage see järgmine käsk:

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:

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

Kui ebaõnnestunud kontrolle on piisavalt palju, suunatakse liiklus tagasi põhikanalile, kanarakk skaleeritakse nulli ja juurutus märgistatakse kui ebaõnnestunud.

Kananäidud ja viivituspiigid registreeritakse Kubernetes'e sündmustena ja Flagger salvestab need JSON-vormingus:

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

Algab kanarakkude juurutamine podinfo.test
Kanaraku podinfo.test kaal 5
Kanaraku podinfo.test kaal 10
Kanaraku podinfo.test kaal 15
Peata podinfo.test edasiviimise edu määr 69,17% < 99%
Peata podinfo.test edasiviimise edu määr 61,39% < 99%
Peata podinfo.test edasiviimise edu määr 55,06% < 99%
Peata podinfo.test edasiviimise edu määr 47,00% < 99%
Peata podinfo.test edasiviimise edu määr 37,00% < 99%
Peata podinfo.test edasiviimise taotluse kestus 1,515s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 1,600s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 1,915s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 2,050s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 2,515s > 500ms
Tagasi pööramine podinfo.test ebaõnnestunud kontrolle, läviväärtus saavutatud 10
Kanarakud ebaõnnestusid! Podinfo.test skaleerimine alla

Kui olete sisse lülitanud Slack'i teated, saate teate, kui tähtaeg ületatakse või juurutamise maksimaalne ebaõnnestumiste arv saavutatakse:

Automaatne canary-deploy Flaggeri ja Istio abil

Kokkuvõtteks

Teenuste andmevõrgu, näiteks Istio käivitamine koos Kubernetesega, annab automaatsed mõõtmised, logid ja protokollid, kuid töökoormuste seadistamine sõltub endiselt välistest tööriistadest. Flagger püüab olukorda muuta, lisades Istio võimeid progressiivne tarnimine.

Flagger on ühilduv igasuguste CI/CD lahendustega Kubernetes'e jaoks, ja kanarakkude analüüsi saab hõlpsasti laiendada veebikühendustega süsteemi integreerimise/aktsepteerimise testide, koormustestide või mis tahes muude kohandatud kontrollide teostamiseks. Kuna Flagger on deklaratiivne ja reageerib Kubernetes'e sündmustele, saab seda kasutada GitOps'i töövoogudes koos Weave Flux või JenkinsX. Kui kasutate JenkinsX, saate Flaggeri installida jx pistikprogrammide kaudu.

Flaggerit toetab Weaveworks ja toetab kanarakkude juurutusi Weave Cloud. Projekt on katsetatud GKE, EKS ja "puhtal riistvaral" kubeadm-iga.

Kui teil on ettepanekuid Flaggeri parendamiseks, palun saatke küsimus või PR GitHubis aadressil stefanprodan/flagger. Panused on rohkem kui teretulnud!

Aitäh Rey Tsan.

Allikas: habr.com

Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid 🔥 Osta usaldusväärne veebimajutus DDoS-kaitsega veebisaitidele, VPS VDS serverid - ProHoster