CD به عنوان یک عمل نرم افزار سازمانی شناخته می شود و یک تکامل طبیعی از اصول تثبیت شده CI است. با این حال، CD هنوز بسیار نادر است، شاید به دلیل پیچیدگی مدیریت و ترس از استقرار ناموفق که بر در دسترس بودن سیستم تأثیر بگذارد.
در زیر یک راهنمای گام به گام برای راه اندازی و استفاده از Flagger در Google Kubernetes Engine (GKE) آورده شده است.
راه اندازی یک خوشه Kubernetes
شما با ایجاد یک کلاستر GKE با افزونه Istio شروع می کنید (اگر حساب 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
دستور بالا یک 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 استفاده کنید. برای اطلاعات بیشتر در مورد محافظت از نصب هلم، رجوع کنید
تایید تنظیمات:
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، لطفاً بخوانید
نصب پرچمدار
افزونه 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) ایجاد می کند. این اشیاء برنامه را در معرض مش سرویس قرار می دهند و تجزیه و تحلیل و ارتقاء قناری را مدیریت می کنند.
با فعال بودن اجرای 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 منتشر می شود.
استقرار قناری زمانی فعال می شود که یکی از اشیاء زیر تغییر کند:
- استقرار 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 مرحله تجزیه و تحلیل را مجدداً راه اندازی می کند.
لیستی از تمام قناری های خوشه خود تهیه کنید:
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 ثبت می شوند و توسط 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 را فعال کرده باشید، زمانی که مهلت تکمیل یا رسیدن به حداکثر تعداد بازبینیهای ناموفق در یک تحلیل فراتر رفت، پیامی دریافت خواهید کرد:
در نتیجه
اجرای یک سرویس مش مانند Istio در بالای Kubernetes معیارها، گزارشها و گزارشهای خودکار را ارائه میکند، اما استقرار بارهای کاری همچنان به ابزارهای خارجی بستگی دارد. هدف Flagger این است که با افزودن قابلیتهای Istio این مورد را تغییر دهد
Flagger با هر راه حل CI/CD برای Kubernetes سازگار است و تجزیه و تحلیل قناری را می توان به راحتی با
Flagger پشتیبانی می شود
اگر پیشنهادی برای بهبود Flagger دارید، لطفاً یک مشکل یا روابط عمومی را در GitHub در این نشانی ارسال کنید
سپاس ها
منبع: www.habr.com