Аутоматско постављање канаринца уз Флаггер и Истио

Аутоматско постављање канаринца уз Флаггер и Истио

ЦД је препознат као пракса софтвера за предузећа и резултат је природне еволуције успостављених принципа ЦИ. Међутим, ЦД је и даље прилично реткост, можда због сложености управљања и страха од неуспешних имплементација које утичу на доступност система.

Флаггер је Кубернетес оператер отвореног кода који има за циљ да елиминише збуњујуће односе. Аутоматизује промоцију Цанари имплементације користећи Истио помак саобраћаја и Прометхеус метрике за анализу понашања апликације током управљаног увођења.

У наставку је водич корак по корак за подешавање и коришћење Флаггер-а на Гоогле Кубернетес Енгине-у (ГКЕ).

Постављање Кубернетес кластера

Почињете креирањем ГКЕ кластера са Истио додатком (ако немате ГЦП налог, можете се пријавити овде - да добијете бесплатне кредите).

Пријавите се на Гоогле Цлоуд, направите пројекат и омогућите наплату за њега. Инсталирајте услужни програм командне линије гцлоуд и поставите свој пројекат са 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

Омогућите ГКЕ услугу и креирајте кластер са ХПА и Истио додацима:

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 (вЦПУ: 2, РАМ 7,5 ГБ, диск: 30 ГБ). У идеалном случају, требало би да изолујете Истио компоненте од ваших радних оптерећења, али не постоји једноставан начин да покренете Истио Подс у наменском скупу чворова. Истио манифести се сматрају само за читање и ГКЕ ће поништити све промене, као што је повезивање са чвором или одвајање од под.

Подесите акредитиве за 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

Хомебрев 2.0 је сада доступан и за линук.

Направите налог услуге и везу за улогу кластера за Тиллер:

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

Проширите Тиллер у именском простору kube-system:

helm init --service-account tiller

Требало би да размислите о коришћењу ССЛ-а између Хелма и Тиллер-а. За више информација о заштити ваше инсталације Хелм, погледајте доцс.хелм.сх

Потврдите подешавања:

kubectl -n istio-system get svc

Након неколико секунди, ГЦП би требало да додели екстерну ИП адресу за услугу istio-ingressgateway.

Конфигурисање Истио Ингресс Гатеваи-а

Направите статичку ИП адресу са именом istio-gatewayкористећи ИП адресу Истио гатеваи-а:

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

Сада вам је потребан интернет домен и приступ вашем ДНС регистратору. Додајте два А записа (замените example.com на ваш домен):

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

Проверите да ли ДНС џокер ради:

watch host test.istio.example.com

Направите генерички Истио гатеваи да бисте пружили услуге изван мреже услуге преко ХТТП-а:

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:
        - "*"

Сачувајте горњи ресурс као публиц-гатеваи.иамл, а затим га примените:

kubectl apply -f ./public-gateway.yaml

Ниједан производни систем не би требало да пружа услуге на Интернету без ССЛ-а. Да бисте осигурали Истио улазни гатеваи помоћу церт-манагера, ЦлоудДНС-а и Лет'с Енцрипт, прочитајте документација Флаггер Г.К.Е.

Инсталација за означавање

Додатак ГКЕ Истио не укључује Прометхеус инстанцу која чисти Истио телеметријски сервис. Пошто Флаггер користи Истио ХТТП метрику за обављање канаринске анализе, потребно је да примените следећу Прометхеус конфигурацију, сличну оној која долази са званичном Истио Хелм шемом.

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

Додајте складиште Флаггер Хелм:

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

Проширите Флаггер у именски простор istio-systemомогућавањем Слацк обавештења:

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

Можете да инсталирате Флаггер у било који простор имена све док може да комуницира са услугом Истио Прометхеус на порту 9090.

Флаггер има Графана контролну таблу за анализу канаринца. Инсталирајте Графану у именском простору 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

Изложите Графану преко отвореног гејтвеја креирањем виртуелне услуге (замените 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

Сачувајте горњи ресурс као графана-виртуал-сервице.иамл, а затим га примените:

kubectl apply -f ./grafana-virtual-service.yaml

Приликом пресељења у http://grafana.istio.example.com у претраживачу, требало би да будете усмерени на страницу за пријаву на Графана.

Примена веб апликација са Флаггер-ом

Флаггер примењује Кубернетес и опционо аутоматски скалира (ХПА), а затим креира низ објеката (Кубернетес примене, ЦлустерИП услуге и Истио виртуелне услуге). Ови објекти излажу апликацију сервисној мрежи и контролишу анализу и напредак канараца.

Аутоматско постављање канаринца уз Флаггер и Истио

Направите пробни именски простор са омогућеним Истио Сидецар ињекцијом:

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/"

Сачувајте горњи ресурс као подинфо-цанари.иамл, а затим га примените:

kubectl apply -f ./podinfo-canary.yaml

Горенаведена анализа, ако је успешна, радиће пет минута, проверавајући ХТТП метрику сваких пола минута. Можете одредити минимално време потребно за валидацију и промовисање примене канаринца користећи следећу формулу: interval * (maxWeight / stepWeight). Цанари ЦРД поља су документована овде.

Након неколико секунди, Флаггер ће креирати канаринске објекте:

# 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, требало би да видите број верзије демо апликације.

Аутоматска анализа и промоција канараца

Флаггер примењује контролну петљу која постепено премешта саобраћај ка канаринцу док мери кључне метрике учинка као што су стопа успеха ХТТП захтева, просечно трајање захтева и здравље модула. На основу КПИ анализе, канаринац се унапређује или прекида, а резултати анализе се објављују у Слацк-у.

Аутоматско постављање канаринца уз Флаггер и Истио

Цанари имплементација се покреће када се промени један од следећих објеката:

  • Примените ПодСпец (слика контејнера, команда, портови, енв, итд.)
  • ЦонфигМапс се монтирају као волумени или мапирају на променљиве окружења
  • Тајне се монтирају као волумени или се конвертују у променљиве окружења

Покрените Цанари деплои када ажурирате слику контејнера:

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

Објављивач открива да се верзија примене променила и почиње да је анализира:

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

Током анализе, резултати канаринца могу се пратити помоћу Графане:

Аутоматско постављање канаринца уз Флаггер и Истио

Имајте на уму да ако се нове промене примене на примену током анализе канараца, онда ће Флаггер поново покренути фазу анализе.

Направите листу свих канаринца у вашем кластеру:

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

Ако сте омогућили Слацк обавештења, добићете следеће поруке:

Аутоматско постављање канаринца уз Флаггер и Истио

Аутоматско враћање уназад

Током анализе канараца, можете да генеришете синтетичке ХТТП 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

Генерисање ХТТП 500 грешака:

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

Генерисање кашњења:

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

Када број неуспелих провера достигне праг, саобраћај се преусмерава назад на примарни канал, канаринац се скалира на нулу, а примена је означена као неуспела.

Канарске грешке и скокови кашњења се евидентирају као Кубернетес догађаји и евидентирају их Флаггер у ЈСОН формату:

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

Ако сте омогућили Слацк обавештења, добићете поруку када се прекорачи рок или се достигне максимални број неуспешних провера у анализи:

Аутоматско постављање канаринца уз Флаггер и Истио

У закључку

Покретање сервисне мреже као што је Истио поред Кубернетеса ће обезбедити аутоматске метрике, евиденције и протоколе, али примена радног оптерећења и даље зависи од спољних алата. Флаггер има за циљ да ово промени додавањем Истио могућности прогресивно снабдевање.

Флаггер је компатибилан са било којим Кубернетес ЦИ/ЦД решењем, а канарска анализа се може лако проширити помоћу вебхоокс за обављање тестова интеграције/прихватања система, тестова оптерећења или било које друге прилагођене провере. Пошто је Флаггер декларативно и одговара на Кубернетес догађаје, може се користити у ГитОпс цевоводима заједно са Веаве Флук или ЈенкинсКс. Ако користите ЈенкинсКс, можете инсталирати Флаггер са јк додацима.

Подржано за означавање Веавеворкс и обезбеђује распоређивање канаринца у Веаве Цлоуд. Пројекат се тестира на ГКЕ, ЕКС и голом металу са кубеадм-ом.

Ако имате предлоге за побољшање Флаггер-а, пошаљите проблем или ПР на ГитХуб-у на стефанпродан/флаггер. Доприноси су више него добродошли!

захвалити Раи Тсанг.

Извор: ввв.хабр.цом

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