ЦД је препознат као пракса софтвера за предузећа и резултат је природне еволуције успостављених принципа ЦИ. Међутим, ЦД је и даље прилично реткост, можда због сложености управљања и страха од неуспешних имплементација које утичу на доступност система.
У наставку је водич корак по корак за подешавање и коришћење Флаггер-а на Гоогле Кубернетес Енгине-у (ГКЕ).
Постављање Кубернетес кластера
Почињете креирањем ГКЕ кластера са Истио додатком (ако немате ГЦП налог, можете се пријавити
Пријавите се на Гоогле Цлоуд, направите пројекат и омогућите наплату за њега. Инсталирајте услужни програм командне линије 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
Ако сте омогућили Слацк обавештења, добићете поруку када се прекорачи рок или се достигне максимални број неуспешних провера у анализи:
У закључку
Покретање сервисне мреже као што је Истио поред Кубернетеса ће обезбедити аутоматске метрике, евиденције и протоколе, али примена радног оптерећења и даље зависи од спољних алата. Флаггер има за циљ да ово промени додавањем Истио могућности
Флаггер је компатибилан са било којим Кубернетес ЦИ/ЦД решењем, а канарска анализа се може лако проширити помоћу
Подржано за означавање
Ако имате предлоге за побољшање Флаггер-а, пошаљите проблем или ПР на ГитХуб-у на
захвалити
Извор: ввв.хабр.цом