فلیگر اور اسٹیو کے ساتھ خودکار کینری تعیناتیاں

فلیگر اور اسٹیو کے ساتھ خودکار کینری تعیناتیاں

CD کو ایک انٹرپرائز سافٹ ویئر پریکٹس کے طور پر تسلیم کیا جاتا ہے اور یہ CI کے قائم کردہ اصولوں کے قدرتی ارتقا کا نتیجہ ہے۔ تاہم، سی ڈی اب بھی کافی نایاب ہے، شاید انتظام کی پیچیدگی اور سسٹم کی دستیابی کو متاثر کرنے والے ناکام تعیناتیوں کے خوف کی وجہ سے۔

جھنڈا لگانے والا ایک اوپن سورس Kubernetes آپریٹر ہے جس کا مقصد مبہم تعلقات کو ختم کرنا ہے۔ یہ Istio ٹریفک آفسیٹ اور Prometheus میٹرکس کا استعمال کرتے ہوئے کینری تعیناتیوں کے فروغ کو خودکار بناتا ہے تاکہ ایک منظم رول آؤٹ کے دوران ایپلیکیشن رویے کا تجزیہ کیا جا سکے۔

Google Kubernetes Engine (GKE) پر فلیگر کو ترتیب دینے اور استعمال کرنے کے لیے ذیل میں ایک مرحلہ وار گائیڈ ہے۔

Kubernetes کلسٹر قائم کرنا

آپ اسٹیو ایڈ آن کے ساتھ ایک GKE کلسٹر بنا کر شروع کرتے ہیں (اگر آپ کے پاس GCP اکاؤنٹ نہیں ہے، تو آپ سائن اپ کر سکتے ہیں یہاں - مفت کریڈٹ حاصل کرنے کے لیے)۔

گوگل کلاؤڈ میں سائن ان کریں، ایک پروجیکٹ بنائیں، اور اس کے لیے بلنگ کو فعال کریں۔ کمانڈ لائن یوٹیلیٹی انسٹال کریں۔ gcloud اور اس کے ساتھ اپنا پروجیکٹ ترتیب دیں۔ 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 استعمال کرنے پر غور کرنا چاہیے۔ اپنے ہیلم کی تنصیب کی حفاظت کے بارے میں مزید معلومات کے لیے، دیکھیں docs.helm.sh

ترتیبات کی تصدیق کریں:

kubectl -n istio-system get svc

چند سیکنڈ کے بعد، GCP کو سروس کے لیے ایک بیرونی IP ایڈریس تفویض کرنا چاہیے۔ istio-ingressgateway.

Istio Ingress گیٹ وے کو ترتیب دینا

نام کے ساتھ ایک جامد IP ایڈریس بنائیں istio-gatewayIstio گیٹ وے کے 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 کے ساتھ اسٹیو انگریس گیٹ وے کو محفوظ بنانے کے لیے، براہ کرم پڑھیں دستاویزات فلیگر G.K.E

فلیگر کی تنصیب

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 حل کے ساتھ مطابقت رکھتا ہے، اور کینری تجزیہ کو آسانی سے بڑھایا جا سکتا ہے۔ ویب ہکس سسٹم انٹیگریشن/قبولیت کے ٹیسٹ، لوڈ ٹیسٹ، یا کوئی اور حسب ضرورت چیک کرنے کے لیے۔ چونکہ Flagger اعلانیہ ہے اور Kubernetes واقعات کا جواب دیتا ہے، اس کے ساتھ ساتھ اسے GitOps پائپ لائنوں میں بھی استعمال کیا جا سکتا ہے۔ ویو فلوکس یا جینکنز ایکس. اگر آپ JenkinsX استعمال کر رہے ہیں تو آپ jx addons کے ساتھ Flagger انسٹال کر سکتے ہیں۔

فلیگر نے تعاون کیا۔ weaveworks اور میں کینری تعیناتیاں فراہم کرتا ہے۔ ویو کلاؤڈ. پروجیکٹ کا تجربہ جی کے ای، ای کے ایس، اور کیوبیڈم کے ساتھ ننگی دھات پر کیا جا رہا ہے۔

اگر آپ کے پاس فلیگر کو بہتر بنانے کے لیے تجاویز ہیں، تو براہ کرم گٹ ہب پر ایشو یا PR جمع کرائیں۔ stefanprodan/flagger. شراکتیں خوش آئند ہیں!

شکریہ رے سانگ.

ماخذ: www.habr.com

نیا تبصرہ شامل کریں