फ्लैगर और इस्तियो के साथ स्वचालित कैनरी की तैनाती


सीडी को उद्यम सॉफ्टवेयर विकास अभ्यास के रूप में मान्यता प्राप्त है, यह स्थापित सीआई सिद्धांतों के प्राकृतिक विकास का परिणाम है। हालांकि, सीडी अभी भी एक दुर्लभ घटना है, संभवतः प्रबंधन की जटिलता और असफल तैनाती के डर से जो उपलब्धता को प्रभावित करते हैं।


फ्लैगर एक खुला स्रोत कुबेरनेट्स ऑपरेटर है जिसका उद्देश्य भ्रमित संबंधों को खत्म करना है। यह प्रबंधित रोलआउट के दौरान एप्लिकेशन व्यवहार का विश्लेषण करने के लिए इस्तियो ट्रैफ़िक ऑफ़सेट और प्रोमेथियस मेट्रिक्स का उपयोग करके कैनरी तैनाती को बढ़ावा देता है।


नीचे Google Kubernetes Engine (GKE) में फ्लैगर को कॉन्फ़िगर और उपयोग करने के तरीके के बारे में चरण-दर-चरण मार्गदर्शिका दी गई है।


Kubernetes क्लस्टर कॉन्फ़िगर करें


आप एक इस्तियो ऐड-इन (यदि आपके पास जीसीपी खाता नहीं है, तो आप मुफ्त क्रेडिट प्राप्त करने के लिए यहां पंजीकरण कर सकते हैं) के साथ एक जीकेआर क्लस्टर बनाकर शुरू करते हैं।


Google क्लाउड में लॉग इन करें, एक प्रोजेक्ट बनाएं और इसके लिए बिलिंग सक्षम करें। 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 ऐड-ऑन के साथ एक क्लस्टर बनाएं:


 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 

उपरोक्त कमांड एक डिफ़ॉल्ट नोड पूल बनाएगा जिसमें दो VMs n1-standard-2 (vCPU: 2, RAM 7.5 GB, डिस्क: 30 GB) शामिल हैं। आदर्श रूप से, आपको अपने कार्यभार से Istio घटकों को अलग करना चाहिए, लेकिन समर्पित नोड पूल में Istio पॉड्स को चलाने का कोई आसान तरीका नहीं है। इस्तियो मेनिफेस्टों को केवल-पढ़ने के लिए माना जाता है, और जीकेई किसी भी बदलाव को पूर्ववत कर देगा, जैसे कि नोड के लिए बाध्य करना या चूल्हा से डिस्कनेक्ट करना।


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 

आपको हेल्म और टिलर के बीच एसएसएल का उपयोग करने पर विचार करना चाहिए। हेल्म इंस्टॉलेशन हासिल करने के बारे में अधिक जानकारी के लिए, डॉक्स


सेटिंग्स की पुष्टि करें:


 kubectl -n istio-system get svc 

कुछ सेकंड के बाद, GCP को istio-ingressgateway लिए एक बाहरी IP पता असाइन करना चाहिए।


इस्तियो इनपुट गेटवे सेटअप


istio-gateway के आईपी पते का उपयोग करके istio-gateway नामक एक स्थिर 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 

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 

एसएसएल के बिना किसी भी उत्पादन प्रणाली को इंटरनेट पर सेवाएं नहीं देनी चाहिए। प्रमाणित प्रबंधक, CloudDNS और लेट्स एनक्रिप्ट के साथ Istio गेटवे की सुरक्षा के लिए, कृपया फ्लैगर GKE प्रलेखन पढ़ें।


ध्वज स्थापना


GKE Istio ऐड-इन में Prometheus उदाहरण शामिल नहीं है, जो Istio टेलीमेट्री सेवा को साफ़ करता है। चूँकि फ्लैगर कैनरी विश्लेषण करने के लिए इस्तियो HTTP मेट्रिक्स का उपयोग करता है, इसलिए आपको आधिकारिक इस्तियो हेलम योजना के साथ आपूर्ति किए गए समान प्रोमेथियस कॉन्फ़िगरेशन को तैनात करने की आवश्यकता है।


 REPO=https://raw.githubusercontent.com/stefanprodan/flagger/master kubectl apply -f ${REPO}/artifacts/gke/istio-prometheus.yaml 

फ्लैगर हेल्म भंडार जोड़ें:


 helm repo add flagger https://flagger.app 

सुस्त सूचनाओं istio-system सक्षम istio-system istio -system istio-system में फ्लैगर का विस्तार करें:


 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 जाते हैं, तो आपको Grafana लॉगिन पृष्ठ पर निर्देशित किया जाना चाहिए।


फ्लैगर के साथ वेब अनुप्रयोग परिनियोजन


फ्लैगर कुबेरनेट्स को चित्रित करता है और, यदि आवश्यक हो, क्षैतिज स्वचालित स्केलिंग (एचपीए), तो वस्तुओं की एक श्रृंखला बनाता है (कुबेरनेट्स तैनाती, क्लस्टर सेवा और इस्तियो आभासी सेवाएं)। ये ऑब्जेक्ट सेवा जाल में एप्लिकेशन खोलते हैं और कैनरी विश्लेषण और प्रचार का प्रबंधन करते हैं।



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) । कैनरी CRD फ़ील्ड यहाँ प्रलेखित हैं


कुछ सेकंड में, फ्लैगर कैनरी ऑब्जेक्ट बना देगा:


 # 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 पर app.istio.example.com , आपको डेमो एप्लिकेशन का संस्करण नंबर देखना चाहिए।


स्वचालित कैनरी विश्लेषण और संवर्धन


फ़्लैगर एक नियंत्रण लूप को लागू करता है जो धीरे-धीरे कैनरी पर जाता है, जबकि प्रमुख प्रदर्शन संकेतक मापते हैं, उदाहरण के लिए, HTTP अनुरोधों की सफलता दर, अनुरोधों की औसत अवधि और चूल्हा का प्रदर्शन। विश्लेषण के आधार पर, KPI कैनरी प्रगति या बाधित होती है, और विश्लेषण परिणाम स्लैक में प्रकाशित होते हैं।



कैनरी परिनियोजन तब शुरू होता है जब निम्न में से एक वस्तु बदलती है:


  • पॉडस्पीक (कंटेनर छवि, कमांड, पोर्ट, एनवी, आदि) तैनात करें
  • 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 

विश्लेषण के दौरान, कैनरी परिणामों को ग्राफाना का उपयोग करके ट्रैक किया जा सकता है:



कृपया ध्यान दें: यदि कैनरी विश्लेषण के दौरान तैनाती में नए परिवर्तन लागू किए जाते हैं, तो फ्लैगर विश्लेषण चरण को फिर से शुरू करेगा।


अपने क्लस्टर में सभी "कैनरी" की एक सूची बनाएं:


 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 

यदि आपने सुस्त सूचनाएं सक्षम की हैं, तो आपको निम्नलिखित संदेश प्राप्त होंगे:



ऑटो रोलबैक


कैनरी विश्लेषण के दौरान, आप सिंथेटिक 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 

जब असफल चेकों की संख्या थ्रेशोल्ड मान तक पहुँच जाती है, तो ट्रैफ़िक को प्राथमिक चैनल पर वापस भेजा जाता है, कैनरी को शून्य पर स्केल किया जाता है, और परिनियोजन को असफल के रूप में चिह्नित किया जाता है।


कैनरी त्रुटियों और देरी चोटियों को कुबेरनेट घटनाओं के रूप में लॉग किया जाता है और फ्लैगर द्वारा 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 

यदि आपने स्लैक नोटिफिकेशन को सक्षम किया है, तो आपको एक संदेश प्राप्त होगा जब समय सीमा समाप्त हो गई है या जब विश्लेषण के दौरान विफल चेक की अधिकतम संख्या पहुंच गई है:



निष्कर्ष में


कुबेरनेट्स के अलावा एक सेवा जाल, जैसे कि इस्तियो, को लॉन्च करना स्वचालित मैट्रिक्स, लॉग और प्रोटोकॉल प्रदान करेगा, लेकिन वर्कलोड की तैनाती अभी भी बाहरी उपकरणों पर निर्भर करती है। फ्लैगर इसे इस्तियो की प्रगतिशील वितरण क्षमताओं को जोड़कर इसे बदलना चाहता है।


फ्लैगर किसी भी कुबेरनेट्स सीआई / सीडी समाधान के साथ संगत है, और सिस्टम एकीकरण / स्वीकृति परीक्षण, तनाव परीक्षण या किसी अन्य उपयोगकर्ता परीक्षणों को करने के लिए वेबहूक का उपयोग करके कैनरी विश्लेषण को आसानी से बढ़ाया जा सकता है। क्योंकि फ्लैगर घोषणात्मक और कुबेरनेट घटनाओं के लिए उत्तरदायी है, इसलिए इसे गीव फ्लक्स या जेनकिंसएक्स के साथ गिट्स पाइप्स पर इस्तेमाल किया जा सकता है। यदि आप जेनकिंसएक्स का उपयोग कर रहे हैं, तो आप फ्लैक्स को जेएक्स ऐड-ऑन के साथ स्थापित कर सकते हैं।


फ्लैगर को वीवर्स द्वारा समर्थित किया गया है और वीव क्लाउड को कैनरी की तैनाती प्रदान करता है। परियोजना का परीक्षण GKE, EX और नंगे धातु पर कुबेदम के साथ किया गया है।


यदि आपके पास फ्लैगर को बेहतर बनाने के लिए कोई सुझाव है, तो कृपया एक प्रश्न या PR को GitHub को stefanprodan / flagger पर भेजें । योगदान स्वागत से अधिक है!


धन्यवाद रे त्सांग

Source: https://habr.com/ru/post/hi444808/


All Articles