استقرار خودکار قناری با Flagger و Istio

استقرار خودکار قناری با Flagger و Istio

CD به عنوان یک عمل نرم افزار سازمانی شناخته می شود و یک تکامل طبیعی از اصول تثبیت شده CI است. با این حال، CD هنوز بسیار نادر است، شاید به دلیل پیچیدگی مدیریت و ترس از استقرار ناموفق که بر در دسترس بودن سیستم تأثیر بگذارد.

پرچم دار یک اپراتور Kubernetes منبع باز است که هدف آن حذف روابط گیج کننده است. این ارتقاء استقرار قناری ها را با استفاده از تعدیل ترافیک Istio و معیارهای Prometheus برای تجزیه و تحلیل رفتار برنامه در طول عرضه مدیریت شده به طور خودکار انجام می دهد.

در زیر یک راهنمای گام به گام برای راه اندازی و استفاده از Flagger در Google Kubernetes Engine (GKE) آورده شده است.

راه اندازی یک خوشه Kubernetes

شما با ایجاد یک کلاستر GKE با افزونه Istio شروع می کنید (اگر حساب GCP ندارید، می توانید ثبت نام کنید اینجا - برای دریافت اعتبار رایگان).

به Google Cloud وارد شوید، یک پروژه ایجاد کنید و صورتحساب آن را فعال کنید. ابزار خط فرمان را نصب کنید 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

دستور بالا یک Node Pool پیش فرض متشکل از دو ماشین مجازی ایجاد می کند n1-standard-2 (vCPU: 2، RAM 7,5 گیگابایت، دیسک: 30 گیگابایت). در حالت ایده‌آل، کامپوننت‌های Istio باید از بار کاری خود جدا شوند، اما هیچ راه آسانی برای اجرای پادهای Istio در یک Node Pool اختصاصی وجود ندارد. مانیفست‌های Istio فقط خواندنی در نظر گرفته می‌شوند و GKE هرگونه تغییری مانند اتصال به یک گره یا جدا شدن از یک pod را برمی‌گرداند.

تنظیم اعتبار برای 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 هم اکنون در دسترس است لینـوکــس.

یک حساب سرویس و پیوند نقش خوشه ای برای Tiller ایجاد کنید:

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

Tiller را در فضای نام گسترش دهید kube-system:

helm init --service-account tiller

شما باید از SSL بین Helm و Tiller استفاده کنید. برای اطلاعات بیشتر در مورد محافظت از نصب هلم، رجوع کنید docs.helm.sh

تایید تنظیمات:

kubectl -n istio-system get svc

پس از چند ثانیه، GCP باید یک آدرس IP خارجی به سرویس اختصاص دهد istio-ingressgateway.

راه اندازی دروازه ورودی Istio

یک آدرس IP ثابت با نام ایجاد کنید istio-gatewayبا استفاده از آدرس 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

یک دروازه عمومی Istio برای ارائه خدمات خارج از شبکه سرویس از طریق 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 ارائه دهد. برای ایمن کردن دروازه ورودی Istio خود با مدیر گواهی، CloudDNS و Let's Encrypt، لطفاً بخوانید مستندات پرچمدار G.K.E.

نصب پرچمدار

افزونه GKE Istio شامل نمونه Prometheus نیست که سرویس تله متری Istio را پاکسازی می کند. از آنجایی که Flagger از معیارهای Istio HTTP برای انجام تجزیه و تحلیل قناری استفاده می کند، باید پیکربندی Prometheus زیر را، مشابه آنچه که با طرحواره رسمی 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/)

Flagger را به فضای نام گسترش دهید 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 ارتباط برقرار کند.

Flagger دارای داشبورد Grafana برای آنالیز قناری است. Grafana را در فضای نام نصب کنید 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

Grafana را از طریق یک دروازه باز با ایجاد یک سرویس مجازی در معرض دید قرار دهید (جایگزین کنید 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

Flagger Kubernetes و در صورت لزوم، مقیاس خودکار افقی (HPA) را مستقر می کند، سپس یک سری اشیاء (استقرارهای Kubernetes، خدمات ClusterIP و سرویس های مجازی Istio) ایجاد می کند. این اشیاء برنامه را در معرض مش سرویس قرار می دهند و تجزیه و تحلیل و ارتقاء قناری را مدیریت می کنند.

استقرار خودکار قناری با Flagger و Istio

با فعال بودن اجرای Istio Sidecar یک فضای نام آزمایشی ایجاد کنید:

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml

یک استقرار و یک ابزار مقیاس افقی خودکار برای pod ایجاد کنید:

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، باید شماره نسخه را ببینید برنامه های دمو.

آنالیز و تبلیغ خودکار قناری

Flagger یک حلقه کنترل را پیاده سازی می کند که به تدریج ترافیک را به قناری منتقل می کند و در عین حال شاخص های عملکرد کلیدی مانند میزان موفقیت درخواست HTTP، میانگین مدت زمان درخواست و سلامت غلاف را اندازه گیری می کند. بر اساس تجزیه و تحلیل KPI، قناری ارتقا یا خاتمه می یابد و نتایج تجزیه و تحلیل در Slack منتشر می شود.

استقرار خودکار قناری با Flagger و Istio

استقرار قناری زمانی فعال می شود که یکی از اشیاء زیر تغییر کند:

  • استقرار PodSpec (تصویر کانتینر، فرمان، پورت ها، env و غیره)
  • 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

در طول تجزیه و تحلیل، نتایج قناری را می توان با استفاده از Grafana کنترل کرد:

استقرار خودکار قناری با 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

برگشت خودکار

در طول تجزیه و تحلیل قناری، می توانید خطاهای 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 ثبت می شوند و توسط Flagger در قالب 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

در نتیجه

اجرای یک سرویس مش مانند Istio در بالای Kubernetes معیارها، گزارش‌ها و گزارش‌های خودکار را ارائه می‌کند، اما استقرار بارهای کاری همچنان به ابزارهای خارجی بستگی دارد. هدف Flagger این است که با افزودن قابلیت‌های Istio این مورد را تغییر دهد تحویل تدریجی.

Flagger با هر راه حل CI/CD برای Kubernetes سازگار است و تجزیه و تحلیل قناری را می توان به راحتی با وب هوک ها برای انجام تست های یکپارچه سازی/پذیرش سیستم، تست های بارگذاری یا هر آزمایش سفارشی دیگر. از آنجایی که Flagger اعلانی است و به رویدادهای Kubernetes پاسخ می دهد، می توان از آن در خطوط لوله GitOps به همراه شار بافت یا جنکین ایکس. اگر از JenkinsX استفاده می کنید، می توانید Flagger را با افزونه های jx نصب کنید.

Flagger پشتیبانی می شود بافندگی و استقرار قناری در ابر ببافید. این پروژه بر روی GKE، EKS و فلز لخت با kubeadm تست شده است.

اگر پیشنهادی برای بهبود Flagger دارید، لطفاً یک مشکل یا روابط عمومی را در GitHub در این نشانی ارسال کنید stefanprodan / پرچمدار. مشارکت بیش از حد خوش آمدید!

سپاس ها ری تسانگ.

منبع: www.habr.com

اضافه کردن نظر