Flagger ۽ Istio سان خودڪار ڪينري ڊيپلائيشن

Flagger ۽ Istio سان خودڪار ڪينري ڊيپلائيشن

سي ڊي هڪ انٽرپرائز سافٽ ويئر جي مشق طور سڃاتو وڃي ٿو ۽ قائم ڪيل CI اصولن جو هڪ قدرتي ارتقا آهي. بهرحال، سي ڊي اڃا تائين ڪافي ناياب آهي، شايد انتظاميا جي پيچيدگي ۽ ناڪامي ڊيپلائيمينٽ جي خوف جي ڪري سسٽم جي دستيابي کي متاثر ڪري.

پرچائڻ وارو هڪ اوپن سورس ڪبرنيٽس آپريٽر آهي جنهن جو مقصد مبهم رشتن کي ختم ڪرڻ آهي. اهو Istio ٽريفڪ آفسٽس ۽ Prometheus metrics استعمال ڪندي ڪينري ڊيپلائيمينٽ جي واڌاري کي خودڪار ڪري ٿو هڪ منظم رول آئوٽ دوران ايپليڪيشن جي رويي جو تجزيو ڪرڻ لاءِ.

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 تنصيب جي حفاظت بابت وڌيڪ معلومات لاء، ڏسو docs.helm.sh

سيٽنگون جي تصديق ڪريو:

kubectl -n istio-system get svc

ڪجھ سيڪنڊن کان پوء، GCP کي خدمت لاء هڪ ٻاهرين IP پتي کي تفويض ڪرڻ گهرجي istio-ingressgateway.

Istio Ingress Gateway قائم ڪرڻ

نالي سان هڪ جامد 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:
        - "*"

مٿي ڏنل وسيلن کي پبلڪ-gateway.yaml طور محفوظ ڪريو ۽ پوءِ ان کي لاڳو ڪريو:

kubectl apply -f ./public-gateway.yaml

ڪنهن به پيداواري نظام کي SSL کان سواءِ انٽرنيٽ تي خدمتون مهيا ڪرڻ گهرجن. سرٽيفڪيشن مئنيجر، CloudDNS ۽ Let's Encrypt سان پنهنجي Istio ingress gateway کي محفوظ ڪرڻ لاءِ، مهرباني ڪري پڙهو دستاويز پرچم بردار G.K.E.

پرچم جي انسٽاليشن

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-systemSlack اطلاعن کي فعال ڪندي:

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 ورچوئل سروسز). اهي شيون ايپليڪيشن کي بي نقاب ڪن ٿيون سروس ميش ۽ انتظام ڪنري تجزيي ۽ واڌاري.

Flagger ۽ 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 ۾.

Flagger ۽ Istio سان خودڪار ڪينري ڊيپلائيشن

ڪينري ڊيپلائيشن تڏهن شروع ٿيندي آهي جڏهن هيٺ ڏنل شيون تبديل ٿينديون آهن:

  • پوڊ اسپيڪ کي ترتيب ڏيو (ڪنٽينر تصوير، ڪمانڊ، بندرگاهن، اين وي، وغيره)
  • 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 ۽ Istio سان خودڪار ڪينري ڊيپلائيشن

مھرباني ڪري نوٽ ڪريو: جيڪڏھن نيون تبديليون لاڳو ڪيون وينديون آھن ڪينري تجزيي دوران ڊيپلائيمينٽ تي، 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 اطلاعن کي فعال ڪيو آهي، توهان کي هيٺيان پيغام ملندا:

Flagger ۽ Istio سان خودڪار ڪينري ڊيپلائيشن

خودڪار 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 نوٽيفڪيشنز کي فعال ڪيو آهي، توهان کي هڪ پيغام ملندو جڏهن مڪمل ڪرڻ جي آخري تاريخ يا هڪ تجزيي ۾ ناڪامي جائزي جي وڌ ۾ وڌ تعداد تائين پهچي ويندي:

Flagger ۽ Istio سان خودڪار ڪينري ڊيپلائيشن

نتيجو

Kubernetes جي چوٽي تي Istio وانگر هڪ سروس ميش هلائڻ خودڪار ميٽرڪس، لاگس ۽ لاگز مهيا ڪندو، پر ڪم لوڊ کي ترتيب ڏيڻ اڃا به خارجي اوزار تي منحصر آهي. فليگر جو مقصد هن کي تبديل ڪرڻ آهي Istio صلاحيتن کي شامل ڪندي ترقي پسند پهچائڻ.

فليگر ڪبرنيٽس لاءِ ڪنهن به CI/CD حل سان مطابقت رکي ٿو، ۽ ڪينري تجزيي کي آساني سان وڌايو وڃي ٿو webhooks سسٽم انضمام / قبوليت جا امتحان، لوڊ ٽيسٽ يا ڪنهن ٻئي ڪسٽم ٽيسٽ انجام ڏيڻ لاء. ڇاڪاڻ ته فليگر بيان ڪندڙ آهي ۽ ڪبرنيٽس واقعن جو جواب ڏئي ٿو، اهو استعمال ڪري سگهجي ٿو GitOps پائپ لائنن ۾ گڏوگڏ Weave Flux يا جينڪنڪس. جيڪڏھن توھان استعمال ڪري رھيا آھيو JenkinsX، توھان انسٽال ڪري سگھو ٿا Flagger jx add-ons سان.

پرچم جي حمايت ڪئي وئي بناوت ۽ ۾ ڪينري ڊيپلائيمينٽ مهيا ڪري ٿي بادل جو ڄار. پروجيڪٽ کي GKE، EKS ۽ بيئر ميٽل تي ڪبيڊم سان آزمايو ويو آهي.

جيڪڏهن توهان وٽ Flagger کي بهتر ڪرڻ لاءِ تجويزون آهن، مهرباني ڪري هڪ مسئلو يا پي آر جمع ڪرايو GitHub تي اسٽيفان پروڊان / پرچمگر. تعاون خوش آمديد کان وڌيڪ آهن!

Спасибо ري سانگ.

جو ذريعو: www.habr.com

تبصرو شامل ڪريو