CD wekî pratîkek nermalava pargîdaniyê tê nas kirin û encama pêşveçûnek xwezayî ya prensîbên CI-yê yên sazkirî ye. Lêbelê, CD hîn jî pir kêm e, dibe ku ji ber tevliheviya rêveberiyê û tirsa sepanên têkçûyî ku bandorê li hebûna pergalê dike.
Li jêr rêbernameyek gav bi gav ji bo sazkirin û karanîna Flagger li ser Google Kubernetes Engine (GKE) heye.
Sazkirina komek Kubernetes
Hûn bi pêveka Istio re dest bi afirandina komek GKE-yê dikin (heke we hesabek GCP-ê tune, hûn dikarin qeyd bikin
Têkeve Google Cloud-ê, projeyek biafirînin û ji bo wê fatûreyê çalak bikin. Karsaziya rêzika fermanê saz bikin gcloud init
.
Projeya xwerû, qada hesabkirinê, û deverê bicîh bikin (li şûna PROJECT_ID
ji bo projeya we):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Karûbarê GKE çalak bikin û bi pêvekên HPA û Istio re komek biafirînin:
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
Fermana li jor dê hewzek girêkek xwerû ya ku du VM jî tê de ye biafirîne n1-standard-2
(vCPU: 2, RAM 7,5 GB, dîsk: 30 GB). Bi îdeal, divê hûn hêmanên Istio ji barkêşên xebata xwe veqetînin, lê rêyek hêsan tune ku hûn Istio Pods di hewzek diyarkirî ya girêkan de bimeşînin. Manîfestoyên Istio tenê-xwendewar têne hesibandin û GKE dê her guhartinan betal bike, wek mînak girêdana bi nodek an veqetandina ji podek.
Ji bo pêbaweriyan saz bikin kubectl
:
gcloud container clusters get-credentials istio
Girêdana rola rêveberê komê biafirîne:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Amûra rêza fermanê saz bikin
brew install kubernetes-helm
Homebrew 2.0 niha ji bo jî heye
Ji bo Tiller hesabek karûbar û girêdana rola komê biafirînin:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Tiller di navan de berfireh bikin kube-system
:
helm init --service-account tiller
Pêdivî ye ku hûn SSL-ê di navbera Helm û Tiller de bikar bînin. Ji bo bêtir agahdarî di derbarê parastina sazkirina Helmê de, bibînin
Mîhengan piştrast bikin:
kubectl -n istio-system get svc
Piştî çend saniyan, GCP divê ji bo karûbarê navnîşanek IP-ya derveyî destnîşan bike istio-ingressgateway
.
Veavakirina Deriyê Ingressê ya Istio
Navnîşanek IP-ya statîk bi navek çêbikin istio-gateway
bi karanîna navnîşana IP-ê ya dergehê 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-central1
Naha hûn hewceyê domainek înternetê û gihîştina tomara DNS-ya xwe hewce ne. Du tomar A lê zêde bike (li şûna example.com
ji domaina xwe re):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Piştrast bikin ku kartê çolê DNS dixebite:
watch host test.istio.example.com
Dergehek Istio ya gelemperî biafirînin da ku karûbarên li derveyî tevna karûbarê li ser HTTP peyda bikin:
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:
- "*"
Çavkaniya jorîn wekî public-gateway.yaml hilînin û dûv re wê bicîh bikin:
kubectl apply -f ./public-gateway.yaml
Divê tu pergala hilberînê li ser Înternetê bêyî SSL karûbar peyda neke. Ji bo ewlekirina dergehê ketina Istio bi cert-rêveber, CloudDNS û Let's Encrypt, ji kerema xwe bixwînin
Installation Flagger
Pêveka GKE Istio mînakek Prometheus ku karûbarê telemetrîya Istio paqij dike vedihewîne. Ji ber ku Flagger metrîkên Istio HTTP bikar tîne da ku analîza canary bike, hûn hewce ne ku veavakirina Prometheus ya jêrîn, mîna ya ku bi şemaya fermî ya Istio Helm re tê, bicîh bikin.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Depoya Flagger Helm zêde bikin:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Flagger li cîhê navan berfireh bike istio-system
bi çalakkirina notifications 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=flagger
Hûn dikarin Flagger di her navekî de saz bikin heya ku ew dikare bi karûbarê Istio Prometheus re li ser porta 9090 re têkilî daynin.
Flagger ji bo analîza kenarê tabloyek Grafana heye. Grafana di navan de saz bikin 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
Grafana di nav dergehek vekirî de bi afirandina karûbarek virtual (li şûna example.com
ji domaina xwe re):
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
Çavkaniya jorîn wekî grafana-virtual-service.yaml hilînin û dûv re wê bicîh bikin:
kubectl apply -f ./grafana-virtual-service.yaml
Dema ku diçin http://grafana.istio.example.com
di gerokê de, divê hûn berbi rûpela têketina Grafana ve werin rêve kirin.
Bi Flagger re serîlêdanên webê bicîh dikin
Flagger Kubernetes bi cîh dike û vebijarkî bixweber (HPA) dipîve, dûv re rêzek tiştan diafirîne (bikaranîna Kubernetes, karûbarên ClusterIP, û karûbarên virtual Istio). Van tiştan serîlêdanê li ser tevna karûbarê radixe ber çavan û analîz û pêşkeftina canaryê kontrol dike.
Bi derzîlêdana Istio Sidecar çalakkirî navek navek ceribandinê biafirînin:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Veguheztinek û amûrek pîvana otomatîkî ya pod biafirînin:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Karûbarek barkirina ceribandinê bicîh bikin ku di dema analîza canary de seyrûseferê çêbike:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Çavkaniyek canary xwerû biafirînin (li şûna example.com
ji domaina xwe re):
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/"
Çavkaniya jorîn wekî podinfo-canary.yaml hilînin û dûv re wê bicîh bikin:
kubectl apply -f ./podinfo-canary.yaml
Analîza jorîn, heke serketî be, dê pênc hûrdeman bimeşîne, her nîv hûrdem metrîkên HTTP-ê kontrol bike. Hûn dikarin dema herî hindik a ku ji bo erêkirin û pêşvebirina belavkirina kanariyê bi karanîna formula jêrîn hewce dike diyar bikin: interval * (maxWeight / stepWeight)
. Zeviyên CRD yên Kanaryayê têne belge kirin
Piştî çend saniyeyan, Flagger dê tiştên kanaryan biafirîne:
# 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
Gerokek vekin û biçin app.istio.example.com
, divê hûn jimareya guhertoyê bibînin
Analîz û danasîna canaryên otomatîkî
Flagger pêleka kontrolê pêk tîne ku hêdî hêdî seyrûseferê ber bi kanariyê ve dipîve dema ku pîvanên performansa sereke yên wekî rêjeya serkeftina daxwaza HTTP, dirêjahiya daxwaziya navîn, û tenduristiya pod dipîve. Li ser bingeha analîza KPI-ê, kanar tê pêşve xistin an qut kirin, û encamên analîzê ji Slack re têne weşandin.
Dema ku yek ji hêmanên jêrîn biguhere, belavkirina Kanaryayê tê destpêkirin:
- PodSpec (wêneya konteyner, ferman, port, env, hwd.) bicîh bikin
- ConfigMaps wekî cild têne danîn an jî li guhêrbarên jîngehê têne nexşandin
- Veşartî wekî cild têne danîn an vediguhezînin guhêrbarên hawîrdorê
Dema ku wêneyek konteynerê nûve dike, danasîna canary bimeşîne:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger destnîşan dike ku guhertoya bicîhkirinê guheriye û dest bi parskirina wê dike:
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
Di dema analîzê de, encamên canary dikare bi karanîna Grafana were şopandin:
Ji kerema xwe bala xwe bidin ku heke di dema analîza kanaryan de guhertinên nû li ser vesazkirinê werin sepandin, wê hingê Flagger dê qonaxa analîzê ji nû ve bide destpêkirin.
Navnîşek hemî kanareyên di koma xwe de çêbikin:
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
Ger we agahdariya Slack çalak kiribe, hûn ê peyamên jêrîn bistînin:
Vegera otomatîk
Di dema analîza canary de, hûn dikarin xeletiyên HTTP 500-a sentetîk û derengiya bersivê ya bilind biafirînin da ku bibînin ka Flagger dê bicîhkirinê rawestîne.
Pîvanek testê biafirînin û di wê de jêrîn bikin:
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
Hilberîna xeletiyên HTTP 500:
watch curl http://podinfo-canary:9898/status/500
Nifşa derengmayînê:
watch curl http://podinfo-canary:9898/delay/1
Dema ku jimareya kontrolên têkçûyî digihîje astekê, seyrûsefer berbi kanala bingehîn ve tê rêve kirin, kanar bi sifirê tê pîvandin, û bicîhkirin wekî têkçûyî tê nîşankirin.
Çewtiyên Kanarya û pêlên derengiyê wekî bûyerên Kubernetes têne tomar kirin û ji hêla Flagger ve di formata JSON de têne tomar kirin:
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
Ger we agahdariya Slack çalak kiribe, gava ku mawe derbas bibe an jî hejmara herî zêde ya kontrolên têkçûyî di analîzê de were gihîştin dê peyamek bistînin:
Di encamê de
Rêvekirina tevnek karûbarê mîna Istio ji bilî Kubernetes dê metrîk, têketin û protokolên otomatîk peyda bike, lê bicîhkirina barkirina xebatê hîn jî bi amûrên derveyî ve girêdayî ye. Flagger armanc dike ku vê yekê bi zêdekirina kapasîteyên Istio biguhezîne
Flagger bi her çareseriya Kubernetes CI/CD-ê re hevaheng e, û analîza canary bi hêsanî dikare bi
Flagger piştgirî kir
Ger ji bo baştirkirina Flagger pêşniyarên we hene, ji kerema xwe pirsgirêkek an PR-ê li ser GitHub bişînin
Sipî
Source: www.habr.com