CD je uznávaný ako podnikový softvér a je výsledkom prirodzeného vývoja zavedených princípov CI. CD je však stále dosť zriedkavé, možno kvôli zložitosti správy a strachu z neúspešného nasadenia ovplyvňujúceho dostupnosť systému.
Nižšie je uvedený podrobný sprievodca nastavením a používaním Flagger na Google Kubernetes Engine (GKE).
Nastavenie klastra Kubernetes
Začnete vytvorením klastra GKE pomocou doplnku Istio (ak nemáte účet GCP, môžete sa zaregistrovať
Prihláste sa do služby Google Cloud, vytvorte projekt a povoľte jeho fakturáciu. Nainštalujte pomôcku príkazového riadka gcloud init
.
Nastavte predvolený projekt, výpočtovú oblasť a zónu (nahradiť PROJECT_ID
pre váš projekt):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Povoľte službu GKE a vytvorte klaster s doplnkami HPA a 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
Vyššie uvedený príkaz vytvorí predvolenú oblasť uzlov vrátane dvoch virtuálnych počítačov n1-standard-2
(vCPU: 2, RAM 7,5 GB, disk: 30 GB). V ideálnom prípade by ste mali izolovať komponenty Istio od svojich pracovných úloh, ale neexistuje jednoduchý spôsob, ako spustiť Istio Pods vo vyhradenej skupine uzlov. Manifesty Istio sa považujú len na čítanie a GKE vráti späť všetky zmeny, ako napríklad prepojenie s uzlom alebo odpojenie od modulu.
Nastaviť poverenia pre kubectl
:
gcloud container clusters get-credentials istio
Vytvorte väzbu roly správcu klastra:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Nainštalujte nástroj príkazového riadka
brew install kubernetes-helm
Homebrew 2.0 je teraz k dispozícii aj pre
Vytvorte servisný účet a väzbu roly klastra pre Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Rozbaľte Tiller v priestore názvov kube-system
:
helm init --service-account tiller
Mali by ste zvážiť použitie SSL medzi Helm a Tiller. Ďalšie informácie o ochrane vašej inštalácie Helm nájdete v časti
Potvrďte nastavenia:
kubectl -n istio-system get svc
Po niekoľkých sekundách by mala služba GCP priradiť externú adresu IP pre službu istio-ingressgateway
.
Konfigurácia vstupnej brány Istio
Vytvorte statickú IP adresu s názvom istio-gateway
pomocou IP adresy 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-central1
Teraz potrebujete internetovú doménu a prístup k vášmu registrátorovi DNS. Pridajte dva záznamy A (nahraďte example.com
na vašu doménu):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Overte, či funguje zástupný znak DNS:
watch host test.istio.example.com
Vytvorte všeobecnú bránu Istio na poskytovanie služieb mimo sieť služieb 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 použite:
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, prečítajte si
Inštalácia indikátora
Doplnok GKE Istio nezahŕňa inštanciu Prometheus, ktorá čistí telemetrickú službu Istio. Pretože Flagger používa metriky Istio HTTP na vykonanie analýzy kanárikov, 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.yaml
Pridajte úložisko Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Rozbaľte Flagger na priestor názvov istio-system
povolením upozornení 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 môžete nainštalovať do akéhokoľvek menného priestoru, pokiaľ dokáže komunikovať so službou Istio Prometheus na porte 9090.
Flagger má grafana dashboard pre analýzu kanárikov. 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-me
Odhaľte Grafana cez otvorenú bránu vytvorením virtuálnej služby (nahradiť example.com
na vašu doménu):
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
Uložte vyššie uvedený zdroj ako grafana-virtual-service.yaml a potom ho použite:
kubectl apply -f ./grafana-virtual-service.yaml
Pri sťahovaní do http://grafana.istio.example.com
v prehliadači by ste mali byť presmerovaní na prihlasovaciu stránku Grafana.
Nasadzovanie webových aplikácií pomocou nástroja Flagger
Flagger nasadí Kubernetes a voliteľne sa automaticky škáluje (HPA), potom vytvorí sériu objektov (nasadenia Kubernetes, služby ClusterIP a virtuálne služby Istio). Tieto objekty vystavujú aplikáciu servisnej sieti a kontrolujú analýzu a postup kanárikov.
Vytvorte testovací priestor názvov s povoleným vstrekovaním Istio Sidecar:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Vytvorte nástroj na nasadenie a automatické škálovanie modulu:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Nasaďte službu testovacieho zaťaženia na generovanie návštevnosti počas analýzy canary:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Vytvorte vlastný kanársky zdroj (nahradiť example.com
na vašu doménu):
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 použite:
kubectl apply -f ./podinfo-canary.yaml
Ak bude vyššie uvedená analýza úspešná, pobeží päť minút a každú polminútu kontroluje metriky HTTP. Minimálny čas potrebný na overenie a podporu nasadenia canary môžete určiť pomocou nasledujúceho vzorca: interval * (maxWeight / stepWeight)
. Polia Canary CRD sú zdokumentované
Po niekoľkých sekundách Flagger vytvorí kanárske 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/podinfo
Otvorte prehliadač a prejdite na app.istio.example.com
, mali by ste vidieť číslo verzie
Automatická analýza a propagácia kanárikov
Flagger implementuje riadiacu slučku, ktorá postupne presúva návštevnosť do kanárika a zároveň meria kľúčové metriky výkonu, ako je úspešnosť požiadaviek HTTP, priemerné trvanie požiadavky a stav pod. Na základe analýzy KPI sa kanárik povýši alebo preruší a výsledky analýzy sa zverejnia Slacku.
Nasadenie Canary sa spustí, keď sa zmení jeden z nasledujúcich objektov:
- Nasadiť PodSpec (obrázok kontajnera, príkaz, porty, env atď.)
- ConfigMaps sú pripojené ako zväzky alebo mapované na premenné prostredia
- Tajomstvá sú pripojené ako zväzky alebo konvertované na premenné prostredia
Spustite nasadenie canary pri aktualizácii obrázka kontajnera:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger zistí, že verzia nasadenia sa zmenila a začne ju analyzovať:
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
Počas analýzy je možné pomocou Grafany sledovať výsledky kanárikov:
Upozorňujeme, že ak sa na nasadenie použijú nové zmeny počas analýzy canary, Flagger reštartuje fázu analýzy.
Vytvorte zoznam všetkých kanárikov vo svojom klastri:
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
Ak ste povolili upozornenia Slack, dostanete nasledujúce správy:
Automatické vrátenie späť
Počas analýzy canary môžete generovať syntetické chyby HTTP 500 a vysokú latenciu odozvy, aby ste zistili, či Flagger zastaví nasadenie.
Vytvorte testovací modul a vykonajte v ňom nasledovné:
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
Generovanie chýb HTTP 500:
watch curl http://podinfo-canary:9898/status/500
Generovanie oneskorenia:
watch curl http://podinfo-canary:9898/delay/1
Keď počet neúspešných kontrol dosiahne prahovú hodnotu, prevádzka sa nasmeruje späť na primárny kanál, kanárik sa zníži na nulu a nasadenie sa označí ako neúspešné.
Kanárske chyby a špičky latencie sa zaznamenávajú ako udalosti Kubernetes a zaznamenávajú sa pomocou nástroja Flagger vo formáte 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
Ak ste povolili upozornenia Slack, dostanete správu, keď sa prekročí konečný termín alebo sa dosiahne maximálny počet neúspešných kontrol v analýze:
na záver
Spustenie servisnej siete ako Istio popri Kubernetes poskytne automatické metriky, protokoly a protokoly, ale nasadenie pracovného zaťaženia stále závisí od externých nástrojov. Flagger sa to snaží zmeniť pridaním funkcií Istio
Flagger je kompatibilný s akýmkoľvek riešením Kubernetes CI/CD a analýzu kanárikov možno jednoducho rozšíriť
Podporovaný nahlasovateľ
Ak máte návrhy na zlepšenie Flaggera, odošlite problém alebo PR na GitHub na adrese
Vďaka
Zdroj: hab.com