Automatické nasadenie kanárikov pomocou Flagger a Istio

Automatické nasadenie kanárikov pomocou Flagger a Istio

CD je uznávaný ako podnikový softvér a je výsledkom prirodzeného vývoja zavedených princípov CI. CD je však stále dosť zriedkavé, možno kvôli zložitosti správy a strachu z neúspešného nasadenia ovplyvňujúceho dostupnosť systému.

Nahlasovateľ je open source operátor Kubernetes, ktorého cieľom je eliminovať mätúce vzťahy. Automatizuje propagáciu nasadení kanárikov pomocou Istio traffic offset a metrík Prometheus na analýzu správania aplikácií počas riadeného zavádzania.

Nižšie je uvedený podrobný sprievodca nastavením a používaním Flagger na Google Kubernetes Engine (GKE).

Nastavenie klastra Kubernetes

Začnete vytvorením klastra GKE pomocou doplnku Istio (ak nemáte účet GCP, môžete sa zaregistrovať tu - získať bezplatné kredity).

Prihláste sa do služby Google Cloud, vytvorte projekt a povoľte jeho fakturáciu. Nainštalujte pomôcku príkazového riadka gcloud a nastavte svoj projekt pomocou gcloud init.

Nastavte predvolený projekt, výpočtovú oblasť a zónu (nahradiť PROJECT_ID pre váš projekt):

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

Povoľte službu GKE a vytvorte klaster s doplnkami HPA a 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

Vyššie uvedený príkaz vytvorí predvolenú oblasť uzlov vrátane dvoch virtuálnych počítačov n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). V ideálnom prípade by ste mali izolovať komponenty Istio od svojich pracovných úloh, ale neexistuje jednoduchý spôsob, ako spustiť Istio Pods vo vyhradenej skupine uzlov. Manifesty Istio sa považujú len na čítanie a GKE vráti späť všetky zmeny, ako napríklad prepojenie s uzlom alebo odpojenie od modulu.

Nastaviť poverenia pre kubectl:

gcloud container clusters get-credentials istio

Vytvorte väzbu roly správcu klastra:

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

Nainštalujte nástroj príkazového riadka kormidlo:

brew install kubernetes-helm

Homebrew 2.0 je teraz k dispozícii aj pre Linux.

Vytvorte servisný účet a väzbu roly klastra pre Tiller:

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

Rozbaľte Tiller v priestore názvov kube-system:

helm init --service-account tiller

Mali by ste zvážiť použitie SSL medzi Helm a Tiller. Ďalšie informácie o ochrane vašej inštalácie Helm nájdete v časti docs.helm.sh

Potvrďte nastavenia:

kubectl -n istio-system get svc

Po niekoľkých sekundách by mala služba GCP priradiť externú adresu IP pre službu istio-ingressgateway.

Konfigurácia vstupnej brány Istio

Vytvorte statickú IP adresu s názvom istio-gatewaypomocou IP adresy 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 registrátorovi DNS. Pridajte dva záznamy A (nahraďte example.com na vašu doménu):

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

Overte, či funguje zástupný znak DNS:

watch host test.istio.example.com

Vytvorte všeobecnú bránu Istio na poskytovanie služieb mimo sieť služieb 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 použite:

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, prečítajte si dokumentácia Flagger G.K.E.

Inštalácia indikátora

Doplnok GKE Istio nezahŕňa inštanciu Prometheus, ktorá čistí telemetrickú službu Istio. Pretože Flagger používa metriky Istio HTTP na vykonanie analýzy kanárikov, 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 úložisko Flagger Helm:

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

Rozbaľte Flagger na priestor názvov istio-systempovolením upozornení 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ť do akéhokoľvek menného priestoru, pokiaľ dokáže komunikovať so službou Istio Prometheus na porte 9090.

Flagger má grafana dashboard pre analýzu kanárikov. 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

Odhaľte Grafana cez otvorenú bránu vytvorením virtuálnej služby (nahradiť example.com na vašu doménu):

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 použite:

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

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

Nasadzovanie webových aplikácií pomocou nástroja Flagger

Flagger nasadí Kubernetes a voliteľne sa automaticky škáluje (HPA), potom vytvorí sériu objektov (nasadenia Kubernetes, služby ClusterIP a virtuálne služby Istio). Tieto objekty vystavujú aplikáciu servisnej sieti a kontrolujú analýzu a postup kanárikov.

Automatické nasadenie kanárikov pomocou Flagger a Istio

Vytvorte testovací priestor názvov s povoleným vstrekovaním Istio Sidecar:

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

Vytvorte nástroj na nasadenie a automatické škálovanie modulu:

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

Nasaďte službu testovacieho zaťaženia na generovanie návštevnosti počas analýzy canary:

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

Vytvorte vlastný kanársky zdroj (nahradiť example.com na vašu doménu):

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 použite:

kubectl apply -f ./podinfo-canary.yaml

Ak bude vyššie uvedená analýza úspešná, pobeží päť minút a každú polminútu kontroluje metriky HTTP. Minimálny čas potrebný na overenie a podporu nasadenia canary môžete určiť pomocou nasledujúceho vzorca: interval * (maxWeight / stepWeight). Polia Canary CRD sú zdokumentované tu.

Po niekoľkých sekundách Flagger vytvorí kanárske 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 ukážkové aplikácie.

Automatická analýza a propagácia kanárikov

Flagger implementuje riadiacu slučku, ktorá postupne presúva návštevnosť do kanárika a zároveň meria kľúčové metriky výkonu, ako je úspešnosť požiadaviek HTTP, priemerné trvanie požiadavky a stav pod. Na základe analýzy KPI sa kanárik povýši alebo preruší a výsledky analýzy sa zverejnia Slacku.

Automatické nasadenie kanárikov pomocou Flagger a Istio

Nasadenie Canary sa spustí, keď sa zmení jeden z nasledujúcich objektov:

  • Nasadiť PodSpec (obrázok kontajnera, príkaz, porty, env atď.)
  • ConfigMaps sú pripojené ako zväzky alebo mapované na premenné prostredia
  • Tajomstvá sú pripojené ako zväzky alebo konvertované na premenné prostredia

Spustite nasadenie canary pri aktualizácii obrázka 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

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

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

Automatické nasadenie kanárikov pomocou Flagger a Istio

Upozorňujeme, že ak sa na nasadenie použijú nové zmeny počas analýzy canary, Flagger reštartuje fázu analýzy.

Vytvorte zoznam všetkých kanárikov vo svojom klastri:

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

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

Automatické nasadenie kanárikov pomocou Flagger a Istio

Automatické vrátenie späť

Počas analýzy canary môžete generovať syntetické chyby HTTP 500 a vysokú latenciu odozvy, aby ste zistili, či Flagger zastaví nasadenie.

Vytvorte testovací modul a vykonajte v ňom nasledovné:

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:

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

Keď počet neúspešných kontrol dosiahne prahovú hodnotu, prevádzka sa nasmeruje späť na primárny kanál, kanárik sa zníži na nulu a nasadenie sa označí ako neúspešné.

Kanárske chyby a špičky latencie sa zaznamenávajú ako udalosti Kubernetes a zaznamenávajú sa pomocou nástroja Flagger vo formáte JSON:

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

Ak ste povolili upozornenia Slack, dostanete správu, keď sa prekročí konečný termín alebo sa dosiahne maximálny počet neúspešných kontrol v analýze:

Automatické nasadenie kanárikov pomocou Flagger a Istio

na záver

Spustenie servisnej siete ako Istio popri Kubernetes poskytne automatické metriky, protokoly a protokoly, ale nasadenie pracovného zaťaženia stále závisí od externých nástrojov. Flagger sa to snaží zmeniť pridaním funkcií Istio progresívne zásobovanie.

Flagger je kompatibilný s akýmkoľvek riešením Kubernetes CI/CD a analýzu kanárikov možno jednoducho rozšíriť webhooky na vykonanie testov integrácie/akceptácie systému, záťažových testov alebo akýchkoľvek iných vlastných kontrol. Keďže Flagger je deklaratívny a reaguje na udalosti Kubernetes, možno ho použiť v kanáloch GitOps spolu s Weave Flux alebo JenkinsX. Ak používate JenkinsX, môžete nainštalovať Flagger s doplnkami jx.

Podporovaný nahlasovateľ Weaveworks a poskytuje nasadenie kanárikov v Weave Cloud. Projekt sa testuje na GKE, EKS a holom kove s kubeadm.

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

Vďaka Ray Tsang.

Zdroj: hab.com

Pridať komentár