Автоматично внедряване на canary с Flagger и Istio

Автоматично внедряване на canary с Flagger и Istio

CD е признат като корпоративна софтуерна практика и е естествена еволюция на установените принципи на CI. Въпреки това CD все още е доста рядък, може би поради сложността на управлението и страха от неуспешни внедрявания, които засягат наличността на системата.

Флаггер е оператор на Kubernetes с отворен код, който има за цел да елиминира объркващи връзки. Той автоматизира популяризирането на внедрявания на canary, като използва отмествания на трафика на 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

Горната команда ще създаде набор от възли по подразбиране, състоящ се от две виртуални машини n1-standard-2 (vCPU: 2, RAM 7,5 GB, диск: 30 GB). В идеалния случай компонентите на 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

Трябва да обмислите използването на SSL между Helm и Tiller. За повече информация относно защитата на инсталацията на Helm вижте 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 регистратор. Добавете два записа 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 с cert-manager, CloudDNS и Let's Encrypt, моля, прочетете документация Flagger G.K.E.

Инсталиране на Flagger

Добавката GKE Istio не включва екземпляра на Prometheus, който почиства телеметричната услуга Istio. Тъй като Flagger използва HTTP показатели на Istio за извършване на анализ на canary, трябва да внедрите следната конфигурация на 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). Тези обекти излагат приложението на мрежата на услугата и управляват анализ и промоция на canary.

Автоматично внедряване на canary с 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

Разположете услуга за тестване на натоварване, за да генерирате трафик по време на анализ на canary:

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 показателите на всеки половин минута. Можете да определите минималното време, необходимо за тестване и насърчаване на внедряване на Canary, като използвате следната формула: 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.

Автоматично внедряване на canary с Flagger и Istio

Внедряването на Canary се задейства, когато един от следните обекти се промени:

  • Разположете PodSpec (изображение на контейнер, команда, портове, env и т.н.)
  • ConfigMaps се монтират като томове или се преобразуват в променливи на средата
  • Тайните се монтират като томове или се преобразуват в променливи на средата

Стартирайте внедряването на Canary, когато актуализирате изображението на контейнера:

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

По време на анализа резултатите от Canary могат да се наблюдават с помощта на Grafana:

Автоматично внедряване на canary с Flagger и Istio

Моля, обърнете внимание: ако бъдат приложени нови промени към внедряването по време на анализ на canary, 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 известията, ще получите следните съобщения:

Автоматично внедряване на canary с Flagger и Istio

Автоматично връщане назад

По време на canary анализ можете да генерирате синтетични 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

Когато броят на неуспешните проверки достигне праг, трафикът се насочва обратно към основния канал, канарчето се мащабира до нула и внедряването се маркира като неуспешно.

Грешките на Canary и скоковете в латентността се регистрират като събития на 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 известията, ще получите съобщение, когато крайният срок за завършване или достигане на максималния брой неуспешни прегледи в анализ бъде надвишен:

Автоматично внедряване на canary с Flagger и Istio

В заключение

Изпълнението на мрежа за услуги като Istio върху Kubernetes ще осигури автоматични показатели, регистрационни файлове и регистрационни файлове, но внедряването на работни натоварвания все още зависи от външни инструменти. Flagger има за цел да промени това, като добави възможности на Istio прогресивно раждане.

Flagger е съвместим с всяко CI/CD решение за Kubernetes и canary анализът може лесно да бъде разширен с уеб кукички за извършване на тестове за системна интеграция/приемане, тестове за натоварване или всякакви други персонализирани тестове. Тъй като Flagger е декларативен и отговаря на събития на Kubernetes, той може да се използва в конвейери на GitOps заедно с Weave Flux или JenkinsX. Ако използвате JenkinsX, можете да инсталирате Flagger с jx добавки.

Поддържа се Flagger Тъкачество и осигурява разполагане на canary в Weave Cloud. Проектът е тестван на GKE, EKS и гол метал с kubeadm.

Ако имате предложения за подобряване на Flagger, моля, изпратете проблем или PR в GitHub на stefanprodan/флагер. Приносите са повече от добре дошли!

Благодаря Рей Цанг.

Източник: www.habr.com

Добавяне на нов коментар