CD е признат като корпоративна софтуерна практика и е естествена еволюция на установените принципи на CI. Въпреки това CD все още е доста рядък, може би поради сложността на управлението и страха от неуспешни внедрявания, които засягат наличността на системата.
По-долу е ръководство стъпка по стъпка за настройка и използване на 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
Горната команда ще създаде набор от възли по подразбиране, състоящ се от две виртуални машини 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 вече е достъпен и за
Създайте обвързване на акаунт за услуга и роля на клъстер за 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 вижте
Потвърдете настройките:
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
Добавката 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.
Създайте тестово пространство от имена с активирана реализация на 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 се задейства, когато един от следните обекти се промени:
- Разположете 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 ще рестартира фазата на анализ.
Направете списък на всички канарчета във вашия клъстер:
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 анализ можете да генерирате синтетични 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 известията, ще получите съобщение, когато крайният срок за завършване или достигане на максималния брой неуспешни прегледи в анализ бъде надвишен:
В заключение
Изпълнението на мрежа за услуги като Istio върху Kubernetes ще осигури автоматични показатели, регистрационни файлове и регистрационни файлове, но внедряването на работни натоварвания все още зависи от външни инструменти. Flagger има за цел да промени това, като добави възможности на Istio
Flagger е съвместим с всяко CI/CD решение за Kubernetes и canary анализът може лесно да бъде разширен с
Поддържа се Flagger
Ако имате предложения за подобряване на Flagger, моля, изпратете проблем или PR в GitHub на
Благодаря
Източник: www.habr.com