Flagger және Istio көмегімен автоматты түрде канареяларды орналастыру

Flagger және Istio көмегімен автоматты түрде канареяларды орналастыру

CD кәсіпорынның бағдарламалық жасақтама тәжірибесі ретінде танылған және CI қағидаларының табиғи эволюциясының нәтижесі болып табылады. Дегенмен, ықшам дискі әлі де сирек кездеседі, мүмкін басқарудың күрделілігіне және жүйенің қол жетімділігіне әсер ететін сәтсіз орналастыру қорқынышына байланысты.

Жалауша түсініксіз қарым-қатынастарды жоюға бағытталған ашық бастапқы Kubernetes операторы. Ол басқарылатын шығару кезінде қолданба әрекетін талдау үшін Istio трафик офсетін және Prometheus метрикасын пайдаланып, канариялық орналастыруларды жылжытуды автоматтандырады.

Төменде Google Kubernetes Engine (GKE) жүйесінде Flagger орнату және пайдалану бойынша қадамдық нұсқаулық берілген.

Kubernetes кластерін орнату

Istio қондырмасы бар GKE кластерін жасаудан бастайсыз (егер сізде 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

Жоғарыдағы пәрмен екі VM қосатын әдепкі түйін пулын жасайды n1-standard-2 (vCPU: 2, жедел жады 7,5 ГБ, диск: 30 ГБ). Ең дұрысы, Istio құрамдастарын жұмыс жүктемелерінен оқшаулау керек, бірақ Istio Pods түйіндерінің арнайы пулында іске қосудың оңай жолы жоқ. Istio манифесттері тек оқуға арналған деп саналады және 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

Homebrew 2.0 енді қол жетімді Linux.

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

Helm және Tiller арасында SSL пайдалануды қарастырған жөн. Helm орнатуын қорғау туралы қосымша ақпаратты қараңыз docs.helm.sh

Параметрлерді растау:

kubectl -n istio-system get svc

Бірнеше секундтан кейін GCP қызмет үшін сыртқы IP мекенжайын тағайындауы керек istio-ingressgateway.

Istio Ingress шлюзін конфигурациялау

Аты бар статикалық IP мекенжайын жасаңыз istio-gatewayIstio шлюзінің 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 тіркеушісіне кіру қажет. Екі А жазбасын қосыңыз (алмастыру example.com доменіңізге):

istio.example.com   A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}

DNS қойылмалы таңбасының жұмыс істеп тұрғанын тексеріңіз:

watch host test.istio.example.com

HTTP арқылы қызмет торынан тыс қызметтерді ұсыну үшін жалпы Istio шлюзін жасаңыз:

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 кіру шлюзін cert-manageger, CloudDNS және Let's Encrypt көмегімен қорғау үшін оқыңыз. құжаттама Жалаушы Г.К.Е.

Жалаушаны орнату

GKE Istio қондырмасы Istio телеметрия қызметін тазартатын Prometheus данасын қамтымайды. Flagger канариялық талдауды орындау үшін Istio HTTP метрикасын пайдаланатындықтан, ресми Istio Helm схемасымен бірге келетінге ұқсас келесі Prometheus конфигурациясын қолдану қажет.

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-systemSlack хабарландыруларын қосу арқылы:

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 бағдарламасын 9090 портында Istio Prometheus қызметімен байланыса алатын кез келген аттар кеңістігінде орнатуға болады.

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

Орналастыруды және автоматты кеңейту құралын жасаңыз:

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). Canary 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 көмегімен автоматты түрде канареяларды орналастыру

Canary орналастыру келесі нысандардың бірі өзгерген кезде іске қосылады:

  • PodSpec қолданбасын (контейнер кескіні, пәрмен, порттар, env және т.б.)
  • ConfigMaps томдар ретінде орнатылады немесе орта айнымалыларымен салыстырылады
  • Құпиялар томдар ретінде орнатылады немесе орта айнымалыларына түрлендіріледі

Контейнер кескінін жаңарту кезінде canary deploy іске қосыңыз:

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 көмегімен автоматты түрде канареяларды орналастыру

Автоматты кері қайтару

Канариялық талдау кезінде Flagger қолдануды тоқтататынын көру үшін синтетикалық 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

Сәтсіз тексерулердің саны шекті мәнге жеткенде, трафик бастапқы арнаға қайта бағытталады, канар нөлге дейін масштабталады және орналастыру сәтсіз деп белгіленеді.

Канариялық қателер мен кідірістің жоғарылауы 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 көмегімен автоматты түрде канареяларды орналастыру

Қорытындылай келе

Kubernetes-ке қосымша Istio сияқты қызмет торын іске қосу автоматты көрсеткіштерді, журналдарды және протоколдарды қамтамасыз етеді, бірақ жұмыс жүктемесін орналастыру әлі де сыртқы құралдарға байланысты. Flagger мұны Istio мүмкіндіктерін қосу арқылы өзгертуді мақсат етеді прогрессивті қамтамасыз ету.

Flagger кез келген Kubernetes CI/CD шешімімен үйлесімді және канарей талдауын оңай кеңейтуге болады. вебхуктар жүйені біріктіру/қабылдау сынақтарын, жүктеме сынақтарын немесе кез келген басқа реттелетін тексерулерді орындау үшін. Flagger декларативті және Kubernetes оқиғаларына жауап беретіндіктен, оны GitOps конвейерлерімен бірге пайдалануға болады. Weave Flux немесе ДженкинсX. JenkinsX пайдалансаңыз, Flagger бағдарламасын jx қосымшаларымен орнатуға болады.

Жалаушаға қолдау көрсетіледі Тоқу жұмыстары және канарейлерді орналастыруды қамтамасыз етеді Weave Cloud. Жоба GKE, EKS және kubeadm бар жалаңаш металдарда сынақтан өтуде.

Flagger-ді жақсарту бойынша ұсыныстарыңыз болса, GitHub сайтында мәселені немесе PR-ды жіберіңіз стефанпродан/жалаушы. Үлестер құпталмайды!

сізге рахмет Рэй Цанг.

Ақпарат көзі: www.habr.com

пікір қалдыру