CD کو ایک انٹرپرائز سافٹ ویئر پریکٹس کے طور پر تسلیم کیا جاتا ہے اور یہ CI کے قائم کردہ اصولوں کے قدرتی ارتقا کا نتیجہ ہے۔ تاہم، سی ڈی اب بھی کافی نایاب ہے، شاید انتظام کی پیچیدگی اور سسٹم کی دستیابی کو متاثر کرنے والے ناکام تعیناتیوں کے خوف کی وجہ سے۔
Google Kubernetes Engine (GKE) پر فلیگر کو ترتیب دینے اور استعمال کرنے کے لیے ذیل میں ایک مرحلہ وار گائیڈ ہے۔
Kubernetes کلسٹر قائم کرنا
آپ اسٹیو ایڈ آن کے ساتھ ایک 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 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
مذکورہ کمانڈ ایک ڈیفالٹ نوڈ پول بنائے گی جس میں دو VMs شامل ہیں۔ n1-standard-2
(vCPU: 2، RAM 7,5 GB، ڈسک: 30 GB)۔ مثالی طور پر، آپ کو اپنے کام کے بوجھ سے Istio اجزاء کو الگ کرنا چاہیے، لیکن نوڈس کے وقف شدہ پول میں Istio Pods کو چلانے کا کوئی آسان طریقہ نہیں ہے۔ اسٹیو مینی فیسٹس کو صرف پڑھنے کے لیے سمجھا جاتا ہے اور 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
.
Istio Ingress گیٹ وے کو ترتیب دینا
نام کے ساتھ ایک جامد 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:
- "*"
مندرجہ بالا وسائل کو بطور public-gateway.yaml محفوظ کریں اور پھر اسے لاگو کریں:
kubectl apply -f ./public-gateway.yaml
کسی بھی پیداواری نظام کو SSL کے بغیر انٹرنیٹ پر خدمات فراہم نہیں کرنی چاہیے۔ سرٹ مینیجر، CloudDNS اور Let's Encrypt کے ساتھ اسٹیو انگریس گیٹ وے کو محفوظ بنانے کے لیے، براہ کرم پڑھیں
فلیگر کی تنصیب
GKE Istio add-on میں Prometheus مثال شامل نہیں ہے جو Istio ٹیلی میٹری سروس کو صاف کرتا ہے۔ چونکہ فلیگر کینری تجزیہ کرنے کے لیے Istio HTTP میٹرکس کا استعمال کرتا ہے، اس لیے آپ کو درج ذیل Prometheus کنفیگریشن کو تعینات کرنے کی ضرورت ہے، جیسا کہ سرکاری Istio Helm اسکیما کے ساتھ آتا ہے۔
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 Prometheus سروس کے ساتھ بات چیت کر سکے۔
فلیگر کے پاس کینری تجزیہ کے لیے گرافانا ڈیش بورڈ ہے۔ نام کی جگہ میں گرافانا انسٹال کریں۔ 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
براؤزر میں، آپ کو گرافانا لاگ ان صفحہ پر بھیج دیا جانا چاہیے۔
Flagger کے ساتھ ویب ایپلیکیشنز کو تعینات کرنا
Flagger Kubernetes کو تعینات کرتا ہے اور اختیاری طور پر خود کار طریقے سے (HPA) کو اسکیل کرتا ہے، پھر اشیاء کی ایک سیریز بناتا ہے (Kubernetes کی تعیناتی، 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)
. کینری CRD فیلڈز دستاویزی ہیں۔
چند سیکنڈ کے بعد، 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
فلیگر کو پتہ چلتا ہے کہ تعیناتی ورژن بدل گیا ہے اور اسے پارس کرنا شروع کر دیتا ہے:
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 اطلاعات کو فعال کیا ہے، تو آپ کو درج ذیل پیغامات موصول ہوں گے:
خودکار رول بیک
کینری تجزیہ کے دوران، آپ مصنوعی HTTP 500 غلطیاں پیدا کر سکتے ہیں اور یہ دیکھنے کے لیے کہ آیا Flagger تعیناتی کو روک دے گا۔
ایک ٹیسٹ پوڈ بنائیں اور اس میں درج ذیل کام کریں:
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
جب ناکام چیکوں کی تعداد حد تک پہنچ جاتی ہے، تو ٹریفک کو واپس پرائمری چینل کی طرف لے جایا جاتا ہے، کینری کو صفر تک بڑھا دیا جاتا ہے، اور تعیناتی کو ناکام کے بطور نشان زد کیا جاتا ہے۔
کینری کی غلطیاں اور لیٹنسی اسپائکس کو Kubernetes ایونٹس کے طور پر لاگ کیا جاتا ہے اور JSON فارمیٹ میں Flagger کے ذریعے لاگ کیا جاتا ہے:
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 جیسے سروس میش کو چلانے سے خودکار میٹرکس، لاگز اور پروٹوکول ملیں گے، لیکن کام کے بوجھ کی تعیناتی اب بھی بیرونی ٹولز پر منحصر ہے۔ فلیگر کا مقصد اسٹیو صلاحیتوں کو شامل کرکے اسے تبدیل کرنا ہے۔
فلیگر کسی بھی Kubernetes CI/CD حل کے ساتھ مطابقت رکھتا ہے، اور کینری تجزیہ کو آسانی سے بڑھایا جا سکتا ہے۔
فلیگر نے تعاون کیا۔
اگر آپ کے پاس فلیگر کو بہتر بنانے کے لیے تجاویز ہیں، تو براہ کرم گٹ ہب پر ایشو یا PR جمع کرائیں۔
شکریہ
ماخذ: www.habr.com