Flagger və Istio ilə avtomatik kanareyka yerləşdirmələri

Flagger və Istio ilə avtomatik kanareyka yerləşdirmələri

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.

Bayraqçı çaşqın münasibətləri aradan qaldırmağı hədəfləyən açıq mənbəli Kubernetes operatorudur. O, idarə olunan buraxılış zamanı tətbiq davranışını təhlil etmək üçün Istio trafik ofsetindən və Prometheus metriklərindən istifadə edərək kanareyka yerləşdirmələrinin təşviqini avtomatlaşdırır.

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) burada - pulsuz kredit almaq üçün).

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 ilə layihənizi qurun 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 sükan:

brew install kubernetes-helm

Homebrew 2.0 indi də mövcuddur Linux.

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 docs.helm.sh

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-gatewayIstio ş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 sənədlər Bayraqçı G.K.E.

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-systemSlack 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.

Flagger və Istio ilə avtomatik kanareyka yerləşdirmələri

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 burada.

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 demo proqramlar.

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.

Flagger və Istio ilə avtomatik kanareyka yerləşdirmələri

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:

Flagger və Istio ilə avtomatik kanareyka yerləşdirmələri

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:

Flagger və Istio ilə avtomatik kanareyka yerləşdirmələri

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:

Flagger və Istio ilə avtomatik kanareyka yerləşdirmələri

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 mütərəqqi təchizat.

Flagger istənilən Kubernetes CI/CD həlli ilə uyğun gəlir və kanareyka analizi asanlıqla genişləndirilə bilər. webhooks sistem inteqrasiyası/qəbul testlərini, yükləmə testlərini və ya hər hansı digər xüsusi yoxlamaları yerinə yetirmək üçün. Flagger deklarativ olduğundan və Kubernetes hadisələrinə cavab verdiyindən, o, GitOps boru kəmərlərində istifadə edilə bilər. Toxuculuq axını və ya JenkinsX. JenkinsX istifadə edirsinizsə, Flagger-i jx əlavələri ilə quraşdıra bilərsiniz.

Flagger dəstəklənir Toxuculuq işləri və kanareykaların yerləşdirilməsini təmin edir Toxunma Buludu. Layihə GKE, EKS və kubeadm ilə çılpaq metal üzərində sınaqdan keçirilir.

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 stefanprodan/bayraqçı. Töhfələr çox xoşdur!

Təşəkkür Ray Tsang.

Mənbə: www.habr.com

Добавить комментарий