د فلیګر او اسټیو سره اتومات کانري ګمارل

د فلیګر او اسټیو سره اتومات کانري ګمارل

CD د تصدۍ سافټویر تمرین په توګه پیژندل شوی او د تاسیس شوي CI اصولو طبیعي تکامل پایله ده. په هرصورت، CD لاهم خورا نادره ده، شاید د مدیریت پیچلتیا او د ناکامې ګمارنې ویره له امله چې د سیسټم شتون اغیزه کوي.

فلیګګر د خلاصې سرچینې Kubernetes آپریټر دی چې هدف یې د مغشوش اړیکو له مینځه وړل دي. دا د Istio ترافیک آفسیټ او پرومیتیس میټریکونو په کارولو سره د کانري ګمارنې وده اتومات کوي ترڅو د مدیریت رول آوټ پرمهال د غوښتنلیک چلند تحلیل کړي.

لاندې د ګوګل Kubernetes Engine (GKE) کې د فلیګر تنظیم کولو او کارولو لپاره ګام په ګام لارښود دی.

د Kubernetes کلستر تنظیم کول

تاسو د Istio اضافو سره د 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 اضافو سره کلستر جوړ کړئ:

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 کارولو په اړه فکر وکړئ. ستاسو د هیلم نصبولو د ساتنې په اړه د نورو معلوماتو لپاره، وګورئ docs.helm.sh

ترتیبات تایید کړئ:

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 پرته په انټرنیټ کې خدمات وړاندې کړي. د سند مدیر ، کلاوډ ډی این ایس او لیټز کوډ کولو سره د اسټیو داخلې دروازې خوندي کولو لپاره ، مهرباني وکړئ ولولئ اسناد پرچمګر G.K.E.

د فلیګر نصب کول

د 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 حل سره مطابقت لري، او د کانري تحلیل په اسانۍ سره پراخ کیدی شي. ویب هکس د سیسټم ادغام / منلو ازموینې ، بار ازموینې ، یا کوم بل دودیز چکونو ترسره کولو لپاره. څرنګه چې فلیګر اعلاناتي دی او د کوبرنیټس پیښو ته ځواب ورکوي، دا د GitOps پایپ لاینونو کې کارول کیدی شي. اوبدلو فلکس او یا جینکنز ایکس. که تاسو جینکنز ایکس کاروئ تاسو کولی شئ فلیګر د jx اډونونو سره نصب کړئ.

پرچمګر ملاتړ شوی د اوبدلو کارونه او په کې کانري ځای پرځای کول چمتو کوي اوبدلو بادل. دا پروژه په GKE، EKS، او د کیوبیډم سره بېر فلز باندې ازموینه کیږي.

که تاسو د فلیګر ښه کولو لپاره وړاندیزونه لرئ، مهرباني وکړئ په GitHub کې یوه مسله یا PR وسپارئ سټیفان پروډان / پرچمګر. مرستې د ښه راغلاست څخه ډیرې دي!

سپوږمکۍ ري سانګ.

سرچینه: www.habr.com

Add a comment