Автоматско распоредување на канари со Flagger и Istio

Автоматско распоредување на канари со Flagger и Istio

ЦД-то е препознаено како практика на софтвер за претпријатија и е природна еволуција на воспоставените CI принципи. Сепак, ЦД-то е сè уште прилично ретко, можеби поради сложеноста на управувањето и стравот од неуспешни распоредувања кои влијаат на достапноста на системот.

Знаменосец е оператор со отворен код 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

Горенаведената команда ќе создаде стандарден базен на јазли кој се состои од два VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, диск: 30 GB). Идеално, компонентите на Istio треба да бидат изолирани од нивните оптоварувања, но не постои лесен начин да се активираат Istio подлоги на посветен базен на јазли. 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

Треба да размислите за користење SSL помеѓу Helm и Tiller. За повеќе информации во врска со заштитата на вашата инсталација на кормилото, видете docs.helm.sh

Потврдете ги поставките:

kubectl -n istio-system get svc

По неколку секунди, GCP треба да додели надворешна IP адреса на услугата istio-ingressgateway.

Поставување на Istio Ingress Gateway

Направете статична IP адреса со името istio-gatewayкористејќи ја IP адресата на портата Istio:

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

Создадете генеричка порта 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). Овие објекти ја изложуваат апликацијата на сервисната мрежа и управуваат со анализа и промоција на канаринци.

Автоматско распоредување на канари со 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). Канарските 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 (слика на контејнер, команда, порти, завиткување, итн.)
  • 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

Кога бројот на неуспешни проверки ќе достигне праг, сообраќајот се пренасочува назад до примарниот канал, канарката се намалува на нула и распоредувањето е означено како неуспешно.

Канарските грешки и скоковите на доцнењето се евидентирани како настани на Кубернетс и снимени од 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 заедно со Ткаат флукс или EnенкинсХ. Ако користите JenkinsX, можете да инсталирате Flagger со jx додатоци.

Поддржан Flagger Ткаени работи и обезбедува распоредувања на канари во Ткаат облак. Проектот е тестиран на GKE, EKS и гол метал со kubeadm.

Ако имате предлози за подобрување на Flagger, ве молиме поднесете проблем или ПР на GitHub на stefanprodan/flagger. Придонесите се повеќе од добредојдени!

Благодарение Реј Цанг.

Извор: www.habr.com

Додадете коментар