
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.
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 za besplatne kredite).
Prijavite se na Google Cloud, kreirajte projekat i omogućite mu naplatu. Instalirajte alat za komandnu liniju 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-aOmoguć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_PERMISSIVEGore 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 istioKreirajte 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 :
brew install kubernetes-helmHomebrew 2.0 je sada takođe dostupan za .
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:tillerRazvijte Tiller v imenspejsu kube-system:
helm init --service-account tillerMorda bi bilo smiselno uporabiti SSL med Helm in Tiller. Za več informacij o zaščiti namestitve Helma glejte
Potrdite nastavitve:
kubectl -n istio-system get svcV 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-central1Zdaj 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.comUstvarite 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.yamlNobena 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 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.yamlDodajte 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=flaggerFlagger 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 анализом и продвижением.
Создайте тестовый неймспейс с включенным внедрением 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 документируются .
Через пару секунд 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/podinfoOdprite brskalnik in pojdite na app.istio.example.com, morali bi videti številko različice .
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.
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.1Flagger 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.testMed analizo je mogoče rezultate canary spremljati s pomočjo Grafane:
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:
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 shGeneriranje napak HTTP 500:
watch curl http://podinfo-canary:9898/status/500Generiranje 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, то получите сообщение, когда будет превышен крайний срок выполнения или достигнуто максимальное количество неудачных проверок в процессе анализа:
Na záver
Запуск service mesh, например, Istio, вдобавок к Kubernetes, предоставит автоматические метрики, логи и протоколы, но деплой рабочих нагрузок все еще зависит от внешних инструментов. Flagger стремится изменить это, добавляя возможности .
Flagger совместим с любыми CI/CD-решениями для Kubernetes, и канареечный анализ можно легко расширить с помощью для выполнения системных тестов интеграции/приемки, нагрузочных тестов или любых других пользовательских проверок. Поскольку Flagger является декларативным и реагирует на события Kubernetes, его можно использовать в пайплайнах GitOps вместе с ili . Если вы используете JenkinsX, можете установить Flagger с надстройками jx.
Flagger поддерживается и обеспечивает canary деплои в . Проект тестируется на GKE, EKS и «голом железе» с kubeadm.
Если у вас есть предложения по улучшению Flagger, пожалуйста, отправьте вопрос или PR на GitHub по адресу . Взносы более чем приветствуются!
Hvala .
Izvor: habr.com
