
CD on tunnustatud kui ettevõtte tarkvara praktika, see on CI kehtestatud põhimõtete loomulik evolutsioon. Siiski on CD endiselt üsna haruldane nähtus, tõenäoliselt seetõttu, et selle haldamine on keeruline ja kardetakse ebaõnnestunud juurutamisi, mis mõjutavad süsteemi kättesaadavust.
on avatud lähtekoodiga Kubernetes'i operaator, mille eesmärk on välistada keerulised seosed. See automatiseerib kanarbiku juurutuste edendamist, kasutades Istio liikluse nihutamist ja Prometheuse metrikaid rakenduse käitumise analüüsimiseks juhitud väljalaskmise ajal.
Allpool on samm-sammult juhend Flaggeri seadistamiseks ja kasutamiseks Google Kubernetes Engine (GKE) keskkonnas.
Kubernetes'i klastrite seadistamine
Alustage GKE klastri loomisega Istio lisandiga (kui teil ei ole GCP konto, saate registreeruda — et saada tasuta krediite).
Logige sisse Google Cloudi, looge projekt ja aktiveerige selle jaoks arveldamine. Installige käsurea utiliit ja seadistage oma projekt kasutades gcloud init.
Seadistage vaikeprojekt, 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-aAktiveerige GKE teenus ja looge klaster HPA ja Istio lisanditega:
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 vaikekauguse sõlmede grupi, mis sisaldab kahte VM-i n1-standard-2 (vCPU: 2, RAM 7,5 GB, kett: 30 GB). Ideaalis tuleks Istio komponente eraldada oma töökoormustest, kuid lihtsat viisi Istio poodide käitamiseks eraldatud sõlmede grupis ei ole. Istio manifestid on lugemiseks saadaval, ja GKE tühistab kõik muudatused, näiteks sõlme sidumine või poosi eemaldamine.
Seadistage autentimisandmed kubectl:
gcloud container clusters get-credentials istioLooge klastrihalduri 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 klastrirooli sidumine Tillerile:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerOmandage Tiller namespace'is kubectl -n kube-system edit cm kubelet-config-1.16:
helm init --service-account tillerPeaksite kaaluda SSL kasutamist Helm'i ja Tilleri vahel. Rohkem teavet Helm'i installatsiooni turvalisuse kohta leiate aadressilt
Kinnitage seaded:
kubectl -n istio-system get svcMõne sekundi jooksul peab GCP määrama teenusele välise IP-aadressi istio-ingressgateway.
Istio sissepääsu värava seadistamine
Looge staatiline IP-aadress nimega istio-gateway, kasutades Istio värava 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 juurdepääsu oma DNS-registraatorile. Lisage kaks A-vandet (asendage example.com oma domeeniga):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Veenduge, et DNS-i asenduspakkumine töötab:
watch host test.istio.example.comLooge ühine Istio värav, et pakkuda teenuseid väljaspool teenuste võrku 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 failina public-gateway.yaml ja seejärel rakenda see:
kubectl apply -f ./public-gateway.yamlÜkski tootmissüsteem ei tohiks pakkuda teenuseid internetis ilma SSL-ita. Istio sissepääsu värava kaitsmiseks cert-manager'i, CloudDNS ja Let's Encryptiga lugege palun Flagger GKE.
Flaggeri paigaldamine
GKE Istio täienduses ei ole Prometheuse eksemplari, mis tegeleb Istio telemeetriateenuse puhastamisega. Kuna Flagger kasutab kannu analüüsimiseks Istio HTTP meetrikaid, peate paigaldama järgmise Prometheuse seadistuse, mis on sarnane ametlikule Istio Helmi skeemile.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlLisage Flagger Helm'i repo:
helm repo add flagger [https://flagger.app](https://flagger.app/)Omandage Flagger namespace'is istio-system, sealhulgas Slack'i 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=flaggerSaate Flaggerit paigaldada igasse namespace'i, kui see suudab suhelda Istio Prometheuse teenusega pordi 9090 kaudu.
Flaggeril on Grafana paneel kannu analüüsimiseks. Paigaldage Grafana namespace'is 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 avatuks avatud värava kaudu, 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 eelmainitud ressurss failina grafana-virtual-service.yaml ja seejärel rakendage see:
kubectl apply -f ./grafana-virtual-service.yamlKui lähete aadressile http://grafana.istio.example.com peaks teid suunama Grafana sisselogimise lehele.
Veebirakenduste juurutamine Flaggeriga
Flagger juurutab Kuberneteses ja vajadusel horisontaalse automaatse skaleerimise (HPA), seejärel loob rea objekte (Kubernetese juurutamised, ClusterIP teenused ja Istio virtuaalsed teenused). Need objektid avavad rakenduse teenuse meshis ja haldavad kanali analüüsi ja edendamist.
Looge testneimi ruum, kus on sisse lülitatud Istio Sidecari juurutamine:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlLooge juurutamine ja automaatne horisontaalne skaleerimisriist:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlDeployige testkoormuse teenus, et genereerida liiklust kanali analüüsi ajal:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testLooge kohandatud kanali 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/"Salvestage eelmainitud ressurss failina podinfo-canary.yaml ja seejärel rakendage see:
kubectl apply -f ./podinfo-canary.yamlÜlaltoodud analüüs, kui see õnnestub, toimib viie minuti jooksul, kontrollides HTTP mõõdikuid iga poole minuti järel. Saate määrata minimaalset aega kanali juurutamise kontrollimiseks ja edendamiseks järgmise valemi alusel: interval * (maxWeight / stepWeight). Kanali CRD väljendid on dokumenteeritud .
Mõne sekundi jooksul loob Flagger kannali 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/podinfoAvage brauser ja minge aadressile app.istio.example.com, peaksite nägema versiooni numbrit .
Automaatne kanari analüüs ja edendamine
Flagger rakendab halduse tsükli, mis samm-sammult suunab liiklust kanarile, samal ajal mõõtes olulisi tulemuslikkuse näitajaid, nagu HTTP-päringute edukuse määr, päringute keskmine kestus ja pods'i töökindlus. KPI analüüsi põhjal kas edendatakse või peatatakse kanari ning analüüsi tulemused avaldatakse Slackis.
Kanari juurutus käivitatakse, kui muudatakse mõnda järgmistest objektidest:
- Juurutus PodSpec (konteineri pilt, käsk, pordid, keskkond jne)
- ConfigMaps monteeritakse mahtudena või muudetakse keskkonnamuutujateks
- Saladused monteeritakse mahtudena või muudetakse keskkonnamuutujateks
Kanari juurutuse käivitamine konteineri pildi uuendamisel:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger tuvastab, et juurutuse versioon on muutunud ja hakkab seda analüüsima:
kubectl -n test describe canary/podinfo
Sündmused:
Uus versioon tuvastatud podinfo.test
Skaalimine üles podinfo.test
Ootan, et podinfo.test juurutamine lõpetataks: 0 1-st värskendatud koopiast on saadaval
Edelda podinfo.test kanari kaalu 5
Edelda podinfo.test kanari kaalu 10
Edelda podinfo.test kanari kaalu 15
Edelda podinfo.test kanari kaalu 20
Edelda podinfo.test kanari kaalu 25
Edelda podinfo.test kanari kaalu 30
Edelda podinfo.test kanari kaalu 35
Edelda podinfo.test kanari kaalu 40
Edelda podinfo.test kanari kaalu 45
Edelda podinfo.test kanari kaalu 50
Kopeeri podinfo.test malli spetsifikatsioon podinfo-primary.test
Ootan, et podinfo-primary.test juurutamine lõpetataks: 1 2-st värskendatud koopiast on saadaval
Edendamine lõpetatud! Skaalimine allapoole podinfo.testAnalüüsi käigus saab kanari tulemusi jälgida Grafana abil:
Pange tähele: kui uusi muudatusi rakendada juurutusele kanari analüüsi ajal, siis Flagger käivitab analüüsifaasi uuesti.
Koostage nimekiri kõigist „kanaridest“ 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, siis saate järgmised sõnumid:
Automaatne tagasivõtmine
Kanari analüüsi käigus saab genereerida sünteetilisi HTTP 500 vigu ja kõrgeid vastuse viivitusi, et kontrollida, kas Flagger peatab juurutuse.
Looge testpood ja käitage see järgmine käsk:
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:
vaata curl http://podinfo-canary:9898/delay/1Kui ebaõnnestunud kontrolle on piisavalt palju, suunatakse liiklus tagasi põhikanalile, kanarakk skaleeritakse nulli ja juurutus märgistatakse kui ebaõnnestunud.
Kananäidud ja viivituspiigid registreeritakse Kubernetes'e sündmustena ja Flagger salvestab need JSON-vormingus:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Algab kanarakkude juurutamine podinfo.test
Kanaraku podinfo.test kaal 5
Kanaraku podinfo.test kaal 10
Kanaraku podinfo.test kaal 15
Peata podinfo.test edasiviimise edu määr 69,17% < 99%
Peata podinfo.test edasiviimise edu määr 61,39% < 99%
Peata podinfo.test edasiviimise edu määr 55,06% < 99%
Peata podinfo.test edasiviimise edu määr 47,00% < 99%
Peata podinfo.test edasiviimise edu määr 37,00% < 99%
Peata podinfo.test edasiviimise taotluse kestus 1,515s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 1,600s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 1,915s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 2,050s > 500ms
Peata podinfo.test edasiviimise taotluse kestus 2,515s > 500ms
Tagasi pööramine podinfo.test ebaõnnestunud kontrolle, läviväärtus saavutatud 10
Kanarakud ebaõnnestusid! Podinfo.test skaleerimine allaKui olete sisse lülitanud Slack'i teated, saate teate, kui tähtaeg ületatakse või juurutamise maksimaalne ebaõnnestumiste arv saavutatakse:
Kokkuvõtteks
Teenuste andmevõrgu, näiteks Istio käivitamine koos Kubernetesega, annab automaatsed mõõtmised, logid ja protokollid, kuid töökoormuste seadistamine sõltub endiselt välistest tööriistadest. Flagger püüab olukorda muuta, lisades Istio võimeid .
Flagger on ühilduv igasuguste CI/CD lahendustega Kubernetes'e jaoks, ja kanarakkude analüüsi saab hõlpsasti laiendada süsteemi integreerimise/aktsepteerimise testide, koormustestide või mis tahes muude kohandatud kontrollide teostamiseks. Kuna Flagger on deklaratiivne ja reageerib Kubernetes'e sündmustele, saab seda kasutada GitOps'i töövoogudes koos või . Kui kasutate JenkinsX, saate Flaggeri installida jx pistikprogrammide kaudu.
Flaggerit toetab ja toetab kanarakkude juurutusi . Projekt on katsetatud GKE, EKS ja "puhtal riistvaral" kubeadm-iga.
Kui teil on ettepanekuid Flaggeri parendamiseks, palun saatke küsimus või PR GitHubis aadressil . Panused on rohkem kui teretulnud!
Aitäh .
Allikas: habr.com
