Is-CD hija rikonoxxuta bħala prattika tas-softwer tal-intrapriża u hija evoluzzjoni naturali tal-prinċipji stabbiliti tas-CI. Madankollu, is-CD għadu pjuttost rari, forsi minħabba l-kumplessità tal-ġestjoni u l-biża 'ta' skjeramenti falluti li jaffettwaw id-disponibbiltà tas-sistema.
Hawn taħt hawn gwida pass pass biex twaqqaf u tuża Flagger fuq Google Kubernetes Engine (GKE).
Twaqqif ta' cluster Kubernetes
Tibda billi toħloq cluster GKE bis-add-on Istio (jekk m'għandekx kont tal-GCP, tista' tiffirma
Idħol f'Google Cloud, oħloq proġett, u ppermetti l-kontijiet għalih. Installa l-utilità tal-linja tal-kmand gcloud init
.
Issettja l-proġett default, iż-żona tal-komputazzjoni, u ż-żona (issostitwixxi PROJECT_ID
għall-proġett tiegħek):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Ippermetti s-servizz GKE u oħloq cluster b'HPA u Istio add-ons:
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
Il-kmand ta 'hawn fuq se joħloq ġabra ta' nodi default li tikkonsisti f'żewġ VMs n1-standard-2
(vCPU: 2, RAM 7,5 GB, disk: 30 GB). Idealment, il-komponenti Istio għandhom ikunu iżolati mill-piżijiet tax-xogħol tagħhom, iżda m'hemm l-ebda mod faċli biex imexxu Istio pods fuq ġabra ta 'nodi ddedikata. Il-manifesti ta' Istio huma kkunsidrati bħala li jinqraw biss, u GKE se jreġġa' lura kwalunkwe tibdil bħal jorbot ma' node jew jinqala' minn pod.
Stabbilixxi kredenzjali għal kubectl
:
gcloud container clusters get-credentials istio
Oħloq rabta tar-rwol tal-amministratur tal-cluster:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Installa l-għodda tal-linja tal-kmand
brew install kubernetes-helm
Homebrew 2.0 issa huwa wkoll disponibbli għal
Oħloq kont tas-servizz u rabta tar-rwol tal-cluster għal Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Jespandi Tiller fl-ispazju tal-isem kube-system
:
helm init --service-account tiller
Għandek tikkunsidra li tuża SSL bejn Helm u Tiller. Għal aktar informazzjoni dwar il-protezzjoni tal-installazzjoni ta' Helm tiegħek, ara
Ikkonferma s-settings:
kubectl -n istio-system get svc
Wara ftit sekondi, GCP għandu jassenja indirizz IP estern lis-servizz istio-ingressgateway
.
It-twaqqif ta' Istio Ingress Gateway
Oħloq indirizz IP statiku bl-isem istio-gateway
billi tuża l-indirizz IP tal-portal ta' 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
Issa għandek bżonn dominju tal-internet u aċċess għar-reġistratur tad-DNS tiegħek. Żid żewġ rekords A (issostitwixxi example.com
għad-dominju tiegħek):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Ivverifika li l-wildcard tad-DNS qed jaħdem:
watch host test.istio.example.com
Oħloq gateway Istio ġeneriku biex tipprovdi servizzi barra l-malja tas-servizz fuq 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:
- "*"
Issejvja r-riżors ta’ hawn fuq bħala public-gateway.yaml u mbagħad applikaha:
kubectl apply -f ./public-gateway.yaml
L-ebda sistema ta' produzzjoni m'għandha tipprovdi servizzi fuq l-Internet mingħajr SSL. Biex tiżgura l-gateway tad-dħul ta' Istio tiegħek ma' cert-manager, CloudDNS u Let's Encrypt, jekk jogħġbok aqra
Installazzjoni tal-bandiera
Il-GKE Istio add-on ma jinkludix l-istanza Prometheus li tnaddaf is-servizz tat-telemetrija Istio. Peress li Flagger juża metriċi Istio HTTP biex iwettaq analiżi tal-kanarji, għandek bżonn tuża l-konfigurazzjoni Prometheus li ġejja, simili għal dik li tiġi mal-iskema uffiċjali ta 'Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Żid ir-repożitorju tal-Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Jespandi Flagger għal namespace istio-system
billi tattiva notifiki 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
Tista' tinstalla Flagger fi kwalunkwe namespace sakemm tkun tista' tikkomunika mas-servizz Istio Prometheus fuq il-port 9090.
Flagger għandu dashboard Grafana għall-analiżi tal-kanarji. Installa Grafana fl-ispazju tal-isem 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
Esponi Grafana permezz ta’ portal miftuħ billi toħloq servizz virtwali (issostitwixxi example.com
għad-dominju tiegħek):
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
Ħlief ir-riżors ta' hawn fuq bħala grafana-virtual-service.yaml u mbagħad applikaha:
kubectl apply -f ./grafana-virtual-service.yaml
Meta tmur http://grafana.istio.example.com
Il-browser tiegħek għandu jidderieġik lejn il-paġna tal-login ta' Grafana.
L-iskjerament ta' applikazzjonijiet tal-web ma' Flagger
Flagger juża Kubernetes u, jekk meħtieġ, horizontal autoscaling (HPA), imbagħad joħloq serje ta 'oġġetti (skjeramenti ta' Kubernetes, servizzi ClusterIP u servizzi virtwali Istio). Dawn l-oġġetti jesponu l-applikazzjoni għall-malji tas-servizz u jimmaniġġjaw l-analiżi u l-promozzjoni tal-kanarji.
Oħloq spazju tal-isem tat-test bl-implimentazzjoni Istio Sidecar attivata:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Oħloq skjerament u għodda awtomatika ta' skalar orizzontali għall-pod:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Uża servizz tat-test tat-tagħbija biex tiġġenera traffiku waqt l-analiżi tal-kanarji:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Oħloq riżors tal-kanarju tad-dwana (issostitwixxi example.com
għad-dominju tiegħek):
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/"
Ħlief ir-riżors ta' hawn fuq bħala podinfo-canary.yaml u mbagħad applikaha:
kubectl apply -f ./podinfo-canary.yaml
L-analiżi ta 'hawn fuq, jekk tirnexxi, se taħdem għal ħames minuti, u tiċċekkja l-metriċi HTTP kull nofs minuta. Tista' tiddetermina l-ħin minimu meħtieġ biex tittestja u tippromwovi skjerament tal-kanarji billi tuża l-formula li ġejja: interval * (maxWeight / stepWeight)
. L-oqsma tas-CRD tal-Kanarji huma dokumentati
Wara ftit sekondi, Flagger se joħloq oġġetti kanarji:
# 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
Iftaħ il-browser tiegħek u mur fuq app.istio.example.com
, għandek tara n-numru tal-verżjoni
Analiżi u promozzjoni awtomatiċi tal-kanarji
Flagger jimplimenta linja ta 'kontroll li gradwalment iċċaqlaq it-traffiku lejn il-kanarju filwaqt li jkejjel l-indikaturi ewlenin tal-prestazzjoni bħar-rata ta' suċċess tat-talba HTTP, it-tul medju tat-talba, u s-saħħa tal-pods. Ibbażat fuq l-analiżi KPI, il-kanarju jiġi promoss jew mitmum, u r-riżultati tal-analiżi huma ppubblikati fi Slack.
L-iskjerament tal-Kanarji jinbeda meta wieħed mill-oġġetti li ġejjin jinbidel:
- Uża PodSpec (immaġni tal-kontenitur, kmand, portijiet, env, eċċ.)
- ConfigMaps huma mmuntati bħala volumi jew konvertiti għal varjabbli ambjentali
- Sigrieti huma mmuntati bħala volumi jew konvertiti għal varjabbli ambjentali
Mexxi l-iskjerament tal-kanarji meta taġġorna l-immaġni tal-kontejner:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger jiskopri li l-verżjoni tal-iskjerament inbidlet u jibda janalizzaha:
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
Waqt l-analiżi, ir-riżultati tal-kanarji jistgħu jiġu mmonitorjati bl-użu ta’ Grafana:
Jekk jogħġbok innota: jekk jiġu applikati bidliet ġodda għall-iskjerament waqt l-analiżi tal-Canary, Flagger jerġa' jibda l-fażi tal-analiżi.
Agħmel lista tal-kanarini kollha fil-grupp tiegħek:
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
Jekk għamilt notifiki Slack, tirċievi l-messaġġi li ġejjin:
Qlib awtomatiku
Waqt l-analiżi tal-kanarji, tista 'tiġġenera żbalji HTTP 500 sintetiċi u latenza għolja ta' rispons biex tivverifika jekk Flagger iwaqqafx l-iskjerament.
Oħloq pod tat-test u agħmel dan li ġej fih:
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
Jiġġeneraw żbalji HTTP 500:
watch curl http://podinfo-canary:9898/status/500
Dewmien fil-ġenerazzjoni:
watch curl http://podinfo-canary:9898/delay/1
Meta n-numru ta 'kontrolli falluti jilħaq limitu, it-traffiku jiġi mgħoddi lura lejn il-kanal primarju, il-kanarju jiġi skalat għal żero, u l-iskjerament jiġi mmarkat bħala fallut.
L-iżbalji tal-Canary u l-ispikes ta' latenza huma rreġistrati bħala avvenimenti Kubernetes u rreġistrati minn Flagger fil-format JSON:
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
Jekk għamilt notifiki Slack, tirċievi messaġġ meta tinqabeż l-iskadenza biex jitlesta jew jintlaħaq in-numru massimu ta' reviżjonijiet falluti f'analiżi:
Bħala konklużjoni
It-tħaddim ta 'malji ta' servizz bħal Istio fuq Kubernetes se jipprovdi metriċi, zkuk, u zkuk awtomatiċi, iżda l-iskjerament ta 'tagħbija tax-xogħol xorta jiddependi fuq għodod esterni. Flagger għandu l-għan li jibdel dan billi jżid il-kapaċitajiet Istio
Flagger huwa kompatibbli ma 'kwalunkwe soluzzjoni CI/CD għal Kubernetes, u l-analiżi tal-kanarji tista' tiġi estiża faċilment
Flagger appoġġjat
Jekk għandek suġġerimenti biex ittejjeb Flagger, jekk jogħġbok ibgħat kwistjoni jew PR fuq GitHub fuq
Grazzi
Sors: www.habr.com