ራስ-ሰር የካናሪ ማሰማራቶች ከ Flagger እና Istio ጋር

ራስ-ሰር የካናሪ ማሰማራቶች ከ Flagger እና Istio ጋር

ሲዲ እንደ ኢንተርፕራይዝ የሶፍትዌር አሠራር እውቅና ያገኘ እና የተመሰረቱ የ CI መርሆዎች የተፈጥሮ ዝግመተ ለውጥ ውጤት ነው። ነገር ግን፣ ሲዲ አሁንም በጣም አልፎ አልፎ ነው፣ ምናልባትም በአስተዳደሩ ውስብስብነት እና ያልተሳኩ የስርዓተ-ፆታ አቅርቦት ላይ ተጽእኖ ስለሚያሳድር።

ጠቋሚ ግራ የሚያጋቡ ግንኙነቶችን ለማጥፋት ያለመ የኩበርኔትስ ኦፕሬተር ክፍት ምንጭ ነው። በሚተዳደር ልቀት ወቅት የመተግበሪያ ባህሪን ለመተንተን የኢስቲዮ ትራፊክ ማካካሻ እና ፕሮሜቲየስ መለኪያዎችን በመጠቀም የካናሪ ማሰማራቶችን ማስተዋወቅ በራስ-ሰር ያደርጋል።

ከታች በGoogle Kubernetes Engine (GKE) ላይ ባንዲራ ለማቀናበር እና ለመጠቀም የደረጃ በደረጃ መመሪያ አለ።

የኩበርኔትስ ክላስተር በማዘጋጀት ላይ

የGKE ክላስተርን በIstio add-on በመፍጠር ይጀምራሉ (የጂሲፒ መለያ ከሌለዎት መመዝገብ ይችላሉ) እዚህ - ነጻ ክሬዲት ለማግኘት).

ወደ ጎግል ክላውድ ግባ፣ ፕሮጀክት ፍጠር እና ክፍያ መጠየቂያን አንቃ። የትእዛዝ መስመር መገልገያውን ይጫኑ gcloud እና ፕሮጄክትዎን በ 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 ጭነት ስለመጠበቅ የበለጠ መረጃ ለማግኘት ይመልከቱ docs.helm.sh

ቅንብሮችን ያረጋግጡ፡

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) ያወጣል፣ ከዚያም ተከታታይ ነገሮችን ይፈጥራል (የኩበርኔትስ ማሰማራት፣ ክላስተርአይፒ አገልግሎቶች እና የኢስቲዮ ምናባዊ አገልግሎቶች)። እነዚህ ነገሮች መተግበሪያውን ለአገልግሎት መረብ ያጋልጣሉ እና የካናሪ ትንተና እና ግስጋሴን ይቆጣጠሩ።

ራስ-ሰር የካናሪ ማሰማራቶች ከ Flagger እና 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

ከላይ ያለው ትንታኔ፣ ከተሳካ፣ በየግማሽ ደቂቃው የኤችቲቲፒ ሜትሪክስን በመፈተሽ ለአምስት ደቂቃዎች ይሰራል። የሚከተለውን ቀመር በመጠቀም የካናሪ ማሰማራትን ለማረጋገጥ እና ለማስተዋወቅ የሚያስፈልገውን አነስተኛ ጊዜ መወሰን ይችላሉ። 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 ታትሟል.

ራስ-ሰር የካናሪ ማሰማራቶች ከ Flagger እና Istio ጋር

የካናሪ ማሰማራት የሚቀሰቀሰው ከሚከተሉት ነገሮች ውስጥ አንዱ ሲቀየር ነው።

  • 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 እና Istio ጋር

እባክዎን ያስተውሉ በካናሪ ትንታኔ ወቅት አዲስ ለውጦች በስምሪት ላይ ከተተገበሩ 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 ማሳወቂያዎችን ካነቁ የሚከተሉትን መልዕክቶች ይደርስዎታል፡-

ራስ-ሰር የካናሪ ማሰማራቶች ከ Flagger እና Istio ጋር

ራስ-ሰር መልሶ መመለስ

በካናሪ ትንታኔ ወቅት ፍላገር ማሰማራቱን ያቆመ እንደሆነ ለማየት ሰው ሰራሽ 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 ማሳወቂያዎችን ካነቁ፣ ጊዜው ሲያልፍ ወይም በትንተናው ውስጥ ከፍተኛው ያልተሳኩ ቼኮች ቁጥር ሲደርስ መልእክት ይደርስዎታል፡-

ራስ-ሰር የካናሪ ማሰማራቶች ከ Flagger እና Istio ጋር

በማጠቃለያው

ከኩበርኔትስ በተጨማሪ እንደ ኢስቲዮ ያሉ የአገልግሎት መረቦችን ማስኬድ አውቶማቲክ መለኪያዎችን፣ ምዝግቦችን እና ፕሮቶኮሎችን ያቀርባል፣ ነገር ግን የስራ ጫና መዘርጋት አሁንም በውጫዊ መሳሪያዎች ላይ የተመሰረተ ነው። ባንዲራ የIstio ችሎታዎችን በማከል ይህንን ለመለወጥ ያለመ ነው። ተራማጅ አቅርቦት.

ባንዲራ ከማንኛውም የ Kubernetes CI/CD መፍትሄ ጋር ተኳሃኝ ነው፣ እና የካናሪ ትንታኔ በቀላል ሊራዘም ይችላል። የድር መንጠቆዎች የስርዓት ውህደት/ተቀባይነት ሙከራዎችን፣ የጭነት ሙከራዎችን ወይም ሌላ ማንኛውንም ብጁ ፍተሻዎችን ለማከናወን። ባንዲራ ገላጭ እና ለኩበርኔትስ ዝግጅቶች ምላሽ ስለሚሰጥ በጂትኦፕስ ቧንቧዎች ውስጥ አብሮ መጠቀም ይቻላል Weave Flux ወይም ጄንኪንስክስ. JenkinsX እየተጠቀሙ ከሆነ Flaggerን ከ jx addons ጋር መጫን ይችላሉ።

ባንዲራ ይደገፋል የሽመና ስራዎች እና የካናሪ ማሰማራቶችን ያቀርባል ክላውድ ሽመና. ፕሮጀክቱ በGKE፣ EKS እና በባዶ ብረት በኩቤድም እየተሞከረ ነው።

Flaggerን ለማሻሻል ጥቆማዎች ካሉዎት፣ እባክዎን ችግር ወይም PR በ GitHub ላይ ያስገቡ stefanprodan / ባንዲራ. አስተዋጽዖዎች እንኳን ደህና መጣችሁ!

Спасибо ሬይ ታንግ.

ምንጭ: hab.com

አስተያየት ያክሉ