ሲዲ እንደ ኢንተርፕራይዝ የሶፍትዌር አሠራር እውቅና ያገኘ እና የተመሰረቱ የ CI መርሆዎች የተፈጥሮ ዝግመተ ለውጥ ውጤት ነው። ነገር ግን፣ ሲዲ አሁንም በጣም አልፎ አልፎ ነው፣ ምናልባትም በአስተዳደሩ ውስብስብነት እና ያልተሳኩ የስርዓተ-ፆታ አቅርቦት ላይ ተጽእኖ ስለሚያሳድር።
ከታች በGoogle Kubernetes Engine (GKE) ላይ ባንዲራ ለማቀናበር እና ለመጠቀም የደረጃ በደረጃ መመሪያ አለ።
የኩበርኔትስ ክላስተር በማዘጋጀት ላይ
የGKE ክላስተርን በIstio add-on በመፍጠር ይጀምራሉ (የጂሲፒ መለያ ከሌለዎት መመዝገብ ይችላሉ)
ወደ ጎግል ክላውድ ግባ፣ ፕሮጀክት ፍጠር እና ክፍያ መጠየቂያን አንቃ። የትእዛዝ መስመር መገልገያውን ይጫኑ 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 add-ons ጋር ስብስብ ይፍጠሩ፡
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
ከላይ ያለው ትዕዛዝ ሁለት ቪኤምዎችን ጨምሮ ነባሪ የመስቀለኛ ገንዳ ይፈጥራል n1-standard-2
(vCPU፡ 2፣ RAM 7,5GB፣ ዲስክ፡ 30 ጊባ)። በሐሳብ ደረጃ፣ የኢስቲዮ ክፍሎችን ከሥራ ጫናዎ ማግለል አለቦት፣ ነገር ግን ኢስቲዮ ፖድስን በተዘጋጀ የአንጓዎች ገንዳ ውስጥ ለማስኬድ ቀላል መንገድ የለም። የኢስቲዮ መገለጫዎች ተነባቢ-ብቻ ተደርገው ይወሰዳሉ እና 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 አሁን ደግሞ ለ
ለቲለር የአገልግሎት መለያ እና የክላስተር ሚና ትስስር ይፍጠሩ፡
kubectl -n kube-system create sa tiller &&
kubectl create clusterrolebinding tiller-cluster-rule
--clusterrole=cluster-admin
--serviceaccount=kube-system:tiller
ቲለርን በስም ቦታ ዘርጋ kube-system
:
helm init --service-account tiller
በ Helm እና Tiller መካከል SSL መጠቀም ያስቡበት። የእርስዎን Helm ጭነት ስለመጠበቅ የበለጠ መረጃ ለማግኘት ይመልከቱ
ቅንብሮችን ያረጋግጡ፡
kubectl -n istio-system get svc
ከጥቂት ሰከንዶች በኋላ GCP ለአገልግሎቱ ውጫዊ አይፒ አድራሻ መመደብ አለበት። istio-ingressgateway
.
የኢስቲዮ መግቢያ መግቢያ በርን በማዋቀር ላይ
ከስም ጋር የማይለዋወጥ የአይፒ አድራሻ ይፍጠሩ 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
አሁን የበይነመረብ ጎራ እና የዲ ኤን ኤስ መዝጋቢዎን መድረስ ያስፈልግዎታል። ሁለት የ A መዛግብትን አክል (ተካ example.com
ወደ የእርስዎ ጎራ):
istio.example.com A ${GATEWAY_IP}
*.istio.example.com A ${GATEWAY_IP}
የዲ ኤን ኤስ ዱር ካርድ እየሰራ መሆኑን ያረጋግጡ፡-
watch host test.istio.example.com
በኤችቲቲፒ ላይ ከአገልግሎት መስጫው ውጭ አገልግሎቶችን ለማቅረብ አጠቃላይ የኢስቲዮ መግቢያ በር ይፍጠሩ፡
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
ምንም አይነት የምርት ስርዓት ኤስኤስኤል ሳይኖር በኢንተርኔት ላይ አገልግሎት መስጠት የለበትም። የኢስቲዮ መግቢያ መግቢያ በርን በሰርት-አቀናባሪ፣ CloudDNS እና እንመሰጥር ዘንድ፣ እባክዎ ያንብቡ
ባንዲራ መጫን
የGKE ኢስቲዮ ማከያ የኢስቲዮ ቴሌሜትሪ አገልግሎትን የሚያጸዳ የፕሮሜቲየስ ምሳሌን አያካትትም። ፍላገር የካናሪ ትንታኔን ለመስራት የIstio HTTP መለኪያዎችን ስለሚጠቀም፣ ከኦፊሴላዊው የኢስቲዮ ሄልም እቅድ ጋር ተመሳሳይ የሆነውን የፕሮሜቲየስ ውቅር ማሰማራት አለቦት።
REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master
kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml
የባንዲራ Helm ማከማቻ አክል፡
helm repo add flagger [https://flagger.app](https://flagger.app/)
ጠቋሚውን ወደ ስም ቦታ ዘርጋ 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
በፖርት 9090 ላይ ካለው የኢስቲዮ ፕሮሜቴየስ አገልግሎት ጋር መገናኘት እስከቻለ ድረስ ባንዲራ በማንኛውም የስም ቦታ መጫን ይችላሉ።
ፍላገር ለካናሪ ትንታኔ የግራፋና ዳሽቦርድ አለው። በስም ቦታ ላይ 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
ምናባዊ አገልግሎት በመፍጠር ግራፋናን በክፍት መግቢያ በር አጋልጥ (ተካ 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
በአሳሹ ውስጥ ወደ ግራፋና መግቢያ ገጽ መምራት አለብዎት።
ከፍላገር ጋር የድር መተግበሪያዎችን በማሰማራት ላይ
ባንዲራ ኩበርኔትስን ያሰማራ እና እንደ አማራጭ በራስ-ሰር (HPA) ያወጣል፣ ከዚያም ተከታታይ ነገሮችን ይፈጥራል (የኩበርኔትስ ማሰማራት፣ ክላስተርአይፒ አገልግሎቶች እና የኢስቲዮ ምናባዊ አገልግሎቶች)። እነዚህ ነገሮች መተግበሪያውን ለአገልግሎት መረብ ያጋልጣሉ እና የካናሪ ትንተና እና ግስጋሴን ይቆጣጠሩ።
በ 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
ከላይ ያለው ትንታኔ፣ ከተሳካ፣ በየግማሽ ደቂቃው የኤችቲቲፒ ሜትሪክስን በመፈተሽ ለአምስት ደቂቃዎች ይሰራል። የሚከተለውን ቀመር በመጠቀም የካናሪ ማሰማራትን ለማረጋገጥ እና ለማስተዋወቅ የሚያስፈልገውን አነስተኛ ጊዜ መወሰን ይችላሉ። interval * (maxWeight / stepWeight)
. የካናሪ ሲአርዲ መስኮች ተመዝግበዋል።
ከጥቂት ሰከንዶች በኋላ ባንዲራ የካናሪ ነገሮችን ይፈጥራል፡-
# 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
, የስሪት ቁጥሩን ማየት አለብዎት
ራስ-ሰር የካናሪ ትንታኔ እና ማስተዋወቅ
ፍላገር እንደ HTTP ጥያቄ የስኬት መጠን፣ አማካይ የጥያቄ ቆይታ እና የፖድ ጤና ያሉ ቁልፍ የአፈጻጸም መለኪያዎችን እየለካ ትራፊክን ቀስ በቀስ ወደ ካናሪ የሚያንቀሳቅስ የቁጥጥር ዑደትን ይተገብራል። በ KPI ትንተና ላይ በመመስረት, ካናሪ ይስፋፋል ወይም ይቋረጣል, እና የትንታኔው ውጤት ለ Slack ታትሟል.
የካናሪ ማሰማራት የሚቀሰቀሰው ከሚከተሉት ነገሮች ውስጥ አንዱ ሲቀየር ነው።
- PodSpec (የመያዣ ምስል፣ ትዕዛዝ፣ ወደቦች፣ env፣ ወዘተ) አሰማር።
- ConfigMaps እንደ ጥራዞች ተጭነዋል ወይም ወደ አካባቢ ተለዋዋጮች ተቀርፀዋል።
- ሚስጥሮች እንደ ጥራዝ ተጭነዋል ወይም ወደ አካባቢ ተለዋዋጮች ይለወጣሉ።
የመያዣ ምስልን በሚያዘምኑበት ጊዜ የካናሪ ማሰማራትን ያሂዱ፡-
kubectl -n test set image deployment/podinfo
podinfod=quay.io/stefanprodan/podinfo:1.4.1
ባንዲራ የማሰማራቱ ሥሪት መቀየሩን አውቆ መተንተን ይጀምራል፡-
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 ስህተቶችን እና ከፍተኛ ምላሽ መዘግየትን መፍጠር ይችላሉ።
የሙከራ ፓድ ይፍጠሩ እና በውስጡ የሚከተሉትን ያድርጉ
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 ክስተቶች ተመዝግበው በJSON ቅርጸት በ Flagger ገብተዋል፡
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 CI/CD መፍትሄ ጋር ተኳሃኝ ነው፣ እና የካናሪ ትንታኔ በቀላል ሊራዘም ይችላል።
ባንዲራ ይደገፋል
Flaggerን ለማሻሻል ጥቆማዎች ካሉዎት፣ እባክዎን ችግር ወይም PR በ GitHub ላይ ያስገቡ
Спасибо
ምንጭ: hab.com