Automatska implementacija kanarinca uz Flagger i Istio

Automatska implementacija kanarinca uz Flagger i Istio

CD je prepoznat kao praksa poslovnog softvera i rezultat je prirodne evolucije uspostavljenih principa CI. Međutim, CD je još uvijek prilično rijedak, možda zbog složenosti upravljanja i straha od neuspjelih implementacija koje utiču na dostupnost sistema.

flagger je Kubernetes operater otvorenog koda koji ima za cilj da eliminiše zbunjujuće odnose. Automatizira promociju Canary implementacije koristeći Istio pomak prometa i Prometheus metriku za analizu ponašanja aplikacije tokom upravljanog uvođenja.

U nastavku je vodič korak po korak za postavljanje i korištenje Flaggera na Google Kubernetes Engine (GKE).

Postavljanje Kubernetes klastera

Počinjete kreiranjem GKE klastera sa Istio dodatkom (ako nemate GCP nalog, možete se prijaviti ovdje - da dobijete besplatne kredite).

Prijavite se na Google Cloud, kreirajte projekat i omogućite naplatu za njega. Instalirajte uslužni program komandne linije gcloud i postavite svoj projekat sa gcloud init.

Postavite zadani projekat, područje računanja i zonu (zamijenite PROJECT_ID za vaš projekat):

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

Omogućite GKE uslugu i kreirajte klaster s HPA i Istio dodacima:

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

Gornja komanda će kreirati podrazumevani skup čvorova uključujući dva VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). U idealnom slučaju, trebali biste izolirati Istio komponente od svojih radnih opterećenja, ali ne postoji jednostavan način da pokrenete Istio Pods u namjenskom skupu čvorova. Istio manifesti se smatraju samo za čitanje i GKE će poništiti sve promjene, kao što je povezivanje s čvorom ili odvajanje od pod.

Postavite vjerodajnice za kubectl:

gcloud container clusters get-credentials istio

Kreirajte vezivanje uloge administratora klastera:

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

Instalirajte alat komandne linije kormilo:

brew install kubernetes-helm

Homebrew 2.0 je sada dostupan i za Linux.

Kreirajte račun usluge i vezanje uloge klastera za Tiller:

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

Proširite Tiller u imenskom prostoru kube-system:

helm init --service-account tiller

Trebali biste razmisliti o korištenju SSL-a između Helma i Tillera. Za više informacija o zaštiti vaše instalacije Helm, pogledajte docs.helm.sh

Potvrdite postavke:

kubectl -n istio-system get svc

Nakon nekoliko sekundi, GCP bi trebao dodijeliti eksternu IP adresu za uslugu istio-ingressgateway.

Konfiguriranje Istio Ingress Gatewaya

Kreirajte statičku IP adresu s imenom istio-gatewaykoristeći IP adresu Istio gatewaya:

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

Sada vam je potrebna internet domena i pristup vašem DNS registratoru. Dodajte dva A zapisa (zamijenite example.com na vašu domenu):

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

Provjerite radi li DNS zamjenski znak:

watch host test.istio.example.com

Kreirajte generički Istio gateway za pružanje usluga izvan servisne mreže preko HTTP-a:

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

Sačuvajte gornji resurs kao public-gateway.yaml i zatim ga primijenite:

kubectl apply -f ./public-gateway.yaml

Nijedan proizvodni sistem ne bi trebao pružati usluge na Internetu bez SSL-a. Da biste osigurali Istio ulazni gateway s cert-managerom, CloudDNS-om i Let's Encrypt, pročitajte dokumentaciju Flagger G.K.E.

Instalacija za označavanje

GKE Istio dodatak ne uključuje Prometheus instancu koja čisti Istio telemetrijski servis. Budući da Flagger koristi Istio HTTP metriku za izvođenje kanarinske analize, morate implementirati sljedeću Prometheus konfiguraciju, sličnu onoj koja dolazi sa službenom Istio Helm šemom.

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

Dodajte spremište Flagger Helm:

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

Proširite Flagger u imenski prostor istio-systemomogućavanjem Slack obavještenja:

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

Možete instalirati Flagger u bilo koji prostor imena sve dok može komunicirati sa Istio Prometheus uslugom na portu 9090.

Flagger ima Grafana kontrolnu tablu za analizu kanarinca. Instalirajte Grafanu u imenskom prostoru 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

Izložite Grafanu kroz otvoreni gateway kreiranjem virtuelne usluge (zamijenite example.com na vašu domenu):

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

Sačuvajte gornji resurs kao grafana-virtual-service.yaml i zatim ga primijenite:

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

Prilikom preseljenja u http://grafana.istio.example.com u pretraživaču, trebali biste biti preusmjereni na stranicu za prijavu na Grafana.

Postavljanje web aplikacija sa Flagger-om

Flagger postavlja Kubernetes i opciono automatski skalira (HPA), a zatim kreira niz objekata (Kubernetes implementacije, ClusterIP usluge i Istio virtuelne usluge). Ovi objekti izlažu aplikaciju servisnoj mreži i kontrolišu analizu i napredak kanaraca.

Automatska implementacija kanarinca uz Flagger i Istio

Kreirajte probni imenski prostor s omogućenom Istio Sidecar injekcijom:

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

Kreirajte implementaciju i alat za automatsko skaliranje:

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

Postavite uslugu testnog opterećenja za generiranje prometa tokom analize kanaraca:

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

Kreirajte prilagođeni resurs kanarinca (zamijenite example.com na vašu domenu):

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

Sačuvajte gornji resurs kao podinfo-canary.yaml i zatim ga primijenite:

kubectl apply -f ./podinfo-canary.yaml

Gornja analiza, ako je uspješna, trajat će pet minuta, provjeravajući HTTP metriku svakih pola minute. Možete odrediti minimalno vrijeme potrebno za validaciju i promoviranje implementacije kanarinca koristeći sljedeću formulu: interval * (maxWeight / stepWeight). Canary CRD polja su dokumentirana ovdje.

Nakon nekoliko sekundi, Flagger će kreirati kanarinske 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

Otvorite pretraživač i idite na app.istio.example.com, trebali biste vidjeti broj verzije demo aplikacije.

Automatska analiza i promocija kanarinca

Flagger implementira kontrolnu petlju koja postepeno premešta saobraćaj ka kanarincu dok meri ključne metrike performansi kao što su stopa uspešnosti HTTP zahteva, prosečno trajanje zahteva i zdravlje modula. Na osnovu KPI analize, kanarinac se promovira ili prekida, a rezultati analize se objavljuju u Slacku.

Automatska implementacija kanarinca uz Flagger i Istio

Canary implementacija se pokreće kada se promijeni jedan od sljedećih objekata:

  • Postavite PodSpec (slika kontejnera, komanda, portovi, env, itd.)
  • ConfigMaps se montiraju kao volumeni ili mapiraju na varijable okruženja
  • Tajne se montiraju kao volumeni ili se pretvaraju u varijable okruženja

Pokrenite canary deploy kada ažurirate sliku kontejnera:

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

Flagger otkriva da se verzija implementacije promijenila i počinje je analizirati:

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

Tokom analize, rezultati kanarinca mogu se pratiti pomoću Grafane:

Automatska implementacija kanarinca uz Flagger i Istio

Imajte na umu da ako se nove promjene primjenjuju na implementaciju tokom canary analize, onda će Flagger ponovo pokrenuti fazu analize.

Napravite listu svih kanarinca u vašem klasteru:

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

Ako ste omogućili Slack obavještenja, dobit ćete sljedeće poruke:

Automatska implementacija kanarinca uz Flagger i Istio

Automatsko vraćanje unazad

Tokom kanarinske analize, možete generirati sintetičke HTTP 500 greške i veliku latenciju odgovora da vidite hoće li Flagger zaustaviti primenu.

Kreirajte test pod i uradite sljedeće u njemu:

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

Generiranje HTTP 500 grešaka:

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

Generisanje kašnjenja:

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

Kada broj neuspjelih provjera dostigne prag, promet se usmjerava natrag na primarni kanal, kanarinac se skalira na nulu, a implementacija je označena kao neuspješna.

Kanarske greške i skokovi kašnjenja bilježe se kao Kubernetes događaji i evidentiraju ih Flagger u JSON formatu:

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

Ako ste omogućili Slack obavještenja, primit ćete poruku kada se prekorači rok ili se dostigne maksimalni broj neuspjelih provjera u analizi:

Automatska implementacija kanarinca uz Flagger i Istio

U zaključku

Pokretanje servisne mreže kao što je Istio uz Kubernetes će obezbijediti automatske metrike, evidencije i protokole, ali implementacija radnog opterećenja i dalje ovisi o vanjskim alatima. Flagger ima za cilj promijeniti ovo dodavanjem Istio mogućnosti progresivna isporuka.

Flagger je kompatibilan sa bilo kojim Kubernetes CI/CD rješenjem, a canary analiza se može lako proširiti pomoću webhooks za izvođenje testova integracije/prihvatanja sistema, testova opterećenja ili bilo koje druge prilagođene provjere. Budući da je Flagger deklarativno i odgovara na Kubernetes događaje, može se koristiti u GitOps cjevovodima zajedno sa Weave Flux ili JenkinsX. Ako koristite JenkinsX, možete instalirati Flagger sa jx dodacima.

Označivanje podržano Weaveworks i obezbjeđuje raspoređivanje kanarinca u Weave Cloud. Projekat se testira na GKE, EKS i golom metalu sa kubeadm-om.

Ako imate prijedloge za poboljšanje Flaggera, pošaljite problem ili PR na GitHub na stefanprodan/flagger. Doprinosi su više nego dobrodošli!

Spasibo Ray Tsang.

izvor: www.habr.com

Dodajte komentar