CD د تصدۍ سافټویر تمرین په توګه پیژندل شوی او د تاسیس شوي CI اصولو طبیعي تکامل پایله ده. په هرصورت، CD لاهم خورا نادره ده، شاید د مدیریت پیچلتیا او د ناکامې ګمارنې ویره له امله چې د سیسټم شتون اغیزه کوي.
لاندې د ګوګل Kubernetes Engine (GKE) کې د فلیګر تنظیم کولو او کارولو لپاره ګام په ګام لارښود دی.
د Kubernetes کلستر تنظیم کول
تاسو د Istio اضافو سره د GKE کلستر په جوړولو سره پیل کوئ (که تاسو د GCP حساب نلرئ، تاسو لاسلیک کولی شئ
په ګوګل کلاوډ کې لاسلیک وکړئ، یوه پروژه جوړه کړئ، او د دې لپاره بلینګ فعال کړئ. د کمانډ لاین افادیت نصب کړئ gcloud init
.
ډیفالټ پروژه تنظیم کړئ ، د محاسبې ساحه ، او زون (بدل کړئ PROJECT_ID
ستاسو د پروژې لپاره):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
د GKE خدمت فعال کړئ او د HPA او 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
پورته کمانډ به د دوه VMs په شمول د ډیفالټ نوډ پول رامینځته کړي n1-standard-2
(vCPU: 2، RAM 7,5 GB، ډیسک: 30 GB). په عین حال کې، تاسو باید د خپلو کاري بارونو څخه د اسټیو اجزا جلا کړئ، مګر د نوډونو وقف شوي حوض کې د اسټیو پوډونو چلولو لپاره کومه اسانه لار نشته. Istio manifests یوازې د لوستلو وړ ګڼل کیږي او GKE به هر ډول بدلونونه له مینځه یوسي، لکه د نوډ سره نښلول یا له پوډ څخه جلا کول.
لپاره اسناد ترتیب کړئ kubectl
:
gcloud container clusters get-credentials istio
د کلستر مدیر رول پابند جوړ کړئ:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
د کمانډ لاین وسیله نصب کړئ
brew install kubernetes-helm
هومبریو 2.0 اوس د دې لپاره هم شتون لري
د خدمت حساب جوړ کړئ او د ټیلر لپاره د کلستر رول پابند:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
په نوم ځای کې ټیلر پراخ کړئ kube-system
:
helm init --service-account tiller
تاسو باید د هیلم او ټیلر ترمنځ د SSL کارولو په اړه فکر وکړئ. ستاسو د هیلم نصبولو د ساتنې په اړه د نورو معلوماتو لپاره، وګورئ
ترتیبات تایید کړئ:
kubectl -n istio-system get svc
د څو ثانیو وروسته، GCP باید د خدمت لپاره یو بهرنی IP پته وټاکي istio-ingressgateway
.
د اسټیو داخلې دروازې تنظیم کول
د نوم سره یو جامد IP پته جوړه کړئ istio-gateway
د Istio دروازې IP پته کارول:
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
اوس تاسو د انټرنیټ ډومین ته اړتیا لرئ او خپل DNS راجستر ته لاسرسی ومومئ. دوه A ریکارډونه اضافه کړئ (بدل کړئ example.com
ستاسو ډومین ته):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
تایید کړئ چې د DNS وائلډ کارډ کار کوي:
watch host test.istio.example.com
د 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:
- "*"
پورته سرچینې د public-gateway.yaml په توګه خوندي کړئ او بیا یې پلي کړئ:
kubectl apply -f ./public-gateway.yaml
د تولید هیڅ سیسټم باید د SSL پرته په انټرنیټ کې خدمات وړاندې کړي. د سند مدیر ، کلاوډ ډی این ایس او لیټز کوډ کولو سره د اسټیو داخلې دروازې خوندي کولو لپاره ، مهرباني وکړئ ولولئ
د فلیګر نصب کول
د GKE اسټیو اضافه کې د پرومیټیوس مثال شامل نه دی چې د اسټیو ټیلی میټري خدمت پاکوي. ځکه چې فلیګر د کانري تحلیل ترسره کولو لپاره د اسټیو HTTP میټریکونه کاروي ، تاسو اړتیا لرئ لاندې پرومیټیوس ترتیب تنظیم کړئ ، ورته ورته چې د رسمي اسټیو هیلم سکیما سره راځي.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
د فلیګر هیلم ذخیره اضافه کړئ:
helm repo add flagger [https://flagger.app](https://flagger.app/)
فلیګر نوم ځای ته پراخ کړئ istio-system
د سلیک خبرتیاو په فعالولو سره:
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
تاسو کولی شئ فلیګر په هر نوم ځای کې نصب کړئ تر هغه چې دا په پورټ 9090 کې د اسټیو پرومیتیس خدمت سره اړیکه ونیسي.
فلیګر د کانري تحلیل لپاره د ګرافانا ډشبورډ لري. په نوم ځای کې ګرافانا نصب کړئ 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
ګرافانا د خلاصې دروازې له لارې د مجازی خدمت رامینځته کولو سره افشا کړئ (بدل کړئ example.com
ستاسو ډومین ته):
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
پورتنۍ سرچینې د grafana-virtual-service.yaml په توګه خوندي کړئ او بیا یې پلي کړئ:
kubectl apply -f ./grafana-virtual-service.yaml
کله چې حرکت کوي http://grafana.istio.example.com
په براوزر کې، تاسو باید د ګرافانا د ننوتلو پاڼې ته واستول شي.
د فلیګر سره د ویب غوښتنلیکونو ځای په ځای کول
فلیګر کوبرنیټس ځای په ځای کوي او په اختیاري ډول په اتوماتيک ډول اندازه کوي (HPA)، بیا د شیانو لړۍ رامینځته کوي (د کوبرنیټس ګمارنې، د کلسترپ خدمتونه، او د اسټیو مجازی خدمتونه). دا توکي غوښتنلیک د خدمت میش او کنټرول کانري تحلیل او پرمختګ ته رسوي.
د Istio Sidecar انجیکشن فعال شوي سره د ازموینې نوم ځای رامینځته کړئ:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
یو ځای پرځای کول او د پوډ اتوماتیک پیمانه آوټ وسیله رامینځته کړئ:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
د کانري تحلیل په جریان کې ترافیک رامینځته کولو لپاره د ازموینې بار خدمت ځای په ځای کړئ:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
د دودیز کانري سرچینې رامینځته کړئ (بدل کړئ example.com
ستاسو ډومین ته):
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/"
پورتنۍ سرچینې د podinfo-canary.yaml په توګه خوندي کړئ او بیا یې پلي کړئ:
kubectl apply -f ./podinfo-canary.yaml
پورته تحلیل، که بریالی وي، د پنځو دقیقو لپاره به وګرځي، په هر نیمه دقیقه کې د HTTP میټریک چک کوي. تاسو کولی شئ د لاندې فورمول په کارولو سره د کانري ګمارنې تایید او وده ورکولو لپاره اړین لږترلږه وخت وټاکئ: interval * (maxWeight / stepWeight)
. د کانري CRD ساحې مستند شوي
د څو ثانیو وروسته، فلیګر به کانري توکي جوړ کړي:
# 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
یو براوزر خلاص کړئ او لاړ شئ app.istio.example.com
، تاسو باید د نسخې شمیره وګورئ
د کانري اتوماتیک تحلیل او ترویج
فلیګر د کنټرول لوپ پلي کوي چې په تدریجي ډول کانري ته ترافیک حرکت کوي پداسې حال کې چې د کلیدي فعالیت میټریک اندازه کول لکه د HTTP غوښتنې بریالیتوب کچه ، د اوسط غوښتنې موده ، او د پوډ روغتیا. د KPI تحلیل پراساس، کانری وده یا مداخله کوي، او د تحلیل پایلې سلیک ته خپریږي.
د کانري ګمارنه هغه وخت پیل کیږي کله چې د لاندې شیانو څخه یو بدل شي:
- د پوډ سپیک ځای په ځای کړئ (د کانټینر عکس ، کمانډ ، بندرونه ، env ، او نور)
- ConfigMaps د حجم په توګه نصب شوي یا د چاپیریال متغیرونو سره نقشه شوي
- رازونه د حجمونو په توګه نصب شوي یا د چاپیریال تغیراتو ته بدل شوي
د کانتینر عکس تازه کولو پر مهال د کانري پلي کول چل کړئ:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
فلیګر کشف کوي چې د ګمارنې نسخه بدله شوې او د دې تحلیل پیل کوي:
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
د تحلیل په جریان کې ، د کانري پایلې د ګرافانا په کارولو سره تعقیب کیدی شي:
مهرباني وکړئ په یاد ولرئ که چیرې د کانري تحلیل په جریان کې نوي بدلونونه پلي شي ، نو فلیګر به د تحلیل مرحله بیا پیل کړي.
ستاسو په کلستر کې د ټولو کانریانو لیست جوړ کړئ:
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
که تاسو د Slack خبرتیاوې فعاله کړې وي، تاسو به لاندې پیغامونه ترلاسه کړئ:
اتوماتیک رول بیک
د کانري تحلیل په جریان کې، تاسو کولی شئ مصنوعي HTTP 500 غلطۍ او د لوړ غبرګون ځنډ پیدا کړئ ترڅو وګورئ چې فلیګر به د ګمارنې مخه ونیسي.
د ازموینې پوډ جوړ کړئ او لاندې یې وکړئ:
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
د HTTP 500 غلطۍ رامینځته کول:
watch curl http://podinfo-canary:9898/status/500
ځنډول:
watch curl http://podinfo-canary:9898/delay/1
کله چې د ناکامو چکونو شمیر حد ته ورسیږي، ټرافیک بیرته لومړني چینل ته لیږدول کیږي، کانری صفر ته اندازه کیږي، او ځای پرځای کول د ناکام په توګه نښه کیږي.
د کانري تېروتنې او د ځنډ سپیکونه د کوبرنیټس پیښو په توګه ثبت شوي او د فلیګر لخوا په 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
که تاسو د سلیک خبرتیاوې فعاله کړې وي، نو تاسو به یو پیغام ترلاسه کړئ کله چې د نیټې نیټې څخه تیریږي یا په تحلیل کې د ناکامو چکونو اعظمي شمیر ته رسیدلی وي:
په پای کې
د کوبرنیټس سربیره د اسټیو په څیر د خدماتو میش چلول به اتوماتیک میټریکونه ، لاګونه او پروتوکولونه چمتو کړي ، مګر د کار بار ځای په ځای کول لاهم په بهرني وسیلو پورې اړه لري. فلیګر هدف د اسټیو وړتیاو په اضافه کولو سره دا بدلول دي
فلیګر د هر Kubernetes CI/CD حل سره مطابقت لري، او د کانري تحلیل په اسانۍ سره پراخ کیدی شي.
پرچمګر ملاتړ شوی
که تاسو د فلیګر ښه کولو لپاره وړاندیزونه لرئ، مهرباني وکړئ په GitHub کې یوه مسله یا PR وسپارئ
سپوږمکۍ
سرچینه: www.habr.com