
CD është pranuar si praktikë e softuerit të korporatave, dhe është rezultat i evolucionit natyror të parimeve të konsoliduara CI. Megjithatë, CD mbetet ende një fenomen relativisht i rrallë, ndoshta për shkak të kompleksitetit të menaxhimit dhe frikës nga shpërndarjet me dështim që ndikojnë në disponueshmërinë e sistemit.
është një operues Kubernetes me burim të hapur, qëllimi i të cilit është të eliminojë lidhjet e ndërlikuara. Ai automatizon promovimin e shpërndarjeve canary duke përdorur zhvendosjen e trafikut Istio dhe metrikat Prometheus për të analizuar sjelljen e aplikacionit gjatë një lëshimi të kontrolluar.
Në vijim është një udhëzues hap pas hapi për konfigurimin dhe përdorimin e Flagger në Google Kubernetes Engine (GKE).
Konfigurimi i klasterit Kubernetes
Ju filloni duke krijuar një klaster GKE me shtesën Istio (nëse nuk keni një llogari GCP, mund t'u regjistroheni - për të marrë kredite falas).
Identifikohu në Google Cloud, krijo një projekt dhe aktivizo faturimin për të. Instaloni mjetin e komandës dhe konfiguroni projektin tuaj me gcloud init.
Caktoni projektin si default, 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 në default, që përfshin dy VM n1-standard-2 (vCPU: 2, RAM 7.5 GB, disk: 30 GB). Idealisht, vlen të izolohesh komponentët e Istio nga ngarkesat tuaja të punës, por nuk ka një mënyrë të thjeshtë për të ekzekutuar konteinerët e Istio në një grup nodash të dedikuar. Manifestimet e Istio konsiderohen si lexueshmëri vetëm, dhe GKE do të anuloj çdo ndryshim, si lidhja me një nodë ose ndarjen nga një kontejner.
Konfiguroni kredencialet për kubectl:
gcloud container clusters get-credentials istioKrijoni një lidhje roli të administratorit të 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 të klasterit për Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerShpërndani Tiller në hapësirën kube-system:
helm init --service-account tillerDuhet të shqyrtoni përdorimin e SSL midis Helm dhe Tiller. Për më shumë informacion rreth mbrojtjes së 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ë domene interneti dhe akses te regjistruesi juaj DNS. Shtoni dy regjistrime A (zëvendësoni example.com me domenin tuaj):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Sigurohuni që wildcards DNS të funksionojnë:
watch host test.istio.example.comKrijoni një portë të përbashkët Istio për të ofruar shërbime jashtë service mesh me 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 prodhimi 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
Ndërtesa Istio GKE nuk përfshin një instancë Prometheus e cila merret me pastrimin e shërbimit të telemetrisë Istio. Duke qenë se Flagger përdor metrika Istio HTTP për të kryer analizën canary, duhet të shpërndani konfigurimin e mëposhtëm të Prometheus, të ngjashëm me atë që ofrohet me skemën zyrtare të Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlShtoni depon Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)Shpërndani Flagger në hapësirën istio-system, duke përfshirë njoftime 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ë nëse mund të interagoni 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ë porte të hapur duke krijuar një shërbim virtual (zëvendësoni example.com me domenin 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 e mësipërm si grafana-virtual-service.yaml dhe më pas aplikojeni atë:
kubectl apply -f ./grafana-virtual-service.yamlKur të kaloni te http://grafana.istio.example.com në shfletuesin tuaj, duhet të drejtoheni në faqen e hyrjes së Grafana.
Dërgimi i aplikacioneve web me Flagger
Flagger bën deploy në Kubernetes dhe, nëse është e nevojshme, automatizimin horizontal të shkallës (HPA), pastaj krijon një seri objektesh (deployments Kubernetes, shërbime ClusterIP dhe shërbime virtuale Istio). Këto objekte zgjerojnë aplikacionin në service mesh dhe menaxhojnë analizën dhe avancimin canary.
Krijoni një namespace testimi me implementimin e Istio Sidecar të aktivizuar:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlKrijoni një deploy dhe një mjet për automatizimin horizontal të shkallës për podin:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlAktivizoni shërbimin e testit të ngarkesës për të gjeneruar trafik gjatë analizës canary:
helm upgrade -i flagger-loadtester flagger/loadtester
--namespace=testKrijoni një burim canary personal (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 e mësipërm si podinfo-canary.yaml dhe më pas aplikojeni atë:
kubectl apply -f ./podinfo-canary.yamlAnaliza e mësipërme, në rast suksesi, do të realizohet për pesë minuta me kontrollin e metrikave HTTP çdo gjysmë minute. Mund të përcaktoni kohën minimale të nevojshme për verifikimin dhe avancimin e deploy-it canary me formulën e 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 shfletuesin dhe shkoni në app.istio.example.com, duhet të shihni numrin e versionit .
Analizë dhe avancim automatik i canary
Flagger implementon një cikël menaxhimi, i cili gradualisht kalon trafikun në canary, duke matur njëkohësisht treguesit kryesorë të performancës, siç janë norma e suksesit të kërkesave HTTP, koha mesatare e përgjigjeve dhe vazhdimësia e pod-it. Bazuar në analizën e KPI-ve, canary avancon ose ndalet, dhe rezultatet e analizës publikohen në Slack.
Deploy-i canary niset kur ndryshohet një nga objektet e mëposhtme:
- Deploy PodSpec (imazhi i konteinerit, komanda, portet, env etj.)
- ConfigMaps montohen si vëllime ose transformohen në variabla mjedisi
- Sekretet montohen si vëllime ose transformohen në variabla mjedisi
Nisja e deploy-it canary gjatë përditësimit të imazhit të konteinerit:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger zbulon se versioni i deploy-it është ndryshuar dhe fillon ta analizojë atë:
kubectl -n test describe canary/podinfo
Ngjarjet:
Revision e re u zbulua podinfo.test
Po shkallëzohet podinfo.test
Po pret që roll-out-i i podinfo.test të përfundojë: 0 nga 1 replikat e përditësuara janë të disponueshme
Avancimi i peshës canary për podinfo.test 5
Avancimi i peshës canary për podinfo.test 10
Avancimi i peshës canary për podinfo.test 15
Avancimi i peshës canary për podinfo.test 20
Avancimi i peshës canary për podinfo.test 25
Avancimi i peshës canary për podinfo.test 30
Avancimi i peshës canary për podinfo.test 35
Avancimi i peshës canary për podinfo.test 40
Avancimi i peshës canary për podinfo.test 45
Avancimi i peshës canary për podinfo.test 50
Duke kopjuar specifikimin e shablonit të podinfo.test në podinfo-primary.test
Po pret që roll-out-i i podinfo-primary.test të përfundojë: 1 nga 2 replikat e përditësuara janë të disponueshme
Promovimi përfundoi! Po zvogëlohet podinfo.testGjatë analizës, rezultatet e canary mund të ndjeken përmes Grafana:
Vini re: nëse aplikoni ndryshime të reja ndaj deploy-it gjatë analizës canary, Flagger do të rinis fazën e analizës.
Krijoni një listë të të gjitha «canary» në klasterin tuaj:
watch kubectl get canaries --all-namespaces
NAMESPACE EMRI STATUS Pesha KOHA E FUNDIT
test podinfo Po përparon 15 2019-01-16T14:05:07Z
prod frontend Sukses 0 2019-01-15T16:15:07Z
prod backend Dështoi 0 2019-01-14T17:05:07ZNëse keni aktivizuar njoftimet në Slack, do të merrni mesazhet e mëposhtme:
Rikthim automatik
Gjatë analizës canary, mund të gjeneroni gabime sintetike HTTP 500 dhe vonesa të larta të përgjigjeve për të kontrolluar nëse Flagger do ta ndalë deploy-in.
Krijoni një pod testues dhe kryeni 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 shGjenerimi i gabimeve HTTP 500:
watch curl http://podinfo-canary:9898/status/500Gjenerimi i vonesës:
shiko curl http://podinfo-canary:9898/delay/1Kur numri i provimeve të dështuara arrin vlerën përjashtuese, trafiku kthehet në kanalin primar, canary eskalon në zero dhe deploy-i shënohet si i dështuar.
Gabimet canary dhe piket e vonesave regjistrohen si ngjarje Kubernetes dhe regjistrohen nga Flagger në formatin JSON:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Duke filluar implementimin canary për podinfo.test
Rrit pesha canary podinfo.test 5
Rrit pesha canary podinfo.test 10
Rrit pesha canary podinfo.test 15
Ndalo avancimin e podinfo.test shkalla e suksesit 69.17% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 61.39% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 55.06% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 47.00% < 99%
Ndalo avancimin e podinfo.test shkalla e suksesit 37.00% 500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 1.600s > 500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 1.915s > 500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 2.050s > 500ms
Ndalo avancimin e podinfo.test kërkesa për kohëzgjatje 2.515s > 500ms
Po kthehet podinfo.test numri i kontrollimeve të dështuara arriti 10
Canary dështon! Duke iu zvogëluar podinfo.testNëse keni aktivizuar njoftimet Slack, do të merrni një mesazh kur të tejkaloni afatin e përfundimit ose të arrini numrin maksimal të dështimeve gjatë analizës:
Në përfundim
Startimi i një rrjeti shërbimesh, si Istio, përveç Kubernetes do të ofrojë metrikë, loge dhe protokolle automatike, por implementimi i ngarkesave të punës ende varet nga mjetet e jashtme. Flagger ka për qëllim të ndryshojë këtë situatë duke shtuar Istio mundësi .
Flagger është në përputhje me çdo zgjidhje CI/CD për Kubernetes, dhe analiza canary mund të zgjerohet lehtësisht me për kryerjen e provave sistemike të integrimit/pranimit, provave nën ngarkesë ose çdo kontroll tjetër të personalizuar. Duke qenë se Flagger është deklarativ dhe reagon ndaj ngjarjeve të Kubernetes, mund të përdoret në lidhjet GitOps së bashku me ose . Nëse përdorni JenkinsX, mund të instaloni Flagger me shtesat jx.
Flagger mbështetet nga dhe siguron implementime canary në . Projekti teston në GKE, EKS dhe "zhguni metalik" me kubeadm.
Nëse keni sugjerime për përmirësimin e Flagger, ju lutemi dërgoni një pyetje ose PR në GitHub në adresën . Kontributet janë më shumë se të mirëpritura!
anonim kommentatorit .
Burimi: habr.com
