
CD njihet si një praktikë e softuerit korporativ, dhe është rezultat i evolucionit të natyrshëm të parimeve të vendosura CI. Megjithatë, CD mbetet ende një fenomen relativisht i rrallë, ndoshta për shkak të kompleksitetit të menaxhimit dhe frikës nga implementimet e dështuara që ndikojnë në disponueshmërinë e sistemit.
është një operator Kubernetes me burim të hapur, me qëllim të eliminimit të ndërvarësive të ndërlikuara. Ai automatizon avancimin e implementimeve canary duke përdorur devijimin e trafik në Istio dhe metrikat Prometheus për të analizuar sjelljen e aplikacionit gjatë një daljeje të menaxhuar.
Më poshtë është një udhëzues hap pas hapi për konfigurimin dhe përdorimin e Flagger në Google Kubernetes Engine (GKE).
Konfigurimi i klasterit Kubernetes
Filloni me krijimin e një klasteri GKE me shtesën Istio (nëse nuk keni një llogari GCP, mund të regjistroheni - për të marrë kredi falas).
Hyni në Google Cloud, krijoni një projekt dhe aktivizoni faturimin për të. Instaloni utilitarin e komandës dhe konfigurojeni projektin tuaj me gcloud init.
Caktoni projektin si më të zakonshëm, rajonin e llogaritjes dhe zonën (zëvendësoni PROJECT_ID me projektin tuaj):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-aAktivizoni shërbimin GKE dhe krijoni një klaster me HPA dhe shtesa Istio:
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_PERMISSIVEKomanda e mësipërme do të krijojë një grup nodash të zakonshëm, përfshirë dy VM n1-standard-2 (vCPU: 2, RAM 7.5 GB, disk: 30 GB). Idealisht, është e dëshirueshme të izoloheni komponentët e Istio nga ngarkesat tuaja, por nuk ka një mënyrë të thjeshtë për të nisur podet Istio në një grup nodash të veçantë. Manifestet e Istio konsiderohen vetëm për lexim, dhe GKE do të anulojë çdo ndryshim, si p.sh. lidhjen me një nodë ose shkëputjen nga një pod.
Konfiguroni kredencialet për kubectl:
gcloud container clusters get-credentials istioKrijoni një lidhje roli për administrimin e klasterit:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Instaloni mjetin e komandës :
brew install kubernetes-helmHomebrew 2.0 tani është gjithashtu i disponueshëm për .
Krijoni një llogari shërbimi dhe një lidhje roli për Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerDepozitoni Tiller në hapësirën kubectl -n kube-system edit cm kubelet-config-1.16:
helm init --service-account tillerDuhet të merrni parasysh përdorimin e SSL midis Helm dhe Tiller. Për më shumë informacion mbi mbrojtjen e instalimit të Helm, shihni
Konfirmoni konfigurimet:
kubectl -n istio-system get svcPas disa sekondash, GCP duhet të caktojë një adresë IP të jashtme për shërbimin istio-ingressgateway.
Konfigurimi i portës hyrëse Istio
Krijoni një adresë IP statike me emrin istio-gateway, duke përdorur adresën IP të portës Istio:
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-central1Tani ju nevojitet një domen interneti dhe qasje në regjistruesin tuaj DNS. Shtoni dy regjistra A (zëvendësoni example.com me domenin tuaj):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Sigurohuni që wildcard DNS funksionon:
watch host test.istio.example.comKrijoni një portë të përbashkët Istio për të ofruar shërbime përtej service mesh në HTTP:
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:
- "*"Ruani burimin e mësipërm si public-gateway.yaml dhe më pas aplikoni atë:
kubectl apply -f ./public-gateway.yamlAsnjĂ« sistem prodhues nuk duhet tĂ« ofrojĂ« shĂ«rbime nĂ« internet pa SSL. PĂ«r tĂ« mbrojtur portĂ«n hyrĂ«se Istio me cert-manager, CloudDNS dhe Letâs Encrypt, ju lutemi lexoni Flagger GKE.
Instalimi i Flagger
Shtesa GKE Istio nuk përfshin një instancë Prometheus, e cila merret me pastrimin e shërbimeve të telemetrisë Istio. Duke qenë se Flagger përdor metrikat Istio HTTP për të kryer analizën canary, ju duhet të implementoni konfigurimin e mëposhtëm të Prometheus, të ngjashëm me atë që ofrohet me diagramin zyrtar të Helm të Istio.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlShtoni repozitorin Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)Depozitoni Flagger në hapësirën istio-system, duke përfshirë njoftimet Slack:
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=flaggerMund ta instaloni Flagger në çdo hapësirë, për sa kohë që ai mund të bashkëpunojë me shërbimin Istio Prometheus përmes portit 9090.
Flagger ka një panel monitorimi Grafana për analizën canary. Instaloni Grafana në hapësirë 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-meZbulo Grafana përmes një gateways të hapur duke krijuar një shërbim virtual (zëvendësoni example.com me domainin tuaj):
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-grafanaRuani burimin më sipër si grafana-virtual-service.yaml dhe më pas aplikoni atë:
kubectl apply -f ./grafana-virtual-service.yamlDuke kaluar tek http://grafana.istio.example.com në shfletues do të duhet t'ju drejtojë në faqen e hyrjes së Grafana.
Deployimi i aplikacioneve web me Flagger
Flagger deployon Kubernetes dhe, kur është e nevojshme, horizontale automatizim të shkallës (HPA), pastaj krijon një seri objektesh (deployime Kubernetes, shërbime ClusterIP dhe shërbime virtuale Istio). Këto objekte zbulojnë aplikacionin në service mesh dhe menaxhojnë analizën dhe përparimin e canary.
Krijoni një hapësirë provuese me aktivizimin e Istio Sidecar:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlKrijoni një deploy dhe mjetin e automatizuar të shkallës horizontale të pods:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlDeployoni shërbimin e ngarkesës provuese për të gjeneruar trafik gjatë analizës canary:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testKrijoni një burim canary të personalizuar (zëvendësoni example.com me domenin tuaj):
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/"Ruani burimin më sipër si podinfo-canary.yaml dhe më pas aplikoni atë:
kubectl apply -f ./podinfo-canary.yamlAnaliza e mësipërme, në rast suksesi, do të ekzekutohet për pesë minuta me verifikimin e metrikave HTTP çdo gjysmë minute. Mund të përcaktoni kohën minimale të nevojshme për verifikimin dhe përparimin e deploy-it canary sipas formulës së mëposhtme: interval * (maxWeight / stepWeight). Fushat e Canary CRD dokumentohen .
Pas disa sekondash, Flagger do të krijojë 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/podinfoHapni një shfletues dhe shkoni në app.istio.example.com, duhet të shihni numrin e versions .
Analiza dhe avancimi automatik kanarin
Flagger implementon një cikël menaxhimi që gradualisht zhvendos trafikun në kanarin, duke matur njëkohësisht treguesit kryesorë të performancës si niveli i suksesit të kërkesave HTTP, koha mesatare e kërkesave dhe disponueshmëria e pod-it. Bazuar në analizën e KPI-ve, kanarina promovon ose ndalet, dhe rezultatet e analizës publikohen në Slack.
Ndërrimi i kanarin fillon me ndryshimin e një nga objekte të mëposhtme:
- Specifikimi i ndërrimit Pod (imazhi i kontejnerit, komanda, portet, mjedisi etj.)
- ConfigMaps montohen si volume ose transformohen në variabla mjedisi
- Sekretet montohen si volume ose transformohen në variabla mjedisi
Fillimi i ndërrimit kanarin me përditësimin e imazhit të kontejnerit:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger zbulohet se versioni i ndërrimit është ndryshuar dhe fillon ta analizojë atë:
kubectl -n test describe canary/podinfo
Ngjarjet:
Revision e re e zbuluar podinfo.test
Po shkallëzohet podinfo.test
Po pret për përfundimin e roll-out-it të podinfo.test: 0 nga 1 replikat e përditësuara janë të disponueshme
Avanconi peshën kanarin të podinfo.test 5
Avanconi peshën kanarin të podinfo.test 10
Avanconi peshën kanarin të podinfo.test 15
Avanconi peshën kanarin të podinfo.test 20
Avanconi peshën kanarin të podinfo.test 25
Avanconi peshën kanarin të podinfo.test 30
Avanconi peshën kanarin të podinfo.test 35
Avanconi peshën kanarin të podinfo.test 40
Avanconi peshën kanarin të podinfo.test 45
Avanconi peshën kanarin të podinfo.test 50
Duke kopjuar specifikimin e templarit të podinfo.test në podinfo-primary.test
Po pret për përfundimin e roll-out-it të podinfo-primary.test: 1 nga 2 replikat e përditësuara janë të disponueshme
Promovimi përfundoi! Po shkallëzohet podinfo.testGjatë analizës, rezultatet kanarin mund të ndjeken përmes Grafana:
Kujdes: nëse ndryshimet e reja aplicohen për ndërrimin gjatë analizës kanarina, Flagger do të rifillojë fazën e analizës.
Bëni një listë të të gjitha "kanarive" në klasterin tuaj:
watch kubectl get canaries --all-namespaces
NAMESPACE EMRI STADI PESHA KOHA E KALUAR
test podinfo Po avancon 15 2019-01-16T14:05:07Z
prod frontend Suksesit 0 2019-01-15T16:15:07Z
prod backend Dështuar 0 2019-01-14T17:15:07ZNëse keni aktivizuar njoftimet Slack, do të merrni mesazhe të tilla:
Rikthimi automatik
Gjatë analizës kanarina, mund të gjeneroni gabime sintetike HTTP 500 dhe një vonesë të lartë të përgjigjes për të kontrolluar nëse Flagger do të ndalojë ndërrimin.
Krijoni një pod testimi dhe ekzekutoni veprimin e mëposhtëm:
kubectl -n test run tester
--image=quay.io/stefanprodan/podinfo:1.2.1
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx shGenerimi i gabimeve HTTP 500:
watch curl http://podinfo-canary:9898/status/500Generimi i vonesës:
shiko curl http://podinfo-canary:9898/delay/1Kur numri i kontrolleve të dështuar arrin vlerën kufitare, trafiku kthehet në kanalin primar, canary shkallëzohet në zero, dhe deploy damkoset si i dështuar.
Gabimet canary dhe majat e vonesave regjistrohen si ngjarje Kubernetes dhe regjistrohen nga Flagger në format JSON:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Duke filluar me deploy canary për podinfo.test
Avanconi peshën canary të podinfo.test 5
Avanconi peshën canary të podinfo.test 10
Avanconi peshën canary të podinfo.test 15
Ndalo avancimin e podinfo.test me shkallën e suksesit 69.17% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 61.39% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 55.06% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 47.00% < 99%
Ndalo avancimin e podinfo.test me shkallën e suksesit 37.00% 500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 1.600s > 500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 1.915s > 500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 2.050s > 500ms
Ndalo avancimin e podinfo.test me një kohë kërkese 2.515s > 500ms
Rivendos podinfo.test threshold dështimesh të arritura 10
Canary dështoi! Duke e shkallëzuar poshtë podinfo.testNëse keni aktivizuar njoftimet Slack, do të merrni një mesazh kur kaloni afatin e ekzekutimit ose arritni numrin maksimal të dështimeve gjatë analizës:
Në përfundim
Këtu dërgohet një rrjet shërbimi, siç është Istio, përveç Kubernetes, ofron metrika automatik, log-e dhe protokolle, por depolimi i ngarkesave akoma varet nga mjete të jashtme. Flagger duhet ta ndryshojë këtë situatë duke shtuar mundësitë e Istio .
Flagger është i pajtueshëm me çdo zgjidhje CI/CD për Kubernetes, dhe analiza canary mund të zgjerohet lehtësisht me për ekzekutimin e testeve sistemike të integrimit/pranimit, teste ngarkese ose çdo kontroll tjetër përdoruesi. Si Flagger është deklerativ dhe reagon ndaj ngjarjeve Kubernetes, mund të përdoret në pipeline të GitOps së bashku me ose . Nëse përdorni JenkinsX, mund të instaloni Flagger me shtesa jx.
Flagger mbështetet nga dhe siguron dërgesa canary në . Projekti testohet në GKE, EKS dhe "harduerin e zbrazët" me kubeadm.
Nëse keni rekomandime për përmirësimin e Flagger, ju lutemi dërgoni një pyetje ose PR në GitHub në adresën . Kontributet janë më se të mirëpritura!
Faleminderit .
Burimi: habr.com
