CD-ն ճանաչվում է որպես ձեռնարկության ծրագրային ապահովման պրակտիկա և հանդիսանում է հաստատված CI սկզբունքների բնական էվոլյուցիայի արդյունք: Այնուամենայնիվ, CD-ն դեռ բավականին հազվադեպ է, հավանաբար կառավարման բարդության և համակարգի հասանելիության վրա ազդող ձախողված տեղակայումների վախի պատճառով:
Ստորև բերված է քայլ առ քայլ ուղեցույց՝ կարգավորելու և օգտագործելու Flagger-ը Google Kubernetes Engine-ում (GKE):
Kubernetes կլաստերի ստեղծում
Դուք սկսում եք ստեղծելով GKE կլաստեր Istio հավելումով (եթե չունեք GCP հաշիվ, կարող եք գրանցվել
Մուտք գործեք Google Cloud, ստեղծեք նախագիծ և միացրեք դրա վճարումը: Տեղադրեք հրամանի տողի կոմունալ ծրագիրը gcloud init
.
Սահմանեք լռելյայն նախագիծը, հաշվարկային տարածքը և գոտին (փոխարինել PROJECT_ID
ձեր նախագծի համար):
gcloud config set project PROJECT_ID
gcloud config set compute/region us-central1
gcloud config set compute/zone us-central1-a
Միացրեք GKE ծառայությունը և ստեղծեք կլաստեր HPA և 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
Վերոնշյալ հրամանը կստեղծի լռելյայն հանգույց՝ ներառյալ երկու VM n1-standard-2
(vCPU՝ 2, RAM՝ 7,5 ԳԲ, սկավառակ՝ 30 ԳԲ): Իդեալում, դուք պետք է մեկուսացնեք Istio բաղադրիչները ձեր աշխատանքային ծանրաբեռնվածությունից, բայց Istio Pods-ը գործարկելու հեշտ միջոց չկա հանգույցների հատուկ լողավազանում: Istio մանիֆեստները համարվում են միայն կարդալու համար, և GKE-ն կչեղարկի ցանկացած փոփոխություն, օրինակ՝ կապել հանգույցին կամ անջատվել պատիճից:
Ստեղծեք հավատարմագրերը kubectl
:
gcloud container clusters get-credentials istio
Ստեղծեք կլաստերի ադմինիստրատորի դերը պարտադիր՝
kubectl create clusterrolebinding "cluster-admin-$(whoami)"
--clusterrole=cluster-admin
--user="$(gcloud config get-value core/account)"
Տեղադրեք հրամանի տողի գործիքը
brew install kubernetes-helm
Homebrew 2.0-ն այժմ հասանելի է նաև
Ստեղծեք ծառայության հաշիվ և կլաստերի դերը պարտադիր Tiller-ի համար.
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
Ընդարձակեք Tiller-ը անունների տարածության մեջ kube-system
:
helm init --service-account tiller
Դուք պետք է մտածեք SSL-ի օգտագործման մասին Helm-ի և Tiller-ի միջև: Ձեր Ղեկի տեղադրումը պաշտպանելու մասին լրացուցիչ տեղեկությունների համար տե՛ս
Հաստատեք կարգավորումները.
kubectl -n istio-system get svc
Մի քանի վայրկյան հետո GCP-ն պետք է արտաքին IP հասցե հատկացնի ծառայությանը istio-ingressgateway
.
Istio Ingress Gateway-ի կարգավորում
Ստեղծեք ստատիկ IP հասցե անունով istio-gateway
օգտագործելով Istio դարպասի IP հասցեն.
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
Այժմ ձեզ անհրաժեշտ է ինտերնետային տիրույթ և մուտք դեպի ձեր DNS գրանցող: Ավելացնել երկու A գրառում (փոխարինել example.com
ձեր տիրույթում):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
Ստուգեք, որ DNS նիշը աշխատում է.
watch host test.istio.example.com
Ստեղծեք ընդհանուր Istio դարպաս՝ 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:
- "*"
Պահպանեք վերը նշված ռեսուրսը որպես public-gateway.yaml և այնուհետև կիրառեք այն.
kubectl apply -f ./public-gateway.yaml
Ոչ մի արտադրական համակարգ չպետք է ծառայություններ մատուցի ինտերնետում առանց SSL-ի: Istio մուտքի դարպասը հավաստագրված մենեջերի, CloudDNS-ի և Let's Encrypt-ի միջոցով ապահովելու համար խնդրում ենք կարդալ
Flagger-ի տեղադրում
GKE Istio հավելումը չի ներառում Prometheus-ի օրինակ, որը մաքրում է Istio հեռաչափության ծառայությունը: Քանի որ Flagger-ը օգտագործում է Istio HTTP չափումներ կանարների վերլուծություն կատարելու համար, դուք պետք է գործադրեք Prometheus-ի հետևյալ կոնֆիգուրացիան, որը նման է Istio Helm-ի պաշտոնական սխեմային:
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
Ավելացնել Flagger Helm պահեստը.
helm repo add flagger [https://flagger.app](https://flagger.app/)
Ընդարձակեք Flagger-ը դեպի անվանատարածք istio-system
միացնելով 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-ը ցանկացած անվանատարածքում, քանի դեռ այն կարող է հաղորդակցվել Istio Prometheus ծառայության հետ 9090 նավահանգստում:
Flagger-ն ունի Grafana վահանակ դեղձանիկի վերլուծության համար: Տեղադրեք Grafana-ն անունների տարածքում 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
Բացահայտեք Grafana-ն բաց դարպասի միջոցով՝ ստեղծելով վիրտուալ ծառայություն (փոխարինել example.com
ձեր տիրույթում):
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
Պահպանեք վերը նշված ռեսուրսը որպես grafana-virtual-service.yaml և այնուհետև կիրառեք այն.
kubectl apply -f ./grafana-virtual-service.yaml
Երբ տեղափոխվում է http://grafana.istio.example.com
զննարկիչում դուք պետք է ուղղորդվեք դեպի Grafana մուտքի էջ:
Վեբ հավելվածների տեղակայում Flagger-ով
Flagger-ը տեղակայում է Kubernetes-ը և կամայականորեն նվազեցնում է ինքնաբերաբար (HPA), այնուհետև ստեղծում է մի շարք օբյեկտներ (Kubernetes տեղակայումներ, ClusterIP ծառայություններ և Istio վիրտուալ ծառայություններ): Այս օբյեկտները ցուցադրում են հավելվածը սպասարկման ցանցին և վերահսկում են դեղձանիկի վերլուծությունը և առաջընթացը:
Ստեղծեք թեստային անվանատարածք՝ Istio Sidecar ներարկումով միացված.
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/namespaces/test.yaml
Ստեղծեք տեղակայում և պատիճ ավտոմատ մասշտաբային գործիք.
kubectl apply -f ${REPO}/artifacts/canaries/deployment.yaml
kubectl apply -f ${REPO}/artifacts/canaries/hpa.yaml
Տեղադրեք փորձնական բեռնվածության ծառայություն՝ դեղձանիկների վերլուծության ընթացքում երթևեկություն առաջացնելու համար.
helm upgrade -i flagger-loadtester flagger/loadtester
--namepace=test
Ստեղծեք սովորական դեղձանիկի ռեսուրս (փոխարինել example.com
ձեր տիրույթում):
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/"
Պահպանեք վերը նշված ռեսուրսը որպես podinfo-canary.yaml և այնուհետև կիրառեք այն.
kubectl apply -f ./podinfo-canary.yaml
Վերոնշյալ վերլուծությունը, եթե հաջողվի, կաշխատի հինգ րոպե՝ յուրաքանչյուր կես րոպեն մեկ ստուգելով HTTP չափումները: Դուք կարող եք որոշել նվազագույն ժամանակը, որն անհրաժեշտ է դեղձանիկների տեղակայումը վավերացնելու և խթանելու համար՝ օգտագործելով հետևյալ բանաձևը. interval * (maxWeight / stepWeight)
. Canary CRD դաշտերը փաստաթղթավորված են
Մի քանի վայրկյան հետո Flagger-ը կստեղծի դեղձանիկ առարկաներ.
# 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
Բացեք զննարկիչը և անցեք app.istio.example.com
, դուք պետք է տեսնեք տարբերակի համարը
Կանարների ավտոմատ վերլուծություն և առաջխաղացում
Flagger-ն իրականացնում է կառավարման օղակ, որն աստիճանաբար տեղափոխում է երթևեկությունը դեպի դեղձանիկ՝ միաժամանակ չափելով հիմնական կատարողական ցուցանիշները, ինչպիսիք են HTTP հարցումների հաջողության մակարդակը, հարցման միջին տևողությունը և պատի առողջությունը: KPI-ի վերլուծության հիման վրա դեղձանիկը խթանվում կամ ընդհատվում է, իսկ վերլուծության արդյունքները հրապարակվում են Slack-ում:
Canary-ի տեղակայումը սկսվում է, երբ փոխվում է հետևյալ օբյեկտներից մեկը.
- Տեղադրեք PodSpec (կոնտեյների պատկեր, հրաման, նավահանգիստներ, env և այլն)
- ConfigMaps-ը տեղադրվում է որպես ծավալ կամ քարտեզագրվում է շրջակա միջավայրի փոփոխականներին
- Գաղտնիքները տեղադրվում են որպես ծավալներ կամ փոխարկվում են շրջակա միջավայրի փոփոխականների
Գործարկեք canary deploy-ը կոնտեյների պատկերը թարմացնելիս.
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
Flagger-ը հայտնաբերում է, որ տեղակայման տարբերակը փոխվել է և սկսում է վերլուծել այն.
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
Վերլուծության ընթացքում դեղձանիկի արդյունքները կարելի է հետևել Grafana-ի միջոցով.
Խնդրում ենք նկատի ունենալ, որ եթե դեղձանիկների վերլուծության ընթացքում տեղակայման համար նոր փոփոխություններ կիրառվեն, ապա Flagger-ը կվերսկսի վերլուծության փուլը:
Կազմեք ձեր կլաստերի բոլոր դեղձանիկների ցուցակը.
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
Եթե միացրել եք Slack ծանուցումները, դուք կստանաք հետևյալ հաղորդագրությունները.
Ավտոմատ հետ վերադարձ
Կանարյան վերլուծության ընթացքում դուք կարող եք առաջացնել սինթետիկ HTTP 500 սխալներ և բարձր արձագանքման ուշացում՝ տեսնելու, թե արդյոք Flagger-ը կդադարեցնի տեղակայումը:
Ստեղծեք թեստային պատիճ և դրանում կատարեք հետևյալը.
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
HTTP 500 սխալների առաջացում.
watch curl http://podinfo-canary:9898/status/500
Հետաձգման առաջացում.
watch curl http://podinfo-canary:9898/delay/1
Երբ ձախողված ստուգումների թիվը հասնում է շեմին, երթևեկությունը վերադարձվում է դեպի առաջնային ալիք, դեղձանիկը չափվում է մինչև զրոյի, և տեղակայումը նշվում է որպես ձախողված:
Կանարյան սխալները և հետաձգման գագաթնակետերը գրանցվում են որպես Kubernetes իրադարձություններ և գրանցվում են Flagger-ի կողմից 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
Եթե դուք միացրել եք Slack-ի ծանուցումները, դուք կստանաք հաղորդագրություն, երբ վերջնաժամկետը գերազանցվի կամ վերլուծության մեջ չհաջողված ստուգումների առավելագույն թիվը հասնի.
Վերջում
Istio-ի նման սպասարկման ցանցի գործարկումը, բացի Kubernetes-ից, կապահովի ավտոմատ չափումներ, տեղեկամատյաններ և արձանագրություններ, սակայն ծանրաբեռնվածության տեղակայումը դեռևս կախված է արտաքին գործիքներից: Flagger-ը նպատակ ունի փոխել սա՝ ավելացնելով Istio-ի հնարավորությունները
Flagger-ը համատեղելի է ցանկացած Kubernetes CI/CD լուծույթի հետ, և դեղձանիկի վերլուծությունը հեշտությամբ կարող է երկարաձգվել
Flagger-ն աջակցվում է
Եթե ունեք առաջարկներ՝ բարելավելու Flagger-ը, խնդրում ենք ներկայացնել խնդիր կամ PR GitHub հասցեով
Շնորհակալություն
Source: www.habr.com