Automatické canary deployy s Flagger a Istio

Automatické canary deployy s Flagger a Istio

CD bol uznaný ako prax podnikového softvéru, čo je výsledok prirodzenej evolúcie ustálených princípov CI. Napriek tomu je CD stále pomerne raritnou záležitosťou, možno kvôli zložitosti správy a strachu z neúspešných nasadení, ktoré ovplyvňujú dostupnosť systému.

Flagger je operátor Kubernetes s otvoreným zdrojovým kód, ktorého cieľom je vylúčiť zložitosti vzájomných vzťahov. Automatizuje propagáciu canary nasadení pomocou presmerovania prevádzky Istio a metriky Prometheus na analýzu správania aplikácie počas kontrolovaného nasadzovania.

Nižšie je uvedený postupný návod na nastavenie a používanie Flagger vo Google Kubernetes Engine (GKE).

Nastavenie klastru Kubernetes

Začnite vytvorením klastru GKE s nadstavbou Istio (ak nemáte účet GCP, môžete sa registrovať tu na získanie bezplatných kreditov).

Prihláste sa do Google Cloud, vytvorte projekt a aktivujte pre neho fakturáciu. Nainštalujte nástroj príkazového riadku gcloud a nastavte svoj projekt pomocou gcloud init.

Nastavte predvolený projekt, oblasť výpočtu a zónu (nahradíte PROJECT_ID svojím projektom):

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

Aktivujte službu GKE a vytvorte klaster s HPA a nadstavbami Istio:

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

Príkaz vyššie vytvorí predvolenú skupinu nód, ktorá obsahuje dve VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideálne by bolo izolovať komponenty Istio od svojich pracovných záťaží, ale neexistuje jednoduchý spôsob, ako spustiť pod Istio v oddelenej skupine nód. Manifesty Istio sú považované za iba na čítanie a GKE zruší akékoľvek zmeny, ako napríklad viazanie na nód alebo odpojenie od podu.

Nastavte prihlasovacie údaje pre kubectl:

gcloud container clusters get-credentials istio

Vytvorte viazanie úlohy administrátora klastru:

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

Nainštalujte nástroj príkazového riadku Helm:

brew install kubernetes-helm

Homebrew 2.0 je teraz tiež k dispozícii pre Linux.

Vytvorte účet služby a viazanie úlohy klastru pre Tiller:

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

Načítať Tiller do menného priestoru kube-system:

helm init --service-account tiller

Mali by ste zvážiť použitie SSL medzi Helm a Tiller. Pre ďalšie informácie o zabezpečení inštalácie Helm si prečítajte docs.helm.sh

Potvrďte nastavenia:

kubectl -n istio-system get svc

O niekoľko sekúnd by GCP mal priradiť externú IP adresu pre službu istio-ingressgateway.

Nastavenie vstupného brány Istio

Vytvorte statickú IP adresu s názvom istio-gateway, používajúc IP adresu brány Istio:

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

Teraz potrebujete internetovú doménu a prístup k vášmu DNS registrátorovi. Pridajte dve A záznamy (nahradiť example.com vašou doménou):

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

Uistite sa, že zástupný symbol DNS funguje:

watch host test.istio.example.com

Vytvorte verejnú bránu Istio na poskytovanie služieb mimo service mesh cez 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:
        - "*"

Uložte vyššie uvedený zdroj ako public-gateway.yaml a potom ho aplikujte:

kubectl apply -f ./public-gateway.yaml

Žiadny produkčný systém by nemal poskytovať služby na internete bez SSL. Ak chcete zabezpečiť vstupnú bránu Istio pomocou cert-manager, CloudDNS a Let’s Encrypt, prosím, prečítajte si dokumentácii Flagger GKE.

Inštalácia Flagger

Nadstavba GKE Istio nezahŕňa nasadenie Prometheus, ktorý sa zaoberá údržbou telemetrickej služby Istio. Keďže Flagger používa metriku Istio HTTP na vykonávanie canary analýzy, musíte nasadiť nasledujúcu konfiguráciu Prometheus, podobnú tej, ktorá sa dodáva s oficiálnou schémou Istio Helm.

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

Pridajte repozitár Flagger Helm:

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

Načítať Flagger do menného priestoru istio-system, vrátane notifikácií Slack:

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

Flagger môžete nainštalovať v akomkoľvek mennom priestore, ak môže interagovať so službou Istio Prometheus cez port 9090.

Flagger má monitorovací panel Grafana pre canary analýzu. Nainštalujte Grafana do menného priestoru 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

Otvorenie Grafany prostredníctvom otvoreného brány vytvorením virtuálnej služby (nahradťe example.com svojou doménou):

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

Uložte vyššie uvedený zdroj ako grafana-virtual-service.yaml a potom ho aplikujte:

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

Pri prechode na http://grafana.istio.example.com v prehliadači by ste mali byť presmerovaní na prihlasovaciu stránku Grafany.

Nasadenie webových aplikácií s Flagger

Flagger nasadzuje Kubernetes a, ak je to potrebné, horizontálne automatické škálovanie (HPA), potom vytvára sériu objektov (nasadenia Kubernetes, služby ClusterIP a virtuálne služby Istio). Tieto objekty odhaľujú aplikáciu v service mesh a riadia canary analýzu a propagáciu.

Automatické canary deployy s Flagger a Istio

Vytvorte testovací názov priestor s povoleným zavedením Istio Sidecar:

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

Vytvorte nasadenie a nástroj na automatické horizontálne škálovanie podu:

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

Nasadte testovaciu záťažovú službu na generovanie prevádzky počas canary analýzy:

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

Vytvorte vlastný canary zdroj (nahradťe example.com vašou doménou):

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

Uložte vyššie uvedený zdroj ako podinfo-canary.yaml a potom ho aplikujte:

kubectl apply -f ./podinfo-canary.yaml

Vyššie uvedená analýza, v prípade úspechu, bude prebiehať počas piatich minút s kontrolou metrik HTTP každých pol minúty. Môžete určiť minimálny čas potrebný na kontrolu a propagáciu canary nasadenia podľa nasledujúcej formulácie: interval * (maxWeight / stepWeight). Polia Canary CRD sú zdokumentované tu.

O pár sekúnd neskôr Flagger vytvorí canary objekty:

# 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

Otvorte prehliadač a prejdite na app.istio.example.com, mali by ste vidieť číslo verzie demonštračnej aplikácie.

Automatická canary analýza a propagácia

Flagger implementuje riadiaci cyklus, ktorý postupne presúva dopravu na canary a súčasne meria kľúčové ukazovatele výkonnosti, ako je miera úspešnosti HTTP požiadaviek, priemerná doba trvania požiadaviek a dostupnosť podu. Na základe analýzy KPI sa canary posúva alebo preruší a výsledky analýzy sa zverejňujú v Slacku.

Automatické canary deployy s Flagger a Istio

Canary nasadenie sa spúšťa pri zmene jedného z nasledujúcich objektov:

  • Nasadenie PodSpec (obraz kontajnera, príkaz, porty, env a pod.)
  • ConfigMaps sú pripevnené ako zväzky alebo premenené na premenné prostredia
  • Tajomstvá sú pripevnené ako zväzky alebo premenené na premenné prostredia

Spustenie canary nasadenia pri aktualizácii obrazu kontajnera:

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

Flagger zistí, že verzia nasadenia sa zmenila, a začne ju analyzovať:

kubectl -n test describe canary/podinfo

Udalosti:

Nová revízia zistená podinfo.test
Zvyšovanie podinfo.test
Čakanie na dokončenie rollout podinfo.test: 0 z 1 aktualizovaných replik je k dispozícii
Pokročil podinfo.test canary hmotnosť 5
Pokročil podinfo.test canary hmotnosť 10
Pokročil podinfo.test canary hmotnosť 15
Pokročil podinfo.test canary hmotnosť 20
Pokročil podinfo.test canary hmotnosť 25
Pokročil podinfo.test canary hmotnosť 30
Pokročil podinfo.test canary hmotnosť 35
Pokročil podinfo.test canary hmotnosť 40
Pokročil podinfo.test canary hmotnosť 45
Pokročil podinfo.test canary hmotnosť 50
Kopírovanie šablóny podinfo.test do podinfo-primary.test
Čakanie na dokončenie rollout podinfo-primary.test: 1 z 2 aktualizovaných replik je k dispozícii
Propagácia dokončená! Znižovanie podinfo.test

Počas analýzy je možné sledovať výsledky canary pomocou Grafany:

Automatické canary deployy s Flagger a Istio

Upozorňujeme: ak sa nové zmeny uplatnia na nasadení počas canary analýzy, Flagger reštartuje fázu analýzy.

Vytvorte zoznam všetkých „kanárikov“ vo vašom klastri:

watch kubectl get canaries --all-namespaces
NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
test        podinfo   Prebieha      15       2019-01-16T14:05:07Z
prod        frontend  Úspešne      0        2019-01-15T16:15:07Z
prod        backend   Zlyhalo       0        2019-01-14T17:05:07Z

Ak ste povolili upozornenia Slack, dostanete nasledujúce správy:

Automatické canary deployy s Flagger a Istio

Automatický návrat

Počas canary analýzy je možné generovať syntetické chyby HTTP 500 a vysoké oneskorenie odpovede, aby ste skontrolovali, či Flagger nezastaví nasadenie.

Vytvorte testovací pod a vykonajte v ňom nasledujúcu akciu:

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

Generovanie chýb HTTP 500:

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

Generovanie oneskorenia:

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

Keď počet neúspešných kontrol dosiahne prahovú hodnotu, prevádzka sa vráti do primárneho kanála, kanárik sa škáluje na nulu a nasadenie je označené ako zlyhané.

Chyby kanárikového nasadenia a vrcholy oneskorení sú zaznamenávané ako udalosti Kubernetes a zapisované Flaggerom vo formáte JSON:

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

Začínam kanárikové nasadenie pre podinfo.test
Zvýšim kanárikovú hmotnosť podinfo.test na 5
Zvýšim kanárikovú hmotnosť podinfo.test na 10
Zvýšim kanárikovú hmotnosť podinfo.test na 15
Pozastavím pokrok podinfo.test, úspešnosť 69.17% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 61.39% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 55.06% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 47.00% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 37.00%  500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 1.600s > 500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 1.915s > 500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 2.050s > 500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 2.515s > 500ms
Vraciam späť podinfo.test, dosiahnutý prah neúspešných kontrol 10
Kanár zlyhal! Znižujem výkon podinfo.test

Ak ste povolili oznámenia Slack, dostanete správu, keď prekročíte časový limit alebo dosiahnete maximálny počet neúspešných kontrol počas analýzy:

Automatické canary deployy s Flagger a Istio

Na záver

Spustenie service mesh, ako je Istio, navyše k Kubernetes poskytne automatické metriky, logy a protokoly, ale nasadenie pracovných zaťažení stále závisí od externých nástrojov. Flagger sa snaží túto situáciu zmeniť pridaním možností Istio progresívne dodávky.

Flagger je kompatibilný s akýmikoľvek CI/CD riešeniami pre Kubernetes a kanárikový test možno ľahko rozšíriť pomocou webhookov na vykonávanie systémových testov integrácie/prijatia, záťažových testov alebo akýchkoľvek iných používateľských kontrol. Keďže Flagger je deklaratívny a reaguje na udalosti Kubernetes, môže sa používať v GitOps pipeline spolu s Weave Flux alebo JenkinsX. Ak používate JenkinsX, môžete nainštalovať Flagger s jx doplnkami.

Flagger podporujú Weaveworks a poskytuje kanárikové nasadenia v Weave Cloud. Projekt je testovaný na GKE, EKS a „holom železe“ s kubeadm.

Ak máte návrhy na zlepšenie Flagger, prosím, pošlite otázku alebo PR na GitHub na adrese stefanprodan/flagger. Príspevky sú viac než vítané!

Ďakujem Ray Zhu.

Zdroj: habr.com

Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Kúpte si spoľahlivý hosting pre webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster