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.
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
Prijavite se na Google Cloud, kreirajte projekat i omogućite naplatu za njega. Instalirajte uslužni program komandne linije 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
brew install kubernetes-helm
Homebrew 2.0 je sada dostupan i za
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
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-gateway
koristeć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
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-system
omoguć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.
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
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
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.
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:
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:
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:
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
Flagger je kompatibilan sa bilo kojim Kubernetes CI/CD rješenjem, a canary analiza se može lako proširiti pomoću
Označivanje podržano
Ako imate prijedloge za poboljšanje Flaggera, pošaljite problem ili PR na GitHub na
Spasibo
izvor: www.habr.com