ЦД-то е препознаено како практика на софтвер за претпријатија и е природна еволуција на воспоставените CI принципи. Сепак, ЦД-то е сè уште прилично ретко, можеби поради сложеноста на управувањето и стравот од неуспешни распоредувања кои влијаат на достапноста на системот.
Подолу е чекор-по-чекор водич за поставување и користење на Flagger на Google Kubernetes Engine (GKE).
Поставување кластер Kubernetes
Започнувате со создавање кластер GKE со додатокот Istio (ако немате GCP сметка, можете да се регистрирате
Најавете се на Google Cloud, креирајте проект и овозможете наплата за него. Инсталирајте ја алатката за командна линија 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 сега е достапен и за
Создадете сметка за услуга и обврзувачки улоги во кластерот за 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. За повеќе информации во врска со заштитата на вашата инсталација на кормилото, видете
Потврдете ги поставките:
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). Овие објекти ја изложуваат апликацијата на сервисната мрежа и управуваат со анализа и промоција на канаринци.
Создадете тест именски простор со овозможена имплементација на 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.
Распоредувањето на 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 ќе ја рестартира фазата на анализа.
Направете список на сите канаринци во вашиот кластер:
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 известувањата, ќе ги добиете следните пораки:
Автоматско враќање назад
За време на анализата на канари, можете да генерирате синтетички грешки 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, ќе добиете порака кога ќе се надмине рокот за пополнување или достигнување на максималниот број на неуспешни прегледи во анализата:
Во заклучок
Вклучувањето на сервисната мрежа како Istio на врвот на Kubernetes ќе обезбеди автоматски метрики, дневници и дневници, но распоредувањето на оптоварувањата сè уште зависи од надворешните алатки. Flagger има за цел да го промени ова со додавање на способности на Istio
Flagger е компатибилен со кое било CI/CD решение за Kubernetes, а анализата на канари може лесно да се прошири со
Поддржан Flagger
Ако имате предлози за подобрување на Flagger, ве молиме поднесете проблем или ПР на GitHub на
Благодарение
Извор: www.habr.com