سي ڊي هڪ انٽرپرائز سافٽ ويئر جي مشق طور سڃاتو وڃي ٿو ۽ قائم ڪيل CI اصولن جو هڪ قدرتي ارتقا آهي. بهرحال، سي ڊي اڃا تائين ڪافي ناياب آهي، شايد انتظاميا جي پيچيدگي ۽ ناڪامي ڊيپلائيمينٽ جي خوف جي ڪري سسٽم جي دستيابي کي متاثر ڪري.
Google Kubernetes Engine (GKE) تي Flagger کي ترتيب ڏيڻ ۽ استعمال ڪرڻ لاءِ ھيٺ ھڪ قدم قدم ھدايت آھي.
Kubernetes ڪلستر قائم ڪرڻ
توهان Istio add-on سان GKE ڪلستر ٺاهي شروع ڪريو (جيڪڏهن توهان وٽ GCP اڪائونٽ نه آهي، توهان سائن اپ ڪري سگهو ٿا
Google Cloud ۾ سائن ان ڪريو، ھڪڙو پروجيڪٽ ٺاھيو، ۽ ان لاءِ بلنگ کي فعال ڪريو. انسٽال ڪريو ڪمانڊ لائن افاديت 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
مٿي ڏنل حڪم هڪ ڊفالٽ نوڊ پول ٺاهيندو جنهن ۾ ٻه VM شامل آهن n1-standard-2
(vCPU: 2، رام 7,5 GB، ڊسڪ: 30 GB). مثالي طور، Istio اجزاء کي انهن جي ڪم جي لوڊ کان الڳ ٿيڻ گهرجي، پر هڪ وقف ٿيل نوڊ پول تي Istio پوڊس کي هلائڻ جو ڪو آسان طريقو ناهي. 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
Homebrew 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 استعمال ڪرڻ جي وچ ۾ Helm ۽ Tiller. توهان جي Helm تنصيب جي حفاظت بابت وڌيڪ معلومات لاء، ڏسو
سيٽنگون جي تصديق ڪريو:
kubectl -n istio-system get svc
ڪجھ سيڪنڊن کان پوء، GCP کي خدمت لاء هڪ ٻاهرين IP پتي کي تفويض ڪرڻ گهرجي istio-ingressgateway
.
Istio Ingress Gateway قائم ڪرڻ
نالي سان هڪ جامد 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 تي سروس ميش کان ٻاهر خدمتون مهيا ڪرڻ لاءِ هڪ عام Istio گيٽ وي ٺاهيو:
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:
- "*"
مٿي ڏنل وسيلن کي پبلڪ-gateway.yaml طور محفوظ ڪريو ۽ پوءِ ان کي لاڳو ڪريو:
kubectl apply -f ./public-gateway.yaml
ڪنهن به پيداواري نظام کي SSL کان سواءِ انٽرنيٽ تي خدمتون مهيا ڪرڻ گهرجن. سرٽيفڪيشن مئنيجر، CloudDNS ۽ Let's Encrypt سان پنهنجي Istio ingress gateway کي محفوظ ڪرڻ لاءِ، مهرباني ڪري پڙهو
پرچم جي انسٽاليشن
GKE Istio add-on ۾ Prometheus مثال شامل نه آهي جيڪو Istio ٽيليميٽري سروس کي صاف ڪري ٿو. جيئن ته Flagger ڪينري تجزيي کي انجام ڏيڻ لاءِ Istio HTTP ميٽرڪس استعمال ڪري ٿو، توهان کي هيٺين Prometheus configuration کي ترتيب ڏيڻ جي ضرورت آهي، هڪ جهڙو جيڪو سرڪاري Istio Helm اسڪيما سان اچي ٿو.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Flagger Helm مخزن شامل ڪريو:
helm repo add flagger [https://flagger.app](https://flagger.app/)
فليگر کي نالي جي جاء تي وڌايو istio-system
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
توهان Flagger انسٽال ڪري سگهو ٿا ڪنهن به نالي جي جاءِ تي جيستائين اهو رابطو ڪري سگهي Istio Prometheus سروس سان پورٽ 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
توھان جو برائوزر توھان کي ريڊائريڪٽ ڪرڻ گھرجي Grafana لاگ ان صفحي ڏانھن.
Flagger سان ويب ايپليڪيشنن کي ترتيب ڏيڻ
فليگر ڪبرنيٽس کي ترتيب ڏئي ٿو ۽، جيڪڏهن ضروري هجي ته، افقي آٽو اسڪيلنگ (HPA)، پوءِ شين جو هڪ سلسلو ٺاهي ٿو (Kubernetes deployments، ClusterIP خدمتون ۽ Istio ورچوئل سروسز). اهي شيون ايپليڪيشن کي بي نقاب ڪن ٿيون سروس ميش ۽ انتظام ڪنري تجزيي ۽ واڌاري.
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)
. ڪينري سي آر ڊي فيلڊز دستاويز ٿيل آهن
ڪجھ سيڪنڊن کان پوء، Flagger ڪينري شيون ٺاهيندو:
# 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 تجزيي جي بنياد تي، ڪينري کي ترقي يا ختم ڪيو ويو آهي، ۽ تجزيو جا نتيجا شايع ٿيل آهن Slack ۾.
ڪينري ڊيپلائيشن تڏهن شروع ٿيندي آهي جڏهن هيٺ ڏنل شيون تبديل ٿينديون آهن:
- پوڊ اسپيڪ کي ترتيب ڏيو (ڪنٽينر تصوير، ڪمانڊ، بندرگاهن، اين وي، وغيره)
- ConfigMaps حجم جي طور تي نصب ٿيل آهن يا ماحولياتي متغير ۾ تبديل ٿيل آهن
- راز حجم جي طور تي نصب ٿيل آهن يا ماحولياتي متغير ۾ تبديل ٿيل آهن
ڪنٽينر جي تصوير کي اپڊيٽ ڪرڻ وقت ڪينري ڊيپلائيشن هلايو:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger معلوم ٿئي ٿو ته ڊيپلائيشن ورزن تبديل ٿي چڪو آهي ۽ ان جو تجزيو ڪرڻ شروع ٿئي ٿو:
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
تجزيي دوران، ڪينري نتيجن جي نگراني ڪري سگهجي ٿو گرافانا استعمال ڪندي:
مھرباني ڪري نوٽ ڪريو: جيڪڏھن نيون تبديليون لاڳو ڪيون وينديون آھن ڪينري تجزيي دوران ڊيپلائيمينٽ تي، Flagger تجزيي جي مرحلي کي ٻيهر شروع ڪندو.
توهان جي ڪلستر ۾ سڀني ڪنارن جي هڪ فهرست ٺاهيو:
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 اطلاعن کي فعال ڪيو آهي، توهان کي هيٺيان پيغام ملندا:
خودڪار rollback
ڪينري تجزيي دوران، توهان ٺاهي سگهو ٿا مصنوعي 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
جيڪڏهن توهان Slack نوٽيفڪيشنز کي فعال ڪيو آهي، توهان کي هڪ پيغام ملندو جڏهن مڪمل ڪرڻ جي آخري تاريخ يا هڪ تجزيي ۾ ناڪامي جائزي جي وڌ ۾ وڌ تعداد تائين پهچي ويندي:
نتيجو
Kubernetes جي چوٽي تي Istio وانگر هڪ سروس ميش هلائڻ خودڪار ميٽرڪس، لاگس ۽ لاگز مهيا ڪندو، پر ڪم لوڊ کي ترتيب ڏيڻ اڃا به خارجي اوزار تي منحصر آهي. فليگر جو مقصد هن کي تبديل ڪرڻ آهي Istio صلاحيتن کي شامل ڪندي
فليگر ڪبرنيٽس لاءِ ڪنهن به CI/CD حل سان مطابقت رکي ٿو، ۽ ڪينري تجزيي کي آساني سان وڌايو وڃي ٿو
پرچم جي حمايت ڪئي وئي
جيڪڏهن توهان وٽ Flagger کي بهتر ڪرڻ لاءِ تجويزون آهن، مهرباني ڪري هڪ مسئلو يا پي آر جمع ڪرايو GitHub تي
Спасибо
جو ذريعو: www.habr.com