Automatske Canary implementacije uz Flagger i Istio

Automatske Canary implementacije uz Flagger i Istio

CD je prepoznat kao praksa poslovnog softvera i rezultat je prirodne evolucije uspostavljenih CI načela. Međutim, CD je još uvijek prilično rijedak, možda zbog složenosti upravljanja i straha da će neuspješna implementacija utjecati na dostupnost sustava.

Označivač je Kubernetes operator otvorenog koda koji ima za cilj eliminirati zbunjujuće odnose. Automatizira promicanje Canary implementacija koristeći Istio prometni pomak i Prometheus metriku za analizu ponašanja aplikacije tijekom upravljanog uvođenja.

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

Postavljanje Kubernetes klastera

Počinjete stvaranjem GKE klastera s Istio dodatkom (ako nemate GCP račun, možete se prijaviti здесь - za dobivanje besplatnih kredita).

Prijavite se na Google Cloud, izradite projekt i omogućite naplatu za njega. Instalirajte uslužni program naredbenog retka gcloud i postavite svoj projekt s gcloud init.

Postavite zadani projekt, područje izračuna i zonu (zamijenite PROJECT_ID za vaš projekt):

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 izradite 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 naredba stvorit će zadani skup čvorova koji uključuje dva VM-a 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 za pokretanje Istio Pods u namjenskom skupu čvorova. Istio manifesti smatraju se samo za čitanje i GKE će poništiti sve promjene, kao što je povezivanje s čvorom ili odvajanje od modula.

Postavite vjerodajnice za kubectl:

gcloud container clusters get-credentials istio

Stvorite vezanje uloge administratora klastera:

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

Instalirajte alat naredbenog retka Kormilo:

brew install kubernetes-helm

Homebrew 2.0 sada je također dostupan za Linux.

Stvorite servisni račun i vezanje uloga 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 prostoru imena kube-system:

helm init --service-account tiller

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

Potvrdite postavke:

kubectl -n istio-system get svc

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

Konfiguriranje Istio Ingress Gatewaya

Stvorite statičku IP adresu s imenom istio-gatewaykoristeći IP adresu Istio pristupnika:

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 internetska domena i pristup vašem DNS registratoru. Dodajte dva A zapisa (zamijenite example.com na svoju 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

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

Spremite gornji resurs kao public-gateway.yaml i zatim ga primijenite:

kubectl apply -f ./public-gateway.yaml

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

Instalacija označavača

GKE Istio dodatak ne uključuje Prometheus instancu koja čisti Istio telemetrijsku uslugu. Budući da Flagger koristi Istio HTTP metriku za izvođenje canary analize, trebate implementirati sljedeću Prometheus konfiguraciju, sličnu onoj koja dolazi sa službenom Istio Helm shemom.

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

Dodajte repozitorij Flagger Helm:

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

Proširi Flagger na imenski prostor istio-systemomogućavanjem Slack obavijesti:

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 možete instalirati u bilo koji prostor imena sve dok može komunicirati s uslugom Istio Prometheus na portu 9090.

Flagger ima Grafana nadzornu ploču za analizu kanarinaca. Instalirajte Grafana u namespace 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 pristupnik stvaranjem virtualne usluge (zamijenite example.com na svoju 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

Spremite 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 pregledniku trebali biste biti preusmjereni na stranicu za prijavu Grafana.

Postavljanje web aplikacija s Flaggerom

Flagger implementira Kubernetes i opcionalno se automatski skalira (HPA), zatim stvara niz objekata (Kubernetes implementacije, ClusterIP usluge i Istio virtualne usluge). Ovi objekti izlažu aplikaciju servisnoj mreži i kontroliraju kanarinsku analizu i napredak.

Automatske Canary implementacije uz Flagger i Istio

Stvorite probni prostor naziva s omogućenom Istio Sidecar injection:

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

Stvorite implementaciju i alat za automatsko skaliranje grupe:

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

Implementirajte uslugu testnog učitavanja za generiranje prometa tijekom canary analize:

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

Stvorite prilagođeni resurs Canary (zamijenite example.com na svoju 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/"

Spremite gornji resurs kao podinfo-canary.yaml i zatim ga primijenite:

kubectl apply -f ./podinfo-canary.yaml

Gornja analiza, ako je uspješna, izvodit će se pet minuta, provjeravajući HTTP metriku svakih pola minute. Možete odrediti minimalno vrijeme potrebno za provjeru valjanosti i promicanje implementacije Canary pomoću sljedeće formule: interval * (maxWeight / stepWeight). Canary CRD polja su dokumentirana здесь.

Nakon nekoliko sekundi, Flagger će kreirati objekte Canary:

# 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 preglednik i idite na app.istio.example.com, trebali biste vidjeti broj verzije demo aplikacije.

Automatska analiza i promicanje kanarinca

Flagger implementira kontrolnu petlju koja postupno premješta promet na Canary dok mjeri ključne metrike izvedbe kao što su stopa uspješnosti HTTP zahtjeva, prosječno trajanje zahtjeva i zdravlje mahuna. Na temelju KPI analize, kanarinac se promiče ili prekida, a rezultati analize se objavljuju Slacku.

Automatske Canary implementacije uz Flagger i Istio

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

  • Implementiraj PodSpec (slika spremnika, naredba, portovi, env, itd.)
  • ConfigMaps se montiraju kao volumeni ili preslikavaju na varijable okoline
  • Tajne se montiraju kao volumeni ili pretvaraju u varijable okoline

Pokrenite Canary deploy prilikom ažuriranja slike spremnika:

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

Tijekom analize, rezultati canary mogu se pratiti pomoću Grafane:

Automatske Canary implementacije uz Flagger i Istio

Napominjemo da će Flagger ponovno pokrenuti fazu analize ako se primijene nove promjene na implementaciju tijekom canary analize.

Napravite popis svih kanarinaca 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 obavijesti, primit ćete sljedeće poruke:

Automatske Canary implementacije uz Flagger i Istio

Automatsko vraćanje

Tijekom canary analize možete generirati sintetičke HTTP 500 pogreške i visoku latenciju odgovora da vidite hoće li Flagger zaustaviti implementaciju.

Stvorite testnu jedinicu i u njoj učinite sljedeće:

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 pogrešaka HTTP 500:

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

Generiranje kašnjenja:

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

Kada broj neuspjelih provjera dosegne prag, promet se preusmjerava natrag na primarni kanal, kanarinac se skalira na nulu, a implementacija se označava kao neuspješna.

Canary pogreške i skokovi kašnjenja bilježe se kao Kubernetes događaji, a bilježi 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 obavijesti, primit ćete poruku kada se prekorači rok ili dosegne maksimalan broj neuspjelih provjera u analizi:

Automatske Canary implementacije uz Flagger i Istio

U zaključku

Pokretanje uslužnog mesha kao što je Istio uz Kubernetes osigurat će automatsku metriku, zapisnike i protokole, ali implementacija radnog opterećenja i dalje ovisi o vanjskim alatima. Flagger ima za cilj promijeniti to dodavanjem Istio mogućnosti progresivna opskrba.

Flagger je kompatibilan s bilo kojim Kubernetes CI/CD rješenjem, a canary analiza može se jednostavno proširiti s webdokačice za izvođenje testova integracije/prihvatljivosti sustava, testova opterećenja ili bilo koje druge prilagođene provjere. Budući da je Flagger deklarativan i odgovara na Kubernetes događaje, može se koristiti u GitOps cjevovodima zajedno s Weave Flux ili JenkinsX. Ako koristite JenkinsX, možete instalirati Flagger s jx dodacima.

Flagger podržan Tkanje i pruža raspoređivanje kanarinaca u Weave Cloud. Projekt se testira na GKE, EKS i golom metalu s kubeadmom.

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

Hvala Ray Tsang.

Izvor: www.habr.com

Dodajte komentar