CD-ja njihet si një praktikë e softuerit të ndërmarrjes dhe është një evolucion natyror i parimeve të vendosura CI. Megjithatë, CD-ja është ende mjaft e rrallë, ndoshta për shkak të kompleksitetit të menaxhimit dhe frikës nga vendosjet e dështuara që ndikojnë në disponueshmërinë e sistemit.
Më poshtë është një udhëzues hap pas hapi për konfigurimin dhe përdorimin e Flagger në Google Kubernetes Engine (GKE).
Vendosja e një grupi Kubernetes
Ju filloni duke krijuar një grup GKE me shtesën Istio (nëse nuk keni një llogari GCP, mund të regjistroheni
Identifikohu në Google Cloud, krijo një projekt dhe aktivizo faturimin për të. Instaloni programin e linjës së komandës gcloud init
.
Vendosni projektin e paracaktuar, zonën e llogaritjes dhe zonën (zëvendësoni PROJECT_ID
për projektin tuaj):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Aktivizo shërbimin GKE dhe krijoni një grup me shtesat HPA dhe 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
Komanda e mësipërme do të krijojë një grup nyjesh të paracaktuar të përbërë nga dy VM n1-standard-2
(vCPU: 2, RAM 7,5 GB, disk: 30 GB). Në mënyrë ideale, komponentët Istio duhet të izolohen nga ngarkesat e tyre të punës, por nuk ka asnjë mënyrë të lehtë për të ekzekutuar pods Istio në një grup të dedikuar nyjesh. Manifestet Istio konsiderohen vetëm për lexim dhe GKE do të rikthejë çdo ndryshim të tillë si lidhja me një nyje ose shkëputja nga një pod.
Vendosni kredencialet për kubectl
:
gcloud container clusters get-credentials istio
Krijo një lidhje të rolit të administratorit të grupit:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Instaloni mjetin e linjës së komandës
brew install kubernetes-helm
Homebrew 2.0 tani është gjithashtu i disponueshëm për
Krijo një llogari shërbimi dhe një lidhje të roleve grupore për Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Zgjero Tiller në hapësirën e emrave kube-system
:
helm init --service-account tiller
Ju duhet të konsideroni përdorimin e SSL midis Helm dhe Tiller. Për më shumë informacion rreth mbrojtjes së instalimit të timonit, shihni
Konfirmo cilësimet:
kubectl -n istio-system get svc
Pas disa sekondash, GCP duhet t'i caktojë një adresë IP të jashtme shërbimit istio-ingressgateway
.
Vendosja e një porte hyrëse të Istio
Krijoni një adresë IP statike me emrin istio-gateway
duke përdorur adresën IP të portës 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
Tani keni nevojë për një domen interneti dhe akses te regjistruesi juaj DNS. Shtoni dy regjistrime A (zëvendësoni example.com
në domenin tuaj):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Verifikoni që kartoni DNS po funksionon:
watch host test.istio.example.com
Krijo një portë gjenerike Istio për të ofruar shërbime jashtë rrjetës së shërbimit mbi 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:
- "*"
Ruani burimin e mësipërm si public-gateway.yaml dhe më pas aplikojeni:
kubectl apply -f ./public-gateway.yaml
Asnjë sistem prodhimi nuk duhet të ofrojë shërbime në internet pa SSL. Për të siguruar portën tuaj të hyrjes në Istio me menaxherin e certifikatës, CloudDNS dhe Let's Encrypt, ju lutemi lexoni
Instalimi i flagerit
Shtesa GKE Istio nuk përfshin shembullin Prometheus që pastron shërbimin e telemetrisë Istio. Meqenëse Flagger përdor matjet e Istio HTTP për të kryer analizën e kanarinave, ju duhet të vendosni konfigurimin e mëposhtëm të Prometheus, të ngjashëm me atë që vjen me skemën zyrtare të Istio Helm.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Shtoni depon e Flagger Helm:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Zgjero Flagger në hapësirën e emrit istio-system
duke aktivizuar njoftimet 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
Mund ta instaloni Flagger në çdo hapësirë emri për sa kohë që mund të komunikojë me shërbimin Istio Prometheus në portin 9090.
Flagger ka një pult Grafana për analizat e kanarinave. Instaloni Grafana në hapësirën e emrave 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
Ekspozoni Grafana përmes një porte të hapur duke krijuar një shërbim virtual (zëvendësojeni example.com
në domenin tuaj):
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
Ruani burimin e mësipërm si grafana-virtual-service.yaml dhe më pas aplikojeni:
kubectl apply -f ./grafana-virtual-service.yaml
Kur shkon në http://grafana.istio.example.com
Shfletuesi juaj duhet t'ju ridrejtojë në faqen e hyrjes në Grafana.
Vendosja e aplikacioneve në ueb me Flagger
Flagger vendos Kubernetes dhe, nëse është e nevojshme, shkallëzimin automatik horizontal (HPA), më pas krijon një seri objektesh (vendosjet e Kubernetes, shërbimet ClusterIP dhe shërbimet virtuale Istio). Këto objekte e ekspozojnë aplikacionin ndaj rrjetës së shërbimit dhe menaxhojnë analizën dhe promovimin e kanarinave.
Krijo një hapësirë emri testimi me implementimin Istio Sidecar të aktivizuar:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Krijoni një vendosje dhe një mjet automatik të shkallëzimit horizontal për podin:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Vendosni një shërbim testimi të ngarkesës për të gjeneruar trafik gjatë analizës së kanarinës:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Krijoni një burim të personalizuar të kanarinës (zëvendësoni example.com
në domenin tuaj):
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/"
Ruani burimin e mësipërm si podinfo-canary.yaml dhe më pas aplikojeni:
kubectl apply -f ./podinfo-canary.yaml
Analiza e mësipërme, nëse është e suksesshme, do të zgjasë për pesë minuta, duke kontrolluar matjet e HTTP çdo gjysmë minutë. Ju mund të përcaktoni kohën minimale të nevojshme për të testuar dhe promovuar vendosjen e një kanarine duke përdorur formulën e mëposhtme: interval * (maxWeight / stepWeight)
. Fushat e CRD Kanarie janë të dokumentuara
Pas disa sekondash, Flagger do të krijojë objekte kanarinë:
# 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
Hapni shfletuesin tuaj dhe shkoni te app.istio.example.com
, duhet të shihni numrin e versionit
Analiza dhe promovim automatik i kanarinave
Flagger zbaton një qark kontrolli që lëviz gradualisht trafikun te kanarina ndërsa mat treguesit kryesorë të performancës si p.sh. shkallën e suksesit të kërkesës HTTP, kohëzgjatjen mesatare të kërkesës dhe shëndetin e pod. Bazuar në analizën e KPI, kanarina promovohet ose ndërpritet, dhe rezultatet e analizës publikohen në Slack.
Shpërndarja e kanarisë aktivizohet kur ndryshon një nga objektet e mëposhtme:
- Vendosni PodSpec (imazhi i kontejnerit, komanda, portet, env, etj.)
- ConfigMaps montohen si vëllime ose konvertohen në variabla të mjedisit
- Sekretet montohen si vëllime ose konvertohen në variabla të mjedisit
Ekzekutoni vendosjen e kanarisë kur përditësoni imazhin e kontejnerit:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger zbulon se versioni i vendosjes ka ndryshuar dhe fillon ta analizojë atë:
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
Gjatë analizës, rezultatet e kanarinës mund të monitorohen duke përdorur Grafana:
Ju lutemi vini re: nëse zbatohen ndryshime të reja në vendosjen gjatë analizës së kanarinave, Flagger do të rifillojë fazën e analizës.
Bëni një listë të të gjitha kanarinave në grupin tuaj:
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
Nëse keni aktivizuar njoftimet Slack, do të merrni mesazhet e mëposhtme:
Rikthim automatik
Gjatë analizës së kanarisë, mund të gjeneroni gabime sintetike HTTP 500 dhe vonesë të lartë të përgjigjes për të kontrolluar nëse Flagger do të ndalojë vendosjen.
Krijoni një pod testimi dhe bëni sa më poshtë në të:
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
Gjenerimi i gabimeve HTTP 500:
watch curl http://podinfo-canary:9898/status/500
Gjenerimi i vonesës:
watch curl http://podinfo-canary:9898/delay/1
Kur numri i kontrolleve të dështuara arrin një prag, trafiku drejtohet përsëri në kanalin kryesor, kanarina shkallëzohet në zero dhe vendosja shënohet si e dështuar.
Gabimet e kanarisë dhe pikat e vonesës regjistrohen si ngjarje Kubernetes dhe regjistrohen nga Flagger në formatin 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
Nëse keni aktivizuar njoftimet Slack, do të merrni një mesazh kur afati i fundit për plotësimin ose arritjen e numrit maksimal të rishikimeve të dështuara në një analizë është tejkaluar:
Në përfundim
Drejtimi i një rrjeti shërbimi si Istio në krye të Kubernetes do të sigurojë metrikë, regjistra dhe regjistra automatikë, por vendosja e ngarkesave të punës ende varet nga mjetet e jashtme. Flagger synon ta ndryshojë këtë duke shtuar aftësitë Istio
Flagger është i pajtueshëm me çdo zgjidhje CI/CD për Kubernetes, dhe analiza e kanarinës mund të zgjerohet lehtësisht me
Flagger i mbështetur
Nëse keni sugjerime për përmirësimin e Flagger, ju lutemi paraqisni një problem ose PR në GitHub në
Falënderim
Burimi: www.habr.com