
CD tunnustatakse ettevõtte tarkvara praktikaks, mis on ettevõtte järkjärgulise arengutee loomulik tulemus. Siiski on CD endiselt üsna haruldane nähtus, mis võib olla tingitud keerukustest haldamisel ja hirmust ebaõnnestunud juurutamiste ees, mis mõjutavad süsteemi kergesti.
on avatud lähtekoodiga Kubernetes'i operaator, mille eesmärk on vältida eksitavaid keskkondi. See automatiseerib kanaride juurutuste edendamise, kasutades liiklusjaotust Istio ja Prometheuse mõõdikuid, et analüüsida rakenduse käitumist juhitud juurutamise ajal.
Siin on samm-sammuline juhend Flagger'i seadistamiseks ja kasutamiseks Google Kubernetes Engine'is (GKE).
Kubernetes'i klastrite seadistamine
Alustate GKE klastri loomisega Istio laiendusega (kui teil pole GCP kontot, saate registreeruda — tasuta krediidi saamiseks).
Logige sisse Google Cloud'i, looge projekt ja aktiveerige selle jaoks arvelduse. Installige käsurea utiliit ja seadistage oma projekt koos gcloud init.
Seadistage vaikimisi projekt, arvutuspiirkond ja tsoon (asendage PROJECT_ID oma projektiga):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-aLülitage sisse GKE teenus ja looge HPA ja Istio laienditega klaster:
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Ülaltoodud käsk loob vaikimisi sõlmpooli, mis sisaldab kahte virtuaalmasinat n1-standard-2 (vCPU: 2, RAM 7,5 GB, ketas: 30 GB). Ideaalis tuleks Istio komponente eraldada oma töökoormustest, kuid ei ole lihtsat viisi Istio podide käitamiseks eraldi sõlmpoolides. Istio manifestid on lugemiseks, ja GKE tühistab kõik muudatused, näiteks sõlme sidumise või podist lahti ühendamise.
Seadistage volitused kubectl:
gcloud container clusters get-credentials istioLooge klastrihalduse rolli sidumine:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Installige käsurea tööriist :
brew install kubernetes-helmHomebrew 2.0 on nüüd saadaval ka .
Looge teenusekonto ja klastrihalduse rolli sidumine Tillerile:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerKäivitage Tiller nimede ruumis kube-system:
helm init --service-account tillerSoovitame kasutada SSL-i Helm'i ja Tilleri vahel. Lisainformatsiooni Helm'i paigaldamise kaitsmise kohta leiate
Kinnitage seadistused:
kubectl -n istio-system get svcMõne sekundi pärast peaks GCP määrama teenusele välise IP-aadressi istio-ingressgateway.
Istio sisenemistee seadistamine
Looge staatiline IP-aadress nimega istio-gateway, kasutades Istio sisenemistee IP-aadressi:
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-central1Nüüd vajate interneti domeeni ja pääsu oma DNS-registraatorile. Lisage kaks A-kirjet (asendage example.com oma domeeniga):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Veenduge, et DNS-i wildcard töötab:
watch host test.istio.example.comLooge ühine Istio sisenemistee, et pakkuda teenuseid service mesh'i hulgast HTTP kaudu:
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:
- "*"Salvesta ülaltoodud ressurss kui public-gateway.yaml ja rakenda see siis:
kubectl apply -f ./public-gateway.yamlÜkski tootmisüsteem ei tohi pakkuda teenuseid internetis ilma SSL-ita. Et kaitsta Istio sisenemissenet cert-manager, CloudDNS ja Let’s Encrypt, palun loe: Flagger GKE.
Flaggeri installimine
GKE Istio täiendus ei hõlma Prometheuse instantsi, mis haldab Istio telemeetriateenuste koristamist. Kuna Flagger kasutab canary analüüsi tegemiseks Istio HTTP mõõdikuid, pead välja raporteerima järgmise Prometheuse konfigureerimise, mis on sarnane sellele, mis tarnitakse ametliku Istio Helm skeemiga.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlLisa Flaggeri Helm repo:
helm repo add flagger [https://flagger.app](https://flagger.app/)Paigalda Flagger nimede ruumis istio-system, aktiveerides Slacki teavitused:
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=flaggerSa saad installida Flaggeri igas nimede ruumis, kui see suudab suhelda Istio Prometheuse teenusega läbi port 9090.
Flaggeril on Grafana armatuurlaud kanari analüüsi jaoks. Installige Grafana nimetuses 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-meAvage Grafana, luues virtuaalse teenuse (asendage example.com oma domeeniga):
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-grafanaSalvestage ülaltoodud ressurss nimega grafana-virtual-service.yaml ja seejärel rakendage see:
kubectl apply -f ./grafana-virtual-service.yamlKui külastate http://grafana.istio.example.com brauseris, peaksite suunama Grafana sisselogimislehele.
Veebirakenduste juurutamine Flaggeriga
Flagger juurutab Kubernetes't ja vajadusel horisontaalset automaatset skaleerimist (HPA), seejärel loob seeria objekte (Kubernetes'i juurutusi, ClusterIP teenuseid ja Istio virtuaalseid teenuseid). Need objektid avavad rakenduse teenusteside ja haldavad kanari analüüsi ja edendamist.
Looge Testimine nime ruum, kus on lubatud Istio Sidecar'i juurutamine:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlLooge rakendus ja automaatne horisontaalne skaleerimisvahend pod'i jaoks:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlKäitage koormustesti teenust liikluse genereerimiseks canary analüüsi ajal:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testLooge kohandatud canary ressurss (asendage example.com oma domeeniga):
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/"Salvage ülaltoodud ressurss nimega podinfo-canary.yaml ja rakendage see seejärel:
kubectl apply -f ./podinfo-canary.yamlÜlaltoodud analüüs, juhul kui see õnnestub, toimub viie minuti jooksul koos HTTP mõõdikute kontrollimisega iga poole minuti tagant. Saate määrata minimaalset aega canary-deploy kontrollimiseks ja edendamiseks, kasutades järgmist valemit: interval * (maxWeight / stepWeight). Canary CRD väljad on dokumenteeritud .
Mõne sekundi pärast loob Flagger canary-objektid:
# 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/podinfoAvage brauser ja minge aadressile app.istio.example.com, peaksite nägema versiooninumbrit .
Automaatne canary analüüs ja edendamine
Flagger rakendab juhtimistsüklit, mis viib järk-järgult liikluse canary'le, samal ajal mõõtes võtme tulemuslikkuse näitajaid, nagu HTTP-päringute edukuse määr, keskmine päringu kestus ja pundi töökindlus. KPI analüüsi põhjal edendatakse või katkestatakse canary, ning analüüsi tulemused avaldatakse Slackis.
Canary-deploy algab, kui muudetakse ühte järgmistest objektidest:
- PodSpeci juurutamine (konteineri pilt, käsk, port, env jne)
- ConfigMapid kaardistatakse kui mahtusid või muudetakse keskkonnamuutujateks
- Saladused kaardistatakse kui mahtusid või muudetakse keskkonnamuutujateks
Canary-deploy käivitamine konteineri pildi uuendamisel:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger tuvastab, et deploy versioon on muutunud, ja hakkab seda analüüsima:
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.testAnalüüsi käigus saab canary tulemusi jälgida Grafana abil:
Pange tähele: kui uusi muudatusi rakendatakse deploy suhtes canary analüüsi ajal, siis Flagger käivitab analüüsifaasi uuesti.
Koguge kokku kõik „kanarikad” teie klastris:
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:07ZKui olete sisse lülitanud Slacki teavitused, saate järgmised sõnumid:
Automaatne tagasivõtt
Canary analüüsi käigus saab genereerida sünteetilisi HTTP 500 vigu ja kõrget vastuse viivitust, et kontrollida, kas Flagger peatab juurutamise.
Looge testpod ja tehke järgmine tõuge:
kubectl -n test run tester
--image=quay.io/stefanprodan/podinfo:1.2.1
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx shHTTP 500 vigade genereerimine:
watch curl http://podinfo-canary:9898/status/500Viivituse genereerimine:
watch curl http://podinfo-canary:9898/delay/1Kui ebaõnnestumiste arv jõuab lävendi väärtuseni, suunatakse liiklus tagasi põhivoolu, canary skaleeritakse nulli ja juurutamine märgitakse ebaõnnestunuks.
Canary vead ja viivituse tipud registreeritakse Kubernetes sündmustena ja Flagger salvestab need JSON formaadis:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Kaanari juurutamine podinfo.test jaoks
Suurenda podinfo.test kanali kaalu 5
Suurenda podinfo.test kanali kaalu 10
Suurenda podinfo.test kanali kaalu 15
Peata podinfo.test edenemise edukus 69.17% < 99%
Peata podinfo.test edenemise edukus 61.39% < 99%
Peata podinfo.test edenemise edukus 55.06% < 99%
Peata podinfo.test edenemise edukus 47.00% < 99%
Peata podinfo.test edenemise edukus 37.00% 500ms
Peata podinfo.test edenemise taotluse kestus 1.600s > 500ms
Peata podinfo.test edenemise taotluse kestus 1.915s > 500ms
Peata podinfo.test edenemise taotluse kestus 2.050s > 500ms
Peata podinfo.test edenemise taotluse kestus 2.515s > 500ms
Tagasi pöördumine podinfo.test ebaõnnestunud kontrollide künnis on saavutatud 10
Kaanar ebaõnnestus! Väheneme podinfo.testKui olete sisse lülitanud Slacki teadete, siis saate teate, kui tähtaeg on ületatud või kui on saavutatud maksimaalne ebaõnnestunud kontrollide arv analüüsi käigus:
Kokkuvõtteks
Teenuse võrgu, näiteks Istio, käivitamine koos Kubernetesega обеспечит automaatika mõõdikud, logid ja protokollid, kuid töökoormuste juurutamine sõltub endiselt välise tööriistadest. Flagger püüab seda olukorda muuta, lisades Istio võimalusi .
Flagger on ühilduv kõikide CI/CD lahendustega Kuberneteses ning kanari analüüsi saab kergesti laiendada süsteemitesti, kasutuskatsete, koormustestide või muude kasutajate kontrollide teostamiseks. Kuna Flagger on deklaratiivne ja reageerib Kubernetes'e sündmustele, saab seda kasutada GitOps'i torudes koos või . Kui kasutate JenkinsX'i, saate installida Flagger'i koos jx-lisanditega.
Flagger'it toetab ja see võimaldab canary-deploy'e . Projekti testitakse GKE-s, EKS-s ja 'puhtal riistvaral', kasutades kubeadm'i.
Kui teil on ettepanekuid Flagger'i parandamiseks, saatke palun küsimus või PR GitHub'is aadressil . Ükskõik millised panused on rohkem kui teretulnud!
Aitäh .
Allikas: habr.com
