Avtomatski canary deployi s Flagger in Istio

Avtomatski canary deployi s Flagger in Istio

CD je priznato kao praksa korporativnog softvera, to je rezultat prirodne evolucije uspostavljenih principa CI. Međutim, CD ostaje prilično retka pojava, verovatno zbog složenosti upravljanja i straha od neuspešnih implementacija koje utiču na dostupnost sistema.

Flagger je operator Kubernetes-a sa otvorenim izvorom, čija je svrha da eliminiše zamršenost međuzavisnosti. Automatski unapređuje canary implementacije koristeći Istio promenu saobraćaja i Prometheus metrike za analizu ponašanja aplikacije tokom kontrolisanog puštanja.

Ispod je prikazan korak po korak vodič za postavljanje i korišćenje Flaggera u Google Kubernetes Engine-u (GKE).

Postavljanje Kubernetes klastera

Počnite kreiranjem GKE klastera sa Istio dodacima (ako nemate GCP nalog, možete se registrovati ovde za besplatne kredite).

Prijavite se na Google Cloud, kreirajte projekat i omogućite mu naplatu. Instalirajte alat za komandnu liniju gcloud i postavite svoj projekat pomoću gcloud init.

Postavite projekat kao podrazumevani, region za računanje i zonu (zamenite PROJECT_ID sa vašim projektom):

gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a

Omogućite GKE uslugu i kreirajte klaster sa HPA i Istio dodacima:

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

Gore navedena komanda kreira podrazumevani skup nodova koji uključuje dva VM-a n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Idealno je izolovati Istio komponente od vaših opterećenja, ali ne postoji jednostavan način da se Istio podovi pokrenu u odvojenom skupu nodova. Istio manifesti se smatraju samo za čitanje, a GKE će poništiti sve promene, kao što su vezivanje za nod ili odvajanje od poda.

Postavite kredencijale za kubectl:

gcloud container clusters get-credentials istio

Kreirajte vezu uloge administratora klastera:

kubectl create clusterrolebinding "cluster-admin-$(whoami)" 
--clusterrole=cluster-admin 
--user="$(gcloud config get-value core/account)"

Instalirajte alat za komandnu liniju Helm:

brew install kubernetes-helm

Homebrew 2.0 je sada takođe dostupan za Linux.

Kreirajte nalog usluge i vezu uloge klastera za Tiller:

kubectl -n kube-system create sa tiller && 
kubectl create clusterrolebinding tiller-cluster-rule 
--clusterrole=cluster-admin 
--serviceaccount=kube-system:tiller

Razvijte Tiller v imenspejsu kube-system:

helm init --service-account tiller

Morda bi bilo smiselno uporabiti SSL med Helm in Tiller. Za več informacij o zaščiti namestitve Helma glejte docs.helm.sh

Potrdite nastavitve:

kubectl -n istio-system get svc

V nekaj sekundah bi moral GCP dodeliti zunanji IP-naslov za storitev istio-ingressgateway.

Nastavitev vhodnega prehoda Istio

Ustvarite statični IP-naslov z imenom istio-gateway, z uporabo IP-naslova prehoda 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

Zdaj potrebujete internetno domeno in dostop do svojega registrarja DNS. Dodajte dva A zapis (zamenjajte example.com s svojim domeno):

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

Preverite, ali deluje zamenjava DNS:

watch host test.istio.example.com

Ustvarite skupni prehod Istio za zagotavljanje storitev zunaj storitvenega omrežja prek 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:
        - "*"

Shrani zgoraj navedeni vir kot public-gateway.yaml in ga nato uporabi:

kubectl apply -f ./public-gateway.yaml

Nobena produkcijska sistema ne bi smela zagotavljati storitev na spletu brez SSL. Da zaščitite vhodni prehod Istio s cert-manager, CloudDNS in Let’s Encrypt, prosimo, preberite dokumentacijo Flagger GKE.

Namestitev Flagger

Nadgradnja GKE Istio ne vključuje primerka Prometheus, ki skrbi za čiščenje telemetrične storitve Istio. Ker Flagger uporablja metrike Istio HTTP za izvajanje kanarijeve analize, morate namestiti naslednjo konfiguracijo Prometheus, podobno tisti, ki prihaja z uradnim diagramom Istio Helm.

REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml

Dodajte repozitorij Flagger Helm:

helm repo add flagger [https://flagger.app](https://flagger.app/)

Razvijte Flagger v imenspejsu istio-system, vključno s Slack obvestili:

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 lahko namestite v katerem koli imenspejsu, če lahko deluje z Istio Prometheus storitvijo prek porta 9090.

Flagger ima Grafana nadzorno ploščo za kanarijevo analizo. Namestite Grafano v imenspejsu 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). Эти объекты раскрывают приложение в service mesh и управляют canary анализом и продвижением.

Avtomatski canary deployi s Flagger in 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

Создайте пользовательский canary ресурс (замените example.com s svojim domeno):

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 документируются ovde.

Через пару секунд Flagger создаст canary объекты:

# 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

Odprite brskalnik in pojdite na app.istio.example.com, morali bi videti številko različice demo aplikacije.

Samodejna analiza in napredovanje canary

Flagger izvaja upravljalski cikel, ki postopoma premika promet na canary, hkrati pa meri ključne kazalnike uspešnosti, kot so stopnja uspešnosti HTTP zahtev, povprečen čas trajanja zahtev in razpoložljivost poda. Na podlagi analize KPI se canary napreduje ali prekine, rezultati analize pa se objavijo v Slacku.

Avtomatski canary deployi s Flagger in Istio

Canary uvedba se zažene ob spremembi katerega od naslednjih objektov:

  • Uvedba PodSpec (slika kontejnerja, ukaz, vrata, env itd.)
  • ConfigMaps se montirajo kot volumni ali se pretvorijo v okoljske spremenljivke
  • Skrivnosti se montirajo kot volumni ali se pretvorijo v okoljske spremenljivke

Zagon canary uvedbe ob posodobitvi slike kontejnerja:

kubectl -n test set image deployment/podinfo 
podinfod=quay.io/stefanprodan/podinfo:1.4.1

Flagger ugotovi, da se je različica uvedbe spremenila, in začne njeno analizo:

kubectl -n test describe canary/podinfo

Dogodki:

Nova različica zaznana podinfo.test
Povečanje podinfo.test
Čakanje na zaključek uvedbe podinfo.test: 0 od 1 posodobljenih replik je na voljo
Napredovanje teže canary podinfo.test 5
Napredovanje teže canary podinfo.test 10
Napredovanje teže canary podinfo.test 15
Napredovanje teže canary podinfo.test 20
Napredovanje teže canary podinfo.test 25
Napredovanje teže canary podinfo.test 30
Napredovanje teže canary podinfo.test 35
Napredovanje teže canary podinfo.test 40
Napredovanje teže canary podinfo.test 45
Napredovanje teže canary podinfo.test 50
Kopiranje predloge podinfo.test v podinfo-primary.test
Čakanje na zaključek uvedbe podinfo-primary.test: 1 od 2 posodobljenih replik je na voljo
Promocija zaključena! Zmanjšanje podinfo.test

Med analizo je mogoče rezultate canary spremljati s pomočjo Grafane:

Avtomatski canary deployi s Flagger in Istio

Upoštevajte: če se med canary analizo uporabijo nove spremembe za uvedbo, bo Flagger ponastavil fazo analize.

Sestavite seznam vseh canary v vašem grozdu:

watch kubectl get canaries --all-namespaces
NAMESPACE   IME      STATUS        TEŽA   ČAS ZADNJE PREHODNE SPREMEMBE
test        podinfo   Napreduje   15       2019-01-16T14:05:07Z
prod        frontend  Uspešno     0        2019-01-15T16:15:07Z
prod        backend   Ni uspelo     0        2019-01-14T17:05:07Z

Če ste omogočili obvestila v Slacku, boste prejeli naslednja sporočila:

Avtomatski canary deployi s Flagger in Istio

Samodejni povratni zahtevek

Med canary analizo lahko generirate sintetične napake HTTP 500 in visoko zakasnitev odgovora, da ugotovite, ali bo Flagger ustavil uvedbo.

Ustvarite testni pod in v njem izvedite naslednje dejanje:

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

Generiranje napak HTTP 500:

watch curl http://podinfo-canary:9898/status/500

Generiranje zakasnitve:

watch curl http://podinfo-canary:9898/delay/1

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

Ошибки 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%  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, то получите сообщение, когда будет превышен крайний срок выполнения или достигнуто максимальное количество неудачных проверок в процессе анализа:

Avtomatski canary deployi s Flagger in Istio

Na záver

Запуск service mesh, например, Istio, вдобавок к Kubernetes, предоставит автоматические метрики, логи и протоколы, но деплой рабочих нагрузок все еще зависит от внешних инструментов. Flagger стремится изменить это, добавляя возможности прогрессивной поставки.

Flagger совместим с любыми CI/CD-решениями для Kubernetes, и канареечный анализ можно легко расширить с помощью вебхуков для выполнения системных тестов интеграции/приемки, нагрузочных тестов или любых других пользовательских проверок. Поскольку Flagger является декларативным и реагирует на события Kubernetes, его можно использовать в пайплайнах GitOps вместе с Weave Flux ili JenkinsX. Если вы используете JenkinsX, можете установить Flagger с надстройками jx.

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

Если у вас есть предложения по улучшению Flagger, пожалуйста, отправьте вопрос или PR на GitHub по адресу stefanprodan/flagger. Взносы более чем приветствуются!

Hvala Рэю Цану.

Izvor: habr.com

Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki 🔥 Kupite zanesljivo gostovanje za spletne strani z zaščito pred DDoS, VPS VDS strežniki | ProHoster