Mae CD yn cael ei gydnabod fel arfer meddalwedd menter ac mae'n ganlyniad esblygiad naturiol o egwyddorion CI sefydledig. Fodd bynnag, mae CD yn dal yn eithaf prin, efallai oherwydd cymhlethdod y rheolaeth a'r ofn y bydd defnydd methu yn effeithio ar argaeledd y system.
Isod mae canllaw cam wrth gam ar sefydlu a defnyddio Flagger ar Google Kubernetes Engine (GKE).
Sefydlu clwstwr Kubernetes
Rydych chi'n dechrau trwy greu clwstwr GKE gyda'r ychwanegiad Istio (os nad oes gennych chi gyfrif GCP, gallwch chi gofrestru
Mewngofnodwch i Google Cloud, creu prosiect, a galluogi bilio ar ei gyfer. Gosodwch y cyfleustodau llinell orchymyn gcloud init
.
Gosod y prosiect diofyn, yr ardal gyfrifo, a'r parth (disodli PROJECT_ID
ar gyfer eich prosiect):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Galluogi gwasanaeth GKE a chreu clwstwr gydag ychwanegion HPA ac 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_PERMISSIVE
Bydd y gorchymyn uchod yn creu cronfa nodau diofyn gan gynnwys dau VM n1-standard-2
(vCPU: 2, RAM 7,5 GB, disg: 30 GB). Yn ddelfrydol, dylech ynysu cydrannau Istio o'ch llwythi gwaith, ond nid oes ffordd hawdd o redeg Istio Pods mewn cronfa bwrpasol o nodau. Ystyrir maniffestau Istio yn ddarllenadwy yn unig a bydd GKE yn dad-wneud unrhyw newidiadau, megis cysylltu Γ’ nod neu ddatgysylltu o god.
Sefydlu tystlythyrau ar gyfer kubectl
:
gcloud container clusters get-credentials istio
Creu rΓ΄l gweinyddwr clwstwr sy'n rhwymo:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Gosodwch yr offeryn llinell orchymyn
brew install kubernetes-helm
Mae Homebrew 2.0 bellach ar gael ar gyfer
Creu cyfrif gwasanaeth a rΓ΄l clwstwr ar gyfer Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Ehangu Tiller yn y gofod enwau kube-system
:
helm init --service-account tiller
Dylech ystyried defnyddio SSL rhwng Helm a Tiller. Am ragor o wybodaeth am ddiogelu eich gosodiad Helm, gweler
Cadarnhau gosodiadau:
kubectl -n istio-system get svc
Ar Γ΄l ychydig eiliadau, dylai GCP neilltuo cyfeiriad IP allanol ar gyfer y gwasanaeth istio-ingressgateway
.
Ffurfweddu Porth Mynediad Istio
Creu cyfeiriad IP statig gydag enw istio-gateway
gan ddefnyddio cyfeiriad IP porth 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
Nawr mae angen parth rhyngrwyd arnoch chi a mynediad i'ch cofrestrydd DNS. Ychwanegu dau gofnod A (amnewid example.com
i'ch parth):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Gwiriwch fod y cerdyn gwyllt DNS yn gweithio:
watch host test.istio.example.com
Creu porth Istio generig i ddarparu gwasanaethau y tu allan i'r rhwyll gwasanaeth dros 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:
- "*"
Arbedwch yr adnodd uchod fel public-gateway.yaml ac yna ei gymhwyso:
kubectl apply -f ./public-gateway.yaml
Ni ddylai unrhyw system gynhyrchu ddarparu gwasanaethau ar y Rhyngrwyd heb SSL. I ddiogelu porth mynediad Istio gyda'r rheolwr tystysgrif, CloudDNS a Let's Encrypt, darllenwch
Gosodiad Flagger
Nid yw ychwanegiad GKE Istio yn cynnwys enghraifft Prometheus sy'n glanhau gwasanaeth telemetreg Istio. Gan fod Flagger yn defnyddio metrigau Istio HTTP i wneud dadansoddiad caneri, mae angen i chi ddefnyddio'r ffurfweddiad Prometheus canlynol, yn debyg i'r un sy'n dod gyda sgema swyddogol Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Ychwanegu ystorfa Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Ehangu Flagger i'r gofod enw istio-system
trwy alluogi hysbysiadau 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
Gallwch osod Flagger mewn unrhyw ofod enw cyn belled ag y gall gyfathrebu Γ’ gwasanaeth Istio Prometheus ar borth 9090.
Mae gan Flagger ddangosfwrdd Grafana ar gyfer dadansoddi caneri. Gosod Grafana mewn gofod enwau 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
Amlygwch Grafana trwy borth agored trwy greu gwasanaeth rhithwir (amnewid example.com
i'ch parth):
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
Arbedwch yr adnodd uchod fel grafana-virtual-service.yaml ac yna ei gymhwyso:
kubectl apply -f ./grafana-virtual-service.yaml
Wrth symud i http://grafana.istio.example.com
yn y porwr, dylech gael eich cyfeirio at dudalen mewngofnodi Grafana.
Defnyddio cymwysiadau gwe gyda Flagger
Mae Flagger yn defnyddio Kubernetes ac yn graddio'n awtomatig yn ddewisol (HPA), yna'n creu cyfres o wrthrychau (defnyddio Kubernetes, gwasanaethau ClusterIP, a gwasanaethau rhithwir Istio). Mae'r gwrthrychau hyn yn amlygu'r cais i'r rhwyll gwasanaeth ac yn rheoli dadansoddiad caneri a chynnydd.
Creu gofod enw prawf gyda chwistrelliad Istio Sidecar wedi'i alluogi:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Creu gosodiad a pod teclyn ehangu awtomatig:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Defnyddio gwasanaeth llwyth prawf i gynhyrchu traffig yn ystod dadansoddiad caneri:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Creu adnodd caneri wedi'i deilwra (amnewid example.com
i'ch parth):
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/"
Arbedwch yr adnodd uchod fel podinfo-canary.yaml ac yna ei gymhwyso:
kubectl apply -f ./podinfo-canary.yaml
Bydd y dadansoddiad uchod, os bydd yn llwyddiannus, yn rhedeg am bum munud, gan wirio metrigau HTTP bob hanner munud. Gallwch benderfynu ar yr amser lleiaf sydd ei angen i ddilysu a hyrwyddo lleoliad caneri gan ddefnyddio'r fformiwla ganlynol: interval * (maxWeight / stepWeight)
. Mae meysydd CRD Dedwydd wedi'u dogfennu
Ar Γ΄l ychydig eiliadau, bydd Flagger yn creu gwrthrychau caneri:
# 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
Agorwch borwr ac ewch i app.istio.example.com
, dylech weld rhif y fersiwn
Dadansoddi a hyrwyddo caneri'n awtomatig
Mae Flagger yn gweithredu dolen reoli sy'n symud traffig yn raddol i'r caneri wrth fesur metrigau perfformiad allweddol fel cyfradd llwyddiant ceisiadau HTTP, hyd cyfartalog ceisiadau, ac iechyd codennau. Yn seiliedig ar y dadansoddiad DPA, mae'r caneri'n cael ei hyrwyddo neu ei ymyrryd, a chyhoeddir canlyniadau'r dadansoddiad i Slack.
Mae lleoli caneri yn cael ei sbarduno pan fydd un o'r gwrthrychau canlynol yn newid:
- Defnyddio PodSpec (delwedd cynhwysydd, gorchymyn, porthladdoedd, amg, ac ati)
- Mae ConfigMaps yn cael eu gosod fel cyfeintiau neu eu mapio i newidynnau amgylchedd
- Mae cyfrinachau'n cael eu gosod fel cyfrolau neu'n cael eu trosi i newidynnau amgylchedd
Rhedeg gosod caneri wrth ddiweddaru delwedd cynhwysydd:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Mae Flagger yn canfod bod y fersiwn lleoli wedi newid ac yn dechrau ei dosrannu:
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
Yn ystod y dadansoddiad, gellir olrhain canlyniadau caneri gan ddefnyddio Grafana:
Sylwch, os bydd newidiadau newydd yn cael eu cymhwyso i ddefnydd yn ystod dadansoddiad caneri, yna bydd Flagger yn ailgychwyn y cam dadansoddi.
Gwnewch restr o'r holl ganeri yn eich clwstwr:
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
Os ydych wedi galluogi hysbysiadau Slack, byddwch yn derbyn y negeseuon canlynol:
Dychweliad awtomatig
Yn ystod dadansoddiad caneri, gallwch gynhyrchu gwallau HTTP 500 synthetig a hwyrni ymateb uchel i weld a fydd Flagger yn atal y defnydd.
Creu pod prawf a gwneud y canlynol ynddo:
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
Cynhyrchu gwallau HTTP 500:
watch curl http://podinfo-canary:9898/status/500
Cynhyrchu oedi:
watch curl http://podinfo-canary:9898/delay/1
Pan fydd nifer y gwiriadau a fethwyd yn cyrraedd y trothwy, mae'r traffig yn cael ei gyfeirio yn Γ΄l i'r sianel gynradd, mae'r caneri wedi'i raddio i sero, ac mae'r lleoliad wedi'i farcio fel methu.
Mae gwallau caneri a phigau hwyrni yn cael eu cofnodi fel digwyddiadau Kubernetes a'u cofnodi gan Flagger mewn fformat 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
Os ydych wedi galluogi hysbysiadau Slack, byddwch yn derbyn neges pan eir y tu hwnt i'r dyddiad cau neu pan gyrhaeddir y nifer uchaf o wiriadau a fethwyd yn y dadansoddiad:
I gloi
Bydd rhedeg rhwyll gwasanaeth fel Istio yn ogystal Γ’ Kubernetes yn darparu metrigau, logiau a phrotocolau awtomatig, ond mae defnyddio llwyth gwaith yn dal i ddibynnu ar offer allanol. Nod Flagger yw newid hyn trwy ychwanegu galluoedd Istio
Mae Flagger yn gydnaws ag unrhyw ddatrysiad CI/CD Kubernetes, a gellir ymestyn dadansoddiad caneri yn hawdd
Cefnogir fflagiwr
Os oes gennych awgrymiadau i wella Flagger, cyflwynwch fater neu gysylltiadau cyhoeddus ar GitHub yn
Diolch
Ffynhonnell: hab.com