
CD je uznáno jako praxe podnikového softwaru; je to výsledek přirozené evoluce ustálených principů CI. Nicméně CD je stále poměrně vzácný jev, pravděpodobně kvůli složitosti řízení a strachu z neúspěšných nasazení, která ovlivňují dostupnost systému.
je open-source operátor Kubernetes, jehož cílem je vyloučit složité vzájemné vztahy. Automatizuje propagaci canary nasazení pomocí odklonu provozu Istio a metrik Prometheus pro analýzu chování aplikace během řízeného nasazení.
Níže je uveden podrobný návod k nastavení a používání Flagger v Google Kubernetes Engine (GKE).
Nastavení cloudu Kubernetes
Začínáte vytvořením klastru GKE s nadstavbou Istio (pokud nemáte účet GCP, můžete se zaregistrovat pro získání bezplatných kreditů).
Přihlaste se do Google Cloud, vytvořte projekt a povolte pro něj billing. Nainstalujte příkazový nástroj a nastavte svůj projekt pomocí gcloud init.
Nastavte výchozí projekt, oblast výpočtu a zónu (nahraďte PROJECT_ID svým projektem):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-aPovolte službu GKE a vytvořte klastr s HPA a nadstavbami 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_PERMISSIVEVýše uvedený příkaz vytvoří výchozí skupinu uzlů obsahující dvě VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideálně byste měli izovat komponenty Istio od svých pracovních zátěží, ale neexistuje jednoduchý způsob, jak spustit podys Istio ve vyhrazené skupině uzlů. Manifesty Istio se považují za jen pro čtení a GKE zruší jakékoli změny, například připojení k uzlu nebo odpojení od podu.
Nastavte pověření pro kubectl:
gcloud container clusters get-credentials istioVytvořte vazbu role cluster admin:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Nainstalujte příkazový nástroj :
brew install kubernetes-helmHomebrew 2.0 je nyní také k dispozici pro .
Vytvořte účet služby a vazbu role klastru pro Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerNasazení Tilleru v prostoru názvů kube-system:
helm init --service-account tillerZvažte použití SSL mezi Helm a Tiller. Další informace o zabezpečení instalace Helm naleznete na
Ověřte nastavení:
kubectl -n istio-system get svcZa několik sekund by měl GCP přidělit externí IP adresu pro službu istio-ingressgateway.
Nastavení vstupní brány Istio
Vytvořte statickou IP adresu s názvem istio-gateway, používající IP adresu brány 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-central1Nyní potřebujete internetovou doménu a přístup k registrátorovi DNS. Přidejte dvě A záznamy (nahraďte example.com svou doménou):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Ujistěte se, že zástupný symbol DNS funguje:
watch host test.istio.example.comVytvoření veřejné brány Istio pro poskytování služeb mimo service mesh přes 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:
- "*"Uložte výše uvedený prostředek jako public-gateway.yaml a poté ho aplikujte:
kubectl apply -f ./public-gateway.yamlŽádný produkční systém by neměl poskytovat služby na internetu bez SSL. Pro zabezpečení vstupní brány Istio pomocí cert-manageru, CloudDNS a Let’s Encrypt si prosím přečtěte Flagger GKE.
Instalace Flagger
Nastavení GKE Istio neobsahuje instance Promethea, které se starají o údržbu telemetrické služby Istio. Protože Flagger využívá metriky Istio HTTP pro provedení analýzy canary, musíte nasadit následující konfiguraci Promethea, podobnou té, která je dodávána s oficiální schémou Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlPřidejte repozitář Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)Nasazení Flaggeru v prostoru názvů istio-system, s povolenými notifikacemi 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=flaggerFlagger můžete nainstalovat v jakémkoli prostoru názvů, pokud může komunikovat se službou Istio Prometheus přes port 9090.
Flagger má grafickou konzoli Grafana pro analýzu canary. Nainstalujte Grafanu do prostoru názvů 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-meOtevřete Grafana přes veřejný bránu vytvořením virtuální služby (nahraďte example.com svou doménou):
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-grafanaUložte výše uvedený zdroj jako grafana-virtual-service.yaml a poté jej aplikujte:
kubectl apply -f ./grafana-virtual-service.yamlPři přechodu na http://grafana.istio.example.com by vás měl prohlížeč nasměrovat na přihlašovací stránku Grafana.
Nasazení webových aplikací s Flagger
Flagger nasazuje Kubernetes a v případě potřeby horizontální automatické škálování (HPA), poté vytváří sérii objektů (nasazení Kubernetes, služby ClusterIP a virtuální služby Istio). Tyto objekty zpřístupňují aplikaci v service mesh a spravují canary analýzu a propagaci.
Vytvořte testovací namespace s povoleným nasazením Istio Sidecar:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlVytvořte nasazení a nástroj pro automatické horizontální škálování podů:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlNasazení zkušební zátěžové služby pro generování provozu během canary analýzy:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testVytvořte uživatelsky definovaný canary zdroj (nahraďte example.com svou doménou):
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/"Uložte výše uvedený zdroj jako podinfo-canary.yaml a poté jej aplikujte:
kubectl apply -f ./podinfo-canary.yamlVýše uvedená analýza, v případě úspěchu, se bude provádět po dobu pěti minut s kontrolou metrik HTTP každých třicet sekund. Můžete určit minimální čas potřebný k ověření a propagaci canary nasazení podle následujícího vzorce: interval * (maxWeight / stepWeight). Pole Canary CRD jsou zdokumentována .
Během několika sekund Flagger vytvoří canary objekty:
# 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/podinfoOtevřete prohlížeč a přejděte na app.istio.example.com, měli byste vidět číslo verze .
Automatická analýza a propagace kanárků
Flagger implementuje řídicí cyklus, který postupně přesouvá provoz na kanárka, zároveň měří klíčové ukazatele výkonu, jako je úspěšnost HTTP požadavků, průměrná doba odpovědi a dostupnost podu. Na základě analýzy KPI je kanárek buď propagován, nebo přerušen, a výsledky analýzy jsou publikovány na Slacku.
Kanárkový nasazení se spouští při změně jedné z následujících objektů:
- Nasazení PodSpec (obraz kontejneru, příkaz, porty, env atd.)
- ConfigMaps jsou montovány jako svazky nebo převáděny na proměnné prostředí
- Tajný klíče jsou montovány jako svazky nebo převáděny na proměnné prostředí
Spuštění kanárkového nasazení při aktualizaci obrazu kontejneru:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger zjistí, že verze nasazení byla změněna, a začne ji analyzovat:
kubectl -n test describe canary/podinfo
Události:
Byla detekována nová revize podinfo.test
Zvyšování podinfo.test
Čekání na dokončení nasazení podinfo.test: 0 z 1 aktualizovaných replik je k dispozici
Pokrok s váhou kanárka podinfo.test 5
Pokrok s váhou kanárka podinfo.test 10
Pokrok s váhou kanárka podinfo.test 15
Pokrok s váhou kanárka podinfo.test 20
Pokrok s váhou kanárka podinfo.test 25
Pokrok s váhou kanárka podinfo.test 30
Pokrok s váhou kanárka podinfo.test 35
Pokrok s váhou kanárka podinfo.test 40
Pokrok s váhou kanárka podinfo.test 45
Pokrok s váhou kanárka podinfo.test 50
Kopírování šablony podinfo.test do podinfo-primary.test
Čekání na dokončení nasazení podinfo-primary.test: 1 z 2 aktualizovaných replik je k dispozici
Propagace dokončena! Snižování podinfo.testBěhem analýzy lze výsledky kanárků sledovat pomocí Grafany:
Všimněte si: pokud během analýzy kanárků použijete nové změny týkající se nasazení, Flagger restartuje fázi analýzy.
Vytvořte seznam všech "kanárků" ve vašem klastru:
watch kubectl get canaries --all-namespaces
NAMESPACE NAME STATUS WEIGHT LASTTRANSITIONTIME
test podinfo Probíhá 15 2019-01-16T14:05:07Z
prod frontend Úspěšné 0 2019-01-15T16:15:07Z
prod backend Neúspěšné 0 2019-01-14T17:05:07ZPokud jste aktivovali upozornění Slack, obdržíte následující zprávy:
Automatický rollback
Během analýzy kanárků lze generovat syntetické chyby HTTP 500 a vysokou latenci odpovědi, aby se ověřilo, zda Flagger nezastaví nasazení.
Vytvořte testovací pod a proveďte v něm následující akci:
kubectl -n test run tester
--image=quay.io/stefanprodan/podinfo:1.2.1
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx shGenerování chyb HTTP 500:
watch curl http://podinfo-canary:9898/status/500Generování latence:
sledovat curl http://podinfo-canary:9898/delay/1Když počet neúspěšných kontrol dosáhne prahové hodnoty, provoz se vrací zpět na primární kanál, canary se škáluje na nulu a nasazení je označeno jako neúspěšné.
Chyby canary a vrcholy zpoždění jsou registrovány jako události Kubernetes a zaznamenány Flagger ve formátu JSON:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Zahájení canary nasazení pro podinfo.test
Zvyšení podinfo.test canary váha 5
Zvyšení podinfo.test canary váha 10
Zvyšení podinfo.test canary váha 15
Zastavit pokrok podinfo.test úspěšnost 69.17% < 99%
Zastavit pokrok podinfo.test úspěšnost 61.39% < 99%
Zastavit pokrok podinfo.test úspěšnost 55.06% < 99%
Zastavit pokrok podinfo.test úspěšnost 47.00% < 99%
Zastavit pokrok podinfo.test úspěšnost 37.00% 500ms
Zastavit pokrok podinfo.test doba požadavku 1.600s > 500ms
Zastavit pokrok podinfo.test doba požadavku 1.915s > 500ms
Zastavit pokrok podinfo.test doba požadavku 2.050s > 500ms
Zastavit pokrok podinfo.test doba požadavku 2.515s > 500ms
Vracíme zpět podinfo.test prah neúspěšných kontrol dosáhl 10
Canary selhal! Snižujeme podinfo.testPokud jste aktivovali upozornění Slack, dostanete zprávu, když bude překročena doba zpracování nebo dosaženo maximálního počtu neúspěšných kontrol během analýzy:
Na závěr
Spuštění service mesh, například Istio, navíc ke Kubernetes poskytne automatické metriky, logy a protokoly, ale nasazení pracovních zátěží stále závisí na externích nástrojích. Flagger se snaží tuto situaci změnit přidáním IoT schopností .
Flagger je kompatibilní s jakýmikoli CI/CD řešeními pro Kubernetes a canary analýzu lze snadno rozšířit pomocí k provádění systémových testů integrace/přijetí, zátěžových testů nebo jakýchkoli dalších uživatelských kontrol. Protože Flagger je deklarativní a reaguje na události Kubernetes, lze jej použít v GitOps pipeline spolu s nebo . Pokud používáte JenkinsX, můžete nainstalovat Flagger s přídavky jx.
Flagger je podporován a poskytuje canary nasazení v . Projekt je testován na GKE, EKS a "holém železe" s kubeadm.
Pokud máte návrhy na zlepšení Flagger, prosím, odešlete dotaz nebo PR na GitHub na adrese . Příspěvky jsou více než vítány!
Děkuji .
Zdroj: habr.com
