
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.
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 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-aOmoguć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_PERMISSIVEGornja 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 istioStvorite vezanje uloge administratora klastera:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Instalirajte alat naredbenog retka :
brew install kubernetes-helmHomebrew 2.0 sada je također dostupan za .
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:tillerProširite Tiller u prostoru imena kube-system:
helm init --service-account tillerTrebali biste razmotriti korištenje SSL-a između Helma i Tillera. Za više informacija o zaštiti vaše Helm instalacije, pogledajte
Potvrdite postavke:
kubectl -n istio-system get svcNakon 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-central1Sada 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.comNapravite 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.yamlNijedan 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 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.yamlDodajte 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=flaggerFlagger 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-meIzlož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-grafanaSpremite gornji resurs kao grafana-virtual-service.yaml i zatim ga primijenite:
kubectl apply -f ./grafana-virtual-service.yamlPrilikom 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.
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.yamlStvorite implementaciju i alat za automatsko skaliranje grupe:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlImplementirajte uslugu testnog učitavanja za generiranje prometa tijekom canary analize:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testStvorite 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.yamlGornja 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/podinfoOtvorite preglednik i idite na app.istio.example.com, trebali biste vidjeti broj verzije .
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.
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.1Flagger 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.testTijekom analize, rezultati canary mogu se pratiti pomoću Grafane:
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:07ZAko ste omogućili Slack obavijesti, primit ćete sljedeće poruke:
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 shGeneriranje pogrešaka HTTP 500:
watch curl http://podinfo-canary:9898/status/500Generiranje kašnjenja:
watch curl http://podinfo-canary:9898/delay/1Kada 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.testAko ste omogućili Slack obavijesti, primit ćete poruku kada se prekorači rok ili dosegne maksimalan broj neuspjelih provjera u analizi:
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 .
Flagger je kompatibilan s bilo kojim Kubernetes CI/CD rješenjem, a canary analiza može se jednostavno proširiti s 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 ili . Ako koristite JenkinsX, možete instalirati Flagger s jx dodacima.
Flagger podržan i pruža raspoređivanje kanarinaca u . 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 . Doprinosi su više nego dobrodošli!
Hvala .
Izvor: www.habr.com
