Automatické canary deploye s Flagger a Istio

Automatické canary deploye s Flagger a Istio

CD je uznáno jako praxe podnikového softwaru; je to výsledek přirozené evoluce ustálených principů CI. Nicméně CD je stále poměrně vzácný jev, pravděpodobně kvůli složitosti řízení a strachu z neúspěšných nasazení, která ovlivňují dostupnost systému.

Flagger je open-source operátor Kubernetes, jehož cílem je vyloučit složité vzájemné vztahy. Automatizuje propagaci canary nasazení pomocí odklonu provozu Istio a metrik Prometheus pro analýzu chování aplikace během řízeného nasazení.

Níže je uveden podrobný návod k nastavení a používání Flagger v Google Kubernetes Engine (GKE).

Nastavení cloudu Kubernetes

Začínáte vytvořením klastru GKE s nadstavbou Istio (pokud nemáte účet GCP, můžete se zaregistrovat zde pro získání bezplatných kreditů).

Přihlaste se do Google Cloud, vytvořte projekt a povolte pro něj billing. Nainstalujte příkazový nástroj gcloud a nastavte svůj projekt pomocí gcloud init.

Nastavte výchozí projekt, oblast výpočtu a zónu (nahraďte PROJECT_ID svým projektem):

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

Povolte službu GKE a vytvořte klastr 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

Výše uvedený příkaz vytvoří výchozí skupinu uzlů obsahující dvě VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideálně byste měli izovat komponenty Istio od svých pracovních zátěží, ale neexistuje jednoduchý způsob, jak spustit podys Istio ve vyhrazené skupině uzlů. Manifesty Istio se považují za jen pro čtení a GKE zruší jakékoli změny, například připojení k uzlu nebo odpojení od podu.

Nastavte pověření pro kubectl:

gcloud container clusters get-credentials istio

Vytvořte vazbu role cluster admin:

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

Nainstalujte příkazový nástroj Helm:

brew install kubernetes-helm

Homebrew 2.0 je nyní také k dispozici pro Linux.

Vytvořte účet služby a vazbu role klastru pro Tiller:

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

Nasazení Tilleru v prostoru názvů kube-system:

helm init --service-account tiller

Zvažte použití SSL mezi Helm a Tiller. Další informace o zabezpečení instalace Helm naleznete na docs.helm.sh

Ověřte nastavení:

kubectl -n istio-system get svc

Za několik sekund by měl GCP přidělit externí IP adresu pro službu istio-ingressgateway.

Nastavení vstupní brány Istio

Vytvořte statickou IP adresu s názvem 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

Nyní potřebujete internetovou doménu a přístup k registrátorovi DNS. Přidejte dvě A záznamy (nahraďte example.com svou doménou):

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

Ujistěte se, že zástupný symbol DNS funguje:

watch host test.istio.example.com

Vytvoření veřejné brány Istio pro poskytování služeb mimo service mesh přes 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 výše uvedený prostředek jako public-gateway.yaml a poté ho aplikujte:

kubectl apply -f ./public-gateway.yaml

Žádný produkční systém by neměl poskytovat služby na internetu bez SSL. Pro zabezpečení vstupní brány Istio pomocí cert-manageru, CloudDNS a Let’s Encrypt si prosím přečtěte dokumentaci Flagger GKE.

Instalace Flagger

Nastavení GKE Istio neobsahuje instance Promethea, které se starají o údržbu telemetrické služby Istio. Protože Flagger využívá metriky Istio HTTP pro provedení analýzy canary, musíte nasadit následující konfiguraci Promethea, podobnou té, která je dodávána s oficiální schémou Istio Helm.

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

Přidejte repozitář Flagger Helm:

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

Nasazení Flaggeru v prostoru názvů istio-system, s povolenými notifikacemi 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 nainstalovat v jakémkoli prostoru názvů, pokud může komunikovat se službou Istio Prometheus přes port 9090.

Flagger má grafickou konzoli Grafana pro analýzu canary. Nainstalujte Grafanu do prostoru názvů 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

Otevřete Grafana přes veřejný bránu vytvořením virtuální služby (nahraďte example.com svou 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 výše uvedený zdroj jako grafana-virtual-service.yaml a poté jej aplikujte:

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

Při přechodu na http://grafana.istio.example.com by vás měl prohlížeč nasměrovat na přihlašovací stránku Grafana.

Nasazení webových aplikací s Flagger

Flagger nasazuje Kubernetes a v případě potřeby horizontální automatické škálování (HPA), poté vytváří sérii objektů (nasazení Kubernetes, služby ClusterIP a virtuální služby Istio). Tyto objekty zpřístupňují aplikaci v service mesh a spravují canary analýzu a propagaci.

Automatické canary deploye s Flagger a Istio

Vytvořte testovací namespace s povoleným nasazením Istio Sidecar:

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

Vytvořte nasazení a nástroj pro automatické horizontální škálování podů:

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

Nasazení zkušební zátěžové služby pro generování provozu během canary analýzy:

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

Vytvořte uživatelsky definovaný canary zdroj (nahraďte example.com svou 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 výše uvedený zdroj jako podinfo-canary.yaml a poté jej aplikujte:

kubectl apply -f ./podinfo-canary.yaml

Výše uvedená analýza, v případě úspěchu, se bude provádět po dobu pěti minut s kontrolou metrik HTTP každých třicet sekund. Můžete určit minimální čas potřebný k ověření a propagaci canary nasazení podle následujícího vzorce: interval * (maxWeight / stepWeight). Pole Canary CRD jsou zdokumentována zde.

Během několika sekund Flagger vytvoří 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

Otevřete prohlížeč a přejděte na app.istio.example.com, měli byste vidět číslo verze demo aplikace.

Automatická analýza a propagace kanárků

Flagger implementuje řídicí cyklus, který postupně přesouvá provoz na kanárka, zároveň měří klíčové ukazatele výkonu, jako je úspěšnost HTTP požadavků, průměrná doba odpovědi a dostupnost podu. Na základě analýzy KPI je kanárek buď propagován, nebo přerušen, a výsledky analýzy jsou publikovány na Slacku.

Automatické canary deploye s Flagger a Istio

Kanárkový nasazení se spouští při změně jedné z následujících objektů:

  • Nasazení PodSpec (obraz kontejneru, příkaz, porty, env atd.)
  • ConfigMaps jsou montovány jako svazky nebo převáděny na proměnné prostředí
  • Tajný klíče jsou montovány jako svazky nebo převáděny na proměnné prostředí

Spuštění kanárkového nasazení při aktualizaci obrazu kontejneru:

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

Flagger zjistí, že verze nasazení byla změněna, a začne ji analyzovat:

kubectl -n test describe canary/podinfo

Události:

Byla detekována nová revize podinfo.test
Zvyšování podinfo.test
Čekání na dokončení nasazení podinfo.test: 0 z 1 aktualizovaných replik je k dispozici
Pokrok s váhou kanárka podinfo.test 5
Pokrok s váhou kanárka podinfo.test 10
Pokrok s váhou kanárka podinfo.test 15
Pokrok s váhou kanárka podinfo.test 20
Pokrok s váhou kanárka podinfo.test 25
Pokrok s váhou kanárka podinfo.test 30
Pokrok s váhou kanárka podinfo.test 35
Pokrok s váhou kanárka podinfo.test 40
Pokrok s váhou kanárka podinfo.test 45
Pokrok s váhou kanárka podinfo.test 50
Kopírování šablony podinfo.test do podinfo-primary.test
Čekání na dokončení nasazení podinfo-primary.test: 1 z 2 aktualizovaných replik je k dispozici
Propagace dokončena! Snižování podinfo.test

Během analýzy lze výsledky kanárků sledovat pomocí Grafany:

Automatické canary deploye s Flagger a Istio

Všimněte si: pokud během analýzy kanárků použijete nové změny týkající se nasazení, Flagger restartuje fázi analýzy.

Vytvořte seznam všech "kanárků" ve vašem klastru:

watch kubectl get canaries --all-namespaces
NAMESPACE   NAME      STATUS        WEIGHT   LASTTRANSITIONTIME
test        podinfo   Probíhá      15       2019-01-16T14:05:07Z
prod        frontend  Úspěšné      0        2019-01-15T16:15:07Z
prod        backend   Neúspěšné    0        2019-01-14T17:05:07Z

Pokud jste aktivovali upozornění Slack, obdržíte následující zprávy:

Automatické canary deploye s Flagger a Istio

Automatický rollback

Během analýzy kanárků lze generovat syntetické chyby HTTP 500 a vysokou latenci odpovědi, aby se ověřilo, zda Flagger nezastaví nasazení.

Vytvořte testovací pod a proveďte v něm následující akci:

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

Generování chyb HTTP 500:

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

Generování latence:

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

Když počet neúspěšných kontrol dosáhne prahové hodnoty, provoz se vrací zpět na primární kanál, canary se škáluje na nulu a nasazení je označeno jako neúspěšné.

Chyby canary a vrcholy zpoždění jsou registrovány jako události Kubernetes a zaznamenány Flagger ve formátu JSON:

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

Zahájení canary nasazení pro podinfo.test
Zvyšení podinfo.test canary váha 5
Zvyšení podinfo.test canary váha 10
Zvyšení podinfo.test canary váha 15
Zastavit pokrok podinfo.test úspěšnost 69.17% < 99%
Zastavit pokrok podinfo.test úspěšnost 61.39% < 99%
Zastavit pokrok podinfo.test úspěšnost 55.06% < 99%
Zastavit pokrok podinfo.test úspěšnost 47.00% < 99%
Zastavit pokrok podinfo.test úspěšnost 37.00%  500ms
Zastavit pokrok podinfo.test doba požadavku 1.600s > 500ms
Zastavit pokrok podinfo.test doba požadavku 1.915s > 500ms
Zastavit pokrok podinfo.test doba požadavku 2.050s > 500ms
Zastavit pokrok podinfo.test doba požadavku 2.515s > 500ms
Vracíme zpět podinfo.test prah neúspěšných kontrol dosáhl 10
Canary selhal! Snižujeme podinfo.test

Pokud jste aktivovali upozornění Slack, dostanete zprávu, když bude překročena doba zpracování nebo dosaženo maximálního počtu neúspěšných kontrol během analýzy:

Automatické canary deploye s Flagger a Istio

Na závěr

Spuštění service mesh, například Istio, navíc ke Kubernetes poskytne automatické metriky, logy a protokoly, ale nasazení pracovních zátěží stále závisí na externích nástrojích. Flagger se snaží tuto situaci změnit přidáním IoT schopností progresivního dodávání.

Flagger je kompatibilní s jakýmikoli CI/CD řešeními pro Kubernetes a canary analýzu lze snadno rozšířit pomocí webhooků k provádění systémových testů integrace/přijetí, zátěžových testů nebo jakýchkoli dalších uživatelských kontrol. Protože Flagger je deklarativní a reaguje na události Kubernetes, lze jej použít v GitOps pipeline spolu s Weave Flux nebo JenkinsX. Pokud používáte JenkinsX, můžete nainstalovat Flagger s přídavky jx.

Flagger je podporován Weaveworks a poskytuje canary nasazení v Weave Cloud. Projekt je testován na GKE, EKS a "holém železe" s kubeadm.

Pokud máte návrhy na zlepšení Flagger, prosím, odešlete dotaz nebo PR na GitHub na adrese stefanprodan/flagger. Příspěvky jsou více než vítány!

Děkuji Rayi Csan.

Zdroj: habr.com

Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery 🔥 Koupit spolehlivý hosting pro webové stránky s ochranou proti DDoS, VPS VDS servery | ProHoster