
CD bol uznaný ako prax podnikového softvéru, čo je výsledok prirodzenej evolúcie ustálených princípov CI. Napriek tomu je CD stále pomerne raritnou záležitosťou, možno kvôli zložitosti správy a strachu z neúspešných nasadení, ktoré ovplyvňujú dostupnosť systému.
je operátor Kubernetes s otvoreným zdrojovým kód, ktorého cieľom je vylúčiť zložitosti vzájomných vzťahov. Automatizuje propagáciu canary nasadení pomocou presmerovania prevádzky Istio a metriky Prometheus na analýzu správania aplikácie počas kontrolovaného nasadzovania.
Nižšie je uvedený postupný návod na nastavenie a používanie Flagger vo Google Kubernetes Engine (GKE).
Nastavenie klastru Kubernetes
Začnite vytvorením klastru GKE s nadstavbou Istio (ak nemáte účet GCP, môžete sa registrovať na získanie bezplatných kreditov).
Prihláste sa do Google Cloud, vytvorte projekt a aktivujte pre neho fakturáciu. Nainštalujte nástroj príkazového riadku a nastavte svoj projekt pomocou gcloud init.
Nastavte predvolený projekt, oblasť výpočtu a zónu (nahradíte PROJECT_ID svojím projektom):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-aAktivujte službu GKE a vytvorte klaster 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_PERMISSIVEPríkaz vyššie vytvorí predvolenú skupinu nód, ktorá obsahuje dve VM n1-standard-2 (vCPU: 2, RAM 7,5 GB, disk: 30 GB). Ideálne by bolo izolovať komponenty Istio od svojich pracovných záťaží, ale neexistuje jednoduchý spôsob, ako spustiť pod Istio v oddelenej skupine nód. Manifesty Istio sú považované za iba na čítanie a GKE zruší akékoľvek zmeny, ako napríklad viazanie na nód alebo odpojenie od podu.
Nastavte prihlasovacie údaje pre kubectl:
gcloud container clusters get-credentials istioVytvorte viazanie úlohy administrátora klastru:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"Nainštalujte nástroj príkazového riadku :
brew install kubernetes-helmHomebrew 2.0 je teraz tiež k dispozícii pre .
Vytvorte účet služby a viazanie úlohy klastru pre Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tillerNačítať Tiller do menného priestoru kube-system:
helm init --service-account tillerMali by ste zvážiť použitie SSL medzi Helm a Tiller. Pre ďalšie informácie o zabezpečení inštalácie Helm si prečítajte
Potvrďte nastavenia:
kubectl -n istio-system get svcO niekoľko sekúnd by GCP mal priradiť externú IP adresu pre službu istio-ingressgateway.
Nastavenie vstupného brány Istio
Vytvorte statickú IP adresu s názvom 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-central1Teraz potrebujete internetovú doménu a prístup k vášmu DNS registrátorovi. Pridajte dve A záznamy (nahradiť example.com vašou doménou):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}Uistite sa, že zástupný symbol DNS funguje:
watch host test.istio.example.comVytvorte verejnú bránu Istio na poskytovanie služieb mimo service mesh cez 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 vyššie uvedený zdroj ako public-gateway.yaml a potom ho aplikujte:
kubectl apply -f ./public-gateway.yamlŽiadny produkčný systém by nemal poskytovať služby na internete bez SSL. Ak chcete zabezpečiť vstupnú bránu Istio pomocou cert-manager, CloudDNS a Let’s Encrypt, prosím, prečítajte si Flagger GKE.
Inštalácia Flagger
Nadstavba GKE Istio nezahŕňa nasadenie Prometheus, ktorý sa zaoberá údržbou telemetrickej služby Istio. Keďže Flagger používa metriku Istio HTTP na vykonávanie canary analýzy, musíte nasadiť nasledujúcu konfiguráciu Prometheus, podobnú tej, ktorá sa dodáva s oficiálnou schémou Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yamlPridajte repozitár Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)Načítať Flagger do menného priestoru istio-system, vrátane notifikácií 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 nainštalovať v akomkoľvek mennom priestore, ak môže interagovať so službou Istio Prometheus cez port 9090.
Flagger má monitorovací panel Grafana pre canary analýzu. Nainštalujte Grafana do menného priestoru 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-meOtvorenie Grafany prostredníctvom otvoreného brány vytvorením virtuálnej služby (nahradťe example.com svojou 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 vyššie uvedený zdroj ako grafana-virtual-service.yaml a potom ho aplikujte:
kubectl apply -f ./grafana-virtual-service.yamlPri prechode na http://grafana.istio.example.com v prehliadači by ste mali byť presmerovaní na prihlasovaciu stránku Grafany.
Nasadenie webových aplikácií s Flagger
Flagger nasadzuje Kubernetes a, ak je to potrebné, horizontálne automatické škálovanie (HPA), potom vytvára sériu objektov (nasadenia Kubernetes, služby ClusterIP a virtuálne služby Istio). Tieto objekty odhaľujú aplikáciu v service mesh a riadia canary analýzu a propagáciu.
Vytvorte testovací názov priestor s povoleným zavedením Istio Sidecar:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yamlVytvorte nasadenie a nástroj na automatické horizontálne škálovanie podu:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yamlNasadte testovaciu záťažovú službu na generovanie prevádzky počas canary analýzy:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=testVytvorte vlastný canary zdroj (nahradťe example.com vašou 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 vyššie uvedený zdroj ako podinfo-canary.yaml a potom ho aplikujte:
kubectl apply -f ./podinfo-canary.yamlVyššie uvedená analýza, v prípade úspechu, bude prebiehať počas piatich minút s kontrolou metrik HTTP každých pol minúty. Môžete určiť minimálny čas potrebný na kontrolu a propagáciu canary nasadenia podľa nasledujúcej formulácie: interval * (maxWeight / stepWeight). Polia Canary CRD sú zdokumentované .
O pár sekúnd neskôr Flagger vytvorí 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/podinfoOtvorte prehliadač a prejdite na app.istio.example.com, mali by ste vidieť číslo verzie .
Automatická canary analýza a propagácia
Flagger implementuje riadiaci cyklus, ktorý postupne presúva dopravu na canary a súčasne meria kľúčové ukazovatele výkonnosti, ako je miera úspešnosti HTTP požiadaviek, priemerná doba trvania požiadaviek a dostupnosť podu. Na základe analýzy KPI sa canary posúva alebo preruší a výsledky analýzy sa zverejňujú v Slacku.
Canary nasadenie sa spúšťa pri zmene jedného z nasledujúcich objektov:
- Nasadenie PodSpec (obraz kontajnera, príkaz, porty, env a pod.)
- ConfigMaps sú pripevnené ako zväzky alebo premenené na premenné prostredia
- Tajomstvá sú pripevnené ako zväzky alebo premenené na premenné prostredia
Spustenie canary nasadenia pri aktualizácii obrazu kontajnera:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1Flagger zistí, že verzia nasadenia sa zmenila, a začne ju analyzovať:
kubectl -n test describe canary/podinfo
Udalosti:
Nová revízia zistená podinfo.test
Zvyšovanie podinfo.test
Čakanie na dokončenie rollout podinfo.test: 0 z 1 aktualizovaných replik je k dispozícii
Pokročil podinfo.test canary hmotnosť 5
Pokročil podinfo.test canary hmotnosť 10
Pokročil podinfo.test canary hmotnosť 15
Pokročil podinfo.test canary hmotnosť 20
Pokročil podinfo.test canary hmotnosť 25
Pokročil podinfo.test canary hmotnosť 30
Pokročil podinfo.test canary hmotnosť 35
Pokročil podinfo.test canary hmotnosť 40
Pokročil podinfo.test canary hmotnosť 45
Pokročil podinfo.test canary hmotnosť 50
Kopírovanie šablóny podinfo.test do podinfo-primary.test
Čakanie na dokončenie rollout podinfo-primary.test: 1 z 2 aktualizovaných replik je k dispozícii
Propagácia dokončená! Znižovanie podinfo.testPočas analýzy je možné sledovať výsledky canary pomocou Grafany:
Upozorňujeme: ak sa nové zmeny uplatnia na nasadení počas canary analýzy, Flagger reštartuje fázu analýzy.
Vytvorte zoznam všetkých „kanárikov“ vo vašom klastri:
watch kubectl get canaries --all-namespaces
NAMESPACE NAME STATUS WEIGHT LASTTRANSITIONTIME
test podinfo Prebieha 15 2019-01-16T14:05:07Z
prod frontend Úspešne 0 2019-01-15T16:15:07Z
prod backend Zlyhalo 0 2019-01-14T17:05:07ZAk ste povolili upozornenia Slack, dostanete nasledujúce správy:
Automatický návrat
Počas canary analýzy je možné generovať syntetické chyby HTTP 500 a vysoké oneskorenie odpovede, aby ste skontrolovali, či Flagger nezastaví nasadenie.
Vytvorte testovací pod a vykonajte v ňom nasledujúcu akciu:
kubectl -n test run tester
--image=quay.io/stefanprodan/podinfo:1.2.1
-- ./podinfo --port=9898
kubectl -n test exec -it tester-xx-xx shGenerovanie chýb HTTP 500:
watch curl http://podinfo-canary:9898/status/500Generovanie oneskorenia:
pozor curl http://podinfo-canary:9898/delay/1Keď počet neúspešných kontrol dosiahne prahovú hodnotu, prevádzka sa vráti do primárneho kanála, kanárik sa škáluje na nulu a nasadenie je označené ako zlyhané.
Chyby kanárikového nasadenia a vrcholy oneskorení sú zaznamenávané ako udalosti Kubernetes a zapisované Flaggerom vo formáte JSON:
kubectl -n istio-system logs deployment/flagger -f | jq .msg
Začínam kanárikové nasadenie pre podinfo.test
Zvýšim kanárikovú hmotnosť podinfo.test na 5
Zvýšim kanárikovú hmotnosť podinfo.test na 10
Zvýšim kanárikovú hmotnosť podinfo.test na 15
Pozastavím pokrok podinfo.test, úspešnosť 69.17% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 61.39% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 55.06% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 47.00% < 99%
Pozastavím pokrok podinfo.test, úspešnosť 37.00% 500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 1.600s > 500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 1.915s > 500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 2.050s > 500ms
Pozastavím požiadavku na pokrok podinfo.test, trvanie 2.515s > 500ms
Vraciam späť podinfo.test, dosiahnutý prah neúspešných kontrol 10
Kanár zlyhal! Znižujem výkon podinfo.testAk ste povolili oznámenia Slack, dostanete správu, keď prekročíte časový limit alebo dosiahnete maximálny počet neúspešných kontrol počas analýzy:
Na záver
Spustenie service mesh, ako je Istio, navyše k Kubernetes poskytne automatické metriky, logy a protokoly, ale nasadenie pracovných zaťažení stále závisí od externých nástrojov. Flagger sa snaží túto situáciu zmeniť pridaním možností Istio .
Flagger je kompatibilný s akýmikoľvek CI/CD riešeniami pre Kubernetes a kanárikový test možno ľahko rozšíriť pomocou na vykonávanie systémových testov integrácie/prijatia, záťažových testov alebo akýchkoľvek iných používateľských kontrol. Keďže Flagger je deklaratívny a reaguje na udalosti Kubernetes, môže sa používať v GitOps pipeline spolu s alebo . Ak používate JenkinsX, môžete nainštalovať Flagger s jx doplnkami.
Flagger podporujú a poskytuje kanárikové nasadenia v . Projekt je testovaný na GKE, EKS a „holom železe“ s kubeadm.
Ak máte návrhy na zlepšenie Flagger, prosím, pošlite otázku alebo PR na GitHub na adrese . Príspevky sú viac než vítané!
Ďakujem .
Zdroj: habr.com
