CD müəssisə proqram təminatı təcrübəsi kimi tanınır və müəyyən edilmiş CI prinsiplərinin təbii təkamülünün nəticəsidir. Bununla belə, CD hələ də olduqca nadirdir, bəlkə də idarəetmənin mürəkkəbliyi və sistemin mövcudluğuna təsir edən uğursuz yerləşdirmə qorxusu səbəbindən.
Aşağıda Google Kubernetes Mühərrikində (GKE) Flagger qurmaq və istifadə etmək üçün addım-addım təlimat verilmişdir.
Kubernetes klasterinin qurulması
Siz Istio əlavəsi ilə GKE klaster yaratmaqla başlayırsınız (GCP hesabınız yoxdursa, qeydiyyatdan keçə bilərsiniz)
Google Cloud-a daxil olun, layihə yaradın və onun üçün hesablaşmanı aktivləşdirin. Komanda xətti yardım proqramını quraşdırın gcloud init
.
Defolt layihə, hesablama sahəsi və zona təyin edin (dəyişdirin PROJECT_ID
layihəniz üçün):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
GKE xidmətini aktivləşdirin və HPA və Istio əlavələri ilə klaster yaradın:
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
Yuxarıdakı əmr iki VM daxil olmaqla standart node hovuzu yaradacaq n1-standard-2
(vCPU: 2, RAM 7,5 GB, disk: 30 GB). İdeal olaraq, Istio komponentlərini iş yüklərinizdən təcrid etməlisiniz, lakin Istio Podlarını xüsusi qovşaqlar hovuzunda işə salmağın asan yolu yoxdur. Istio manifestləri yalnız oxumaq üçün nəzərdə tutulub və GKE qovşaqla əlaqələndirmə və ya poddan ayrılma kimi hər hansı dəyişikliyi ləğv edəcək.
üçün etimadnamələri qurun kubectl
:
gcloud container clusters get-credentials istio
Klaster administratoru rolu bağlaması yaradın:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Komanda xətti alətini quraşdırın
brew install kubernetes-helm
Homebrew 2.0 indi də mövcuddur
Tiller üçün xidmət hesabı və klaster rolunu bağlayın:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Ad məkanında Tiller-i genişləndirin kube-system
:
helm init --service-account tiller
Helm və Tiller arasında SSL istifadə etməyi düşünməlisiniz. Helm quraşdırmanızı qorumaq haqqında ətraflı məlumat üçün baxın
Parametrləri təsdiqləyin:
kubectl -n istio-system get svc
Bir neçə saniyədən sonra GCP xidmət üçün xarici IP ünvanı təyin etməlidir istio-ingressgateway
.
Istio Ingress Gateway-in konfiqurasiyası
Adı ilə statik IP ünvanı yaradın istio-gateway
Istio şlüzünün IP ünvanından istifadə edərək:
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
İndi sizə internet domeni və DNS registratorunuza daxil olmaq lazımdır. İki A qeydi əlavə edin (əvəz edin example.com
domeninizə):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
DNS joker işarəsinin işlədiyini yoxlayın:
watch host test.istio.example.com
HTTP üzərindən xidmət şəbəkəsindən kənar xidmətlər göstərmək üçün ümumi Istio şlüz yaradın:
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:
- "*"
Yuxarıdakı resursu public-gateway.yaml olaraq yadda saxlayın və sonra tətbiq edin:
kubectl apply -f ./public-gateway.yaml
Heç bir istehsal sistemi SSL olmadan İnternetdə xidmət göstərməməlidir. Istio giriş şlüzünü sertifikat meneceri, CloudDNS və Let's Encrypt ilə təmin etmək üçün oxuyun
Flagger quraşdırılması
GKE Istio əlavəsinə Istio telemetriya xidmətini təmizləyən Prometheus nümunəsi daxil deyil. Flagger kanareyka analizini yerinə yetirmək üçün Istio HTTP ölçütlərindən istifadə etdiyinə görə, rəsmi Istio Helm sxemi ilə gələnə bənzər aşağıdakı Prometheus konfiqurasiyasını tətbiq etməlisiniz.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Flagger Helm deposunu əlavə edin:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Flagger-i ad sahəsinə genişləndirin istio-system
Slack bildirişlərini aktivləşdirməklə:
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-i 9090 portunda Istio Prometheus xidməti ilə əlaqə saxlaya bildiyi müddətcə istənilən ad məkanında quraşdıra bilərsiniz.
Flagger kanareyka analizi üçün Grafana idarə panelinə malikdir. Grafana-nı ad sahəsinə quraşdırın 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
Virtual xidmət yaradaraq Grafana-nı açıq şlüz vasitəsilə ifşa edin (əvəz edin example.com
domeninizə):
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
Yuxarıdakı resursu grafana-virtual-service.yaml olaraq yadda saxlayın və sonra tətbiq edin:
kubectl apply -f ./grafana-virtual-service.yaml
Köçərkən http://grafana.istio.example.com
brauzerdə siz Grafana giriş səhifəsinə yönləndirilməlisiniz.
Flagger ilə veb proqramların yerləşdirilməsi
Flagger Kubernetes-i yerləşdirir və istəyə görə avtomatik olaraq genişləndirir (HPA), sonra bir sıra obyektlər yaradır (Kubernetes yerləşdirmələri, ClusterIP xidmətləri və Istio virtual xidmətləri). Bu obyektlər tətbiqi xidmət şəbəkəsinə məruz qoyur və kanarya təhlili və tərəqqisinə nəzarət edir.
Istio Sidecar injection aktivləşdirilərək test ad sahəsi yaradın:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Yerləşdirmə və pod avtomatik genişləndirmə aləti yaradın:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Kanarya analizi zamanı trafik yaratmaq üçün sınaq yükləmə xidmətini yerləşdirin:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Fərdi kanareyka resursu yaradın (dəyişdirin example.com
domeninizə):
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/"
Yuxarıdakı resursu podinfo-canary.yaml olaraq qeyd edin və sonra tətbiq edin:
kubectl apply -f ./podinfo-canary.yaml
Yuxarıdakı təhlil uğurlu olarsa, hər yarım dəqiqədən bir HTTP ölçülərini yoxlayaraq beş dəqiqə davam edəcək. Aşağıdakı düsturdan istifadə edərək, kanareyka yerləşdirməsini təsdiqləmək və təşviq etmək üçün tələb olunan minimum vaxtı təyin edə bilərsiniz: interval * (maxWeight / stepWeight)
. Canary CRD sahələri sənədləşdirilmişdir
Bir neçə saniyədən sonra Flagger kanareyka obyektləri yaradacaq:
# 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
Bir brauzer açın və gedin app.istio.example.com
, versiya nömrəsini görməlisiniz
Avtomatik kanareyka analizi və təşviqi
Flagger HTTP sorğusunun müvəffəqiyyət dərəcəsi, orta sorğu müddəti və podun sağlamlığı kimi əsas performans göstəricilərini ölçərkən trafiki tədricən kanarəyə köçürən idarəetmə dövrəsini həyata keçirir. KPI təhlilinə əsasən, kanareyka təşviq edilir və ya dayandırılır və təhlilin nəticələri Slack-də dərc olunur.
Canary deployment aşağıdakı obyektlərdən biri dəyişdikdə işə salınır:
- PodSpec-i yerləşdirin (konteyner şəkli, əmr, portlar, env və s.)
- ConfigMaps həcmlər kimi quraşdırılır və ya ətraf mühit dəyişənlərinə uyğunlaşdırılır
- Sirlər həcmlər kimi quraşdırılır və ya mühit dəyişənlərinə çevrilir
Konteyner şəklini yeniləyərkən canary deploy proqramını işə salın:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger yerləşdirmə versiyasının dəyişdiyini aşkar edir və onu təhlil etməyə başlayır:
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
Təhlil zamanı kanareyka nəticələri Grafana istifadə edərək izlənilə bilər:
Nəzərə alın ki, kanareyka analizi zamanı yerləşdirməyə yeni dəyişikliklər tətbiq olunarsa, Flagger təhlil mərhələsini yenidən başlayacaq.
Qrupunuzdakı bütün kanareykaların siyahısını tərtib edin:
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 bildirişlərini aktiv etmisinizsə, aşağıdakı mesajları alacaqsınız:
Avtomatik geri qaytarma
Kanareyka analizi zamanı siz Flagger-in yerləşdirməni dayandırıb saxlamayacağına baxmaq üçün sintetik HTTP 500 səhvləri və yüksək cavab gecikmələri yarada bilərsiniz.
Test podunu yaradın və orada aşağıdakıları edin:
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 xətalarının yaradılması:
watch curl http://podinfo-canary:9898/status/500
Gecikmə yaratma:
watch curl http://podinfo-canary:9898/delay/1
Uğursuz yoxlamaların sayı eşik həddinə çatdıqda, trafik yenidən əsas kanala yönləndirilir, kanarya sıfıra ölçülür və yerləşdirmə uğursuz kimi qeyd olunur.
Kanar xətaları və gecikmə sıçrayışları Kubernetes hadisələri kimi qeyd olunur və Flagger tərəfindən JSON formatında daxil edilir:
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 bildirişlərini aktiv etmisinizsə, son tarix keçdikdə və ya təhlildə uğursuz yoxlamaların maksimum sayına çatdıqda bir mesaj alacaqsınız:
Nəticədə
Kubernetes-ə əlavə olaraq Istio kimi bir xidmət şəbəkəsini işə salmaq avtomatik ölçülər, qeydlər və protokollar təmin edəcək, lakin iş yükünün yerləşdirilməsi hələ də xarici alətlərdən asılıdır. Flagger Istio imkanlarını əlavə edərək bunu dəyişməyi hədəfləyir
Flagger istənilən Kubernetes CI/CD həlli ilə uyğun gəlir və kanareyka analizi asanlıqla genişləndirilə bilər.
Flagger dəstəklənir
Flagger-i təkmilləşdirmək üçün təklifləriniz varsa, lütfən, GitHub-da məsələni və ya PR-ı göndərin
Təşəkkür
Mənbə: www.habr.com