Ang CD giila isip usa ka negosyo nga software practice ug resulta sa natural nga ebolusyon sa natukod nga mga prinsipyo sa CI. Bisan pa, ang CD talagsa ra, tingali tungod sa pagkakomplikado sa pagdumala ug kahadlok sa mga napakyas nga pag-deploy nga makaapekto sa pagkaanaa sa sistema.
Sa ubos usa ka lakang sa lakang nga giya sa pag-set up ug paggamit sa Flagger sa Google Kubernetes Engine (GKE).
Pagbutang ug Kubernetes cluster
Magsugod ka pinaagi sa paghimo og cluster sa GKE gamit ang Istio add-on (kung wala kay GCP account, pwede ka magpalista
Pag-sign in sa Google Cloud, paghimo og proyekto, ug i-enable ang pagsingil niini. I-install ang command line utility gcloud init
.
Itakda ang default nga proyekto, compute area, ug zone (ilis PROJECT_ID
para sa imong project):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
I-enable ang serbisyo sa GKE ug paghimo og cluster nga adunay mga add-on sa HPA ug 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
Ang sugo sa ibabaw maghimo ug default node pool lakip ang duha ka VM n1-standard-2
(vCPU: 2, RAM 7,5 GB, disk: 30 GB). Sa tinuud, kinahanglan nimo nga ihimulag ang mga sangkap sa Istio gikan sa imong mga workload, apan walaβy dali nga paagi sa pagpadagan sa Istio Pods sa usa ka gipahinungod nga pool sa mga node. Ang Istio manifests gikonsiderar nga read-only ug ang GKE mo-undo sa bisan unsang mga kausaban, sama sa pag-link sa usa ka node o pagtangtang sa usa ka pod.
I-set up ang mga kredensyal para sa kubectl
:
gcloud container clusters get-credentials istio
Paghimo usa ka cluster administrator nga nagbugkos sa papel:
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
I-install ang command line tool
brew install kubernetes-helm
Ang Homebrew 2.0 magamit na usab alang sa
Paghimo og account sa serbisyo ug cluster role binding para sa Tiller:
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Pagpalapad sa Tiller sa namespace kube-system
:
helm init --service-account tiller
Kinahanglan nimong hunahunaon ang paggamit sa SSL tali sa Helm ug Tiller. Alang sa dugang nga impormasyon bahin sa pagpanalipod sa imong pag-instalar sa Helm, tan-awa
Kumpirma ang mga setting:
kubectl -n istio-system get svc
Human sa pipila ka segundo, ang GCP kinahanglang mag-assign ug external IP address para sa serbisyo istio-ingressgateway
.
Pag-configure sa Istio Ingress Gateway
Paghimo og static nga IP address nga adunay ngalan istio-gateway
gamit ang IP address sa Istio gateway:
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
Karon kinahanglan nimo ang usa ka domain sa internet ug pag-access sa imong DNS registrar. Pagdugang og duha ka rekord sa A (puli example.com
sa imong domain):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Tinoa nga ang DNS wildcard nagtrabaho:
watch host test.istio.example.com
Paghimo og generic nga Istio gateway aron makahatag og mga serbisyo sa gawas sa service mesh sa 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:
- "*"
I-save ang naa sa ibabaw nga kapanguhaan ingon public-gateway.yaml ug dayon i-apply kini:
kubectl apply -f ./public-gateway.yaml
Walaβy sistema sa produksiyon ang kinahanglan maghatag serbisyo sa Internet nga wala ang SSL. Aron ma-secure ang Istio ingress gateway nga adunay cert-manager, CloudDNS ug Let's Encrypt, palihug basaha
Pag-instalar sa Flagger
Ang GKE Istio add-on wala maglakip sa usa ka Prometheus nga pananglitan nga naglimpyo sa serbisyo sa telemetry sa Istio. Tungod kay ang Flagger naggamit sa Istio HTTP metrics sa paghimo sa canary analysis, kinahanglan nimo nga i-deploy ang mosunod nga Prometheus configuration, susama sa usa nga kauban sa opisyal nga Istio Helm schema.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Idugang ang Flagger Helm repository:
helm repo add flagger [https://flagger.app](https://flagger.app/)
Ipalapad ang Flagger sa namespace istio-system
pinaagi sa pagpagana sa mga pahibalo sa 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
Mahimo nimong i-install ang Flagger sa bisan unsang namespace basta makakomunikar kini sa serbisyo sa Istio Prometheus sa port 9090.
Ang Flagger adunay dashboard sa Grafana alang sa pagtuki sa kanaryo. I-install ang Grafana sa namespace 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
Ibutyag ang Grafana pinaagi sa usa ka bukas nga ganghaan pinaagi sa paghimo og usa ka virtual nga serbisyo (puli example.com
sa imong domain):
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
I-save ang naa sa ibabaw nga kapanguhaan ingon grafana-virtual-service.yaml ug dayon i-apply kini:
kubectl apply -f ./grafana-virtual-service.yaml
Sa dihang mobalhin sa http://grafana.istio.example.com
sa browser, kinahanglan nga idirekta ka sa panid sa pag-login sa Grafana.
Pag-deploy sa mga aplikasyon sa web gamit ang Flagger
Gi-deploy sa Flagger ang mga Kubernetes ug awtomatiko nga gi-scale out (HPA), dayon nagmugna usa ka serye sa mga butang (mga pag-deploy sa Kubernetes, mga serbisyo sa ClusterIP, ug mga virtual nga serbisyo sa Istio). Gibutyag niini nga mga butang ang aplikasyon sa mesh sa serbisyo ug pagkontrolar sa pagtuki ug pag-uswag sa canary.
Paghimo og usa ka test namespace nga adunay Istio Sidecar injection nga naka-enable:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Paghimo og deployment ug pod automatic scale-out tool:
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
I-deploy ang usa ka test load service aron makamugna og trapiko atol sa canary analysis:
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Paghimo usa ka naandan nga kapanguhaan sa canary (ilis example.com
sa imong domain):
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/"
I-save ang naa sa ibabaw nga kapanguhaan ingon podinfo-canary.yaml ug dayon i-apply kini:
kubectl apply -f ./podinfo-canary.yaml
Ang pag-analisar sa ibabaw, kung malampuson, modagan sa lima ka minuto, pagsusi sa mga sukatan sa HTTP matag tunga sa minuto. Mahimo nimong mahibal-an ang minimum nga oras nga gikinahanglan aron ma-validate ug ma-promote ang pag-deploy sa canary gamit ang mosunod nga pormula: interval * (maxWeight / stepWeight)
. Ang mga natad sa Canary CRD gidokumento
Pagkahuman sa pila ka segundo, ang Flagger maghimo mga butang nga 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/podinfo
Ablihi ang usa ka browser ug adto sa app.istio.example.com
, kinahanglan nimo nga makita ang numero sa bersyon
Awtomatikong pagtuki ug promosyon sa canary
Ang Flagger nagpatuman ug control loop nga inanayng nagpalihok sa trapiko ngadto sa canary samtang nagsukod sa importanteng performance metrics sama sa HTTP request success rate, average nga gidugayon sa hangyo, ug pod health. Pinasukad sa pagtuki sa KPI, ang kanaryo gipasiugda o nabalda, ug ang mga resulta sa pagtuki gipatik sa Slack.
Ang pag-deploy sa canary ma-trigger kung ang usa sa mga musunud nga butang mausab:
- I-deploy ang PodSpec (larawan sa sulud, mando, pantalan, env, ug uban pa)
- Ang ConfigMaps gi-mount isip mga volume o gimapa sa mga variable sa palibot
- Ang mga sekreto gi-mount isip mga volume o gi-convert sa mga variable sa palibot
Pagdalagan ang canary deploy kung mag-update sa usa ka sulud nga imahe:
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Ang Flagger nakamatikod nga ang deployment nga bersyon nausab ug nagsugod sa pag-parse niini:
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
Atol sa pagtuki, ang mga resulta sa canary mahimong masubay gamit ang Grafana:
Palihug timan-i nga kung ang mga bag-ong pagbag-o magamit sa usa ka pag-deploy sa panahon sa pagtuki sa canary, unya ang Flagger magsugod pag-usab sa yugto sa pagtuki.
Paghimo ug lista sa tanang canary sa imong cluster:
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
Kung gipalihok nimo ang mga pahibalo sa Slack, madawat nimo ang mosunod nga mga mensahe:
Awtomatikong rollback
Atol sa pag-analisa sa canary, makamugna ka og sintetikong HTTP 500 nga mga sayop ug taas nga latency sa pagtubag aron masuta kung ang Flagger mohunong sa pag-deploy.
Paghimo og test pod ug buhata ang mosunod niini:
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
Pagmugna og HTTP 500 nga mga sayop:
watch curl http://podinfo-canary:9898/status/500
Paglangay nga henerasyon:
watch curl http://podinfo-canary:9898/delay/1
Sa diha nga ang gidaghanon sa mga napakyas nga mga tseke makaabot sa threshold, ang trapiko ibalik sa nag-unang channel, ang canary gi-scale ngadto sa zero, ug ang deployment gimarkahan nga napakyas.
Ang mga kasaypanan sa canary ug latency spike gi-log isip mga panghitabo sa Kubernetes ug gi-log sa Flagger sa JSON nga format:
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
Kung gipagana nimo ang mga pahibalo sa Slack, makadawat ka usa ka mensahe kung nalapas na ang deadline o ang labing kadaghan nga napakyas nga mga pagsusi sa pag-analisar naabot:
Sa konklusyon
Ang pagpadagan sa usa ka service mesh sama sa Istio agig dugang sa Kubernetes maghatag ug awtomatikong metrics, logs, ug protocols, apan ang workload deployment nagdepende gihapon sa external tools. Ang Flagger nagtumong sa pagbag-o niini pinaagi sa pagdugang sa mga kapabilidad sa Istio
Nahiuyon ang Flagger sa bisan unsang solusyon sa Kubernetes CI/CD, ug ang pagtuki sa canary dali nga madugangan
Gisuportahan ang flagger
Kung naa kay mga sugyot sa pagpauswag sa Flagger, palihog pagsumite ug isyu o PR sa GitHub sa
Π‘ΠΏΠ°ΡΠΈΠ±ΠΎ
Source: www.habr.com