1. खास जानकारी
लैब के पहले हिस्से में, आपने ASP.NET Core ऐप्लिकेशन बनाया था. साथ ही, उसे कंटेनर में रखा था और Google Kubernetes Engine (GKE) पर डिप्लॉय किया था. इसके अलावा, आपने Istio की मदद से, इसके ट्रैफ़िक को मैनेज करने के लिए कॉन्फ़िगर किया था.
लैब के इस दूसरे हिस्से में यह मान लिया गया है कि आपके पास पहले से ही Kubernetes क्लस्टर और पहले लैब से ऐप्लिकेशन चल रहा है. आपको पता चलेगा कि Istio, कोड में कम से कम बदलाव करके आपकी सेवाओं को मैनेज करने, उनकी निगरानी करने, और उन्हें सुरक्षित रखने में कैसे मदद कर सकता है. खास तौर पर, Istio की सुविधाओं के बारे में जानें. जैसे, मेट्रिक, ट्रेसिंग, सेवा विज़ुअलाइज़ेशन, डाइनैमिक ट्रैफ़िक मैनेजमेंट, फ़ॉल्ट इंजेक्शन वगैरह.
आपको क्या सीखने को मिलेगा
- Prometheus की मदद से मेट्रिक के बारे में क्वेरी करने का तरीका.
- Grafana की मदद से मेट्रिक को विज़ुअलाइज़ करने का तरीका.
- अपनी सेवा का नया वर्शन बनाने का तरीका.
- किसी सेवा को किसी खास वर्शन पर पिन करने का तरीका.
- अलग-अलग वर्शन के बीच ट्रैफ़िक को कैसे बांटा जाता है.
- सेवा से जुड़े कॉल में गड़बड़ियां कैसे डाली जाती हैं.
आपको किन चीज़ों की ज़रूरत होगी
इस ट्यूटोरियल का इस्तेमाल कैसे किया जाएगा?
Google Cloud Platform इस्तेमाल करने के अपने अनुभव को आप क्या रेटिंग देंगे?
2. सेटअप और ज़रूरी शर्तें
अपने हिसाब से एनवायरमेंट सेट अप करना
- Cloud Console में साइन इन करें. इसके बाद, नया प्रोजेक्ट बनाएं या किसी मौजूदा प्रोजेक्ट का फिर से इस्तेमाल करें. (अगर आपके पास पहले से Gmail या G Suite खाता नहीं है, तो आपको एक खाता बनाना होगा.)
प्रोजेक्ट आईडी याद रखें. यह सभी Google Cloud प्रोजेक्ट के लिए एक यूनीक नाम होता है. ऊपर दिया गया नाम पहले ही इस्तेमाल किया जा चुका है. इसलिए, यह आपके लिए काम नहीं करेगा. माफ़ करें! इस कोड लैब में इसे बाद में PROJECT_ID के तौर पर दिखाया जाएगा.
- इसके बाद, Google Cloud संसाधनों का इस्तेमाल करने के लिए, आपको Cloud Console में बिलिंग चालू करनी होगी.
इस कोडलैब को पूरा करने में ज़्यादा खर्च नहीं आएगा. "सफ़ाई करना" सेक्शन में दिए गए निर्देशों का पालन करना न भूलें. इसमें बताया गया है कि संसाधनों को कैसे बंद किया जाए, ताकि इस ट्यूटोरियल के बाद आपको बिलिंग न करनी पड़े. Google Cloud के नए उपयोगकर्ता, मुफ़्त में आज़माने के लिए 300 डॉलर के प्रोग्राम में शामिल हो सकते हैं.
Cloud Shell शुरू करें
Google Cloud को अपने लैपटॉप से रिमोटली ऐक्सेस किया जा सकता है. हालांकि, इस कोडलैब में Google Cloud Shell का इस्तेमाल किया जाता है. यह Google Cloud में चलने वाला कमांड लाइन एनवायरमेंट है.
Cloud Shell चालू करें
- Cloud Console में, Cloud Shell चालू करें
पर क्लिक करें.
अगर आपने पहले कभी Cloud Shell का इस्तेमाल नहीं किया है, तो आपको एक इंटरमीडिएट स्क्रीन दिखेगी. इसमें Cloud Shell के बारे में जानकारी दी गई होगी. अगर ऐसा होता है, तो जारी रखें पर क्लिक करें. इसके बाद, आपको यह स्क्रीन कभी नहीं दिखेगी. एक बार दिखने वाली स्क्रीन ऐसी दिखती है:
Cloud Shell से कनेक्ट होने में कुछ ही सेकंड लगेंगे.
इस वर्चुअल मशीन में, डेवलपमेंट के लिए ज़रूरी सभी टूल पहले से मौजूद हैं. यह 5 जीबी की होम डायरेक्ट्री उपलब्ध कराता है और Google Cloud में चलता है. इससे नेटवर्क की परफ़ॉर्मेंस और पुष्टि करने की प्रोसेस बेहतर होती है. इस कोडलैब में ज़्यादातर काम, सिर्फ़ ब्राउज़र या Chromebook की मदद से किया जा सकता है.
Cloud Shell से कनेक्ट होने के बाद, आपको दिखेगा कि आपकी पुष्टि पहले ही हो चुकी है और प्रोजेक्ट को आपके प्रोजेक्ट आईडी पर पहले ही सेट कर दिया गया है.
- पुष्टि करें कि आपने Cloud Shell में पुष्टि कर ली है. इसके लिए, यह कमांड चलाएं:
gcloud auth list
कमांड आउटपुट
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
कमांड आउटपुट
[core] project = <PROJECT_ID>
अगर ऐसा नहीं है, तो इस कमांड का इस्तेमाल करके इसे सेट किया जा सकता है:
gcloud config set project <PROJECT_ID>
कमांड आउटपुट
Updated property [core/project].
3. ऐप्लिकेशन को टेस्ट करना
लैब शुरू करने से पहले, पक्का करें कि ऐप्लिकेशन अब भी पिछले लैब से काम कर रहा हो. याद रखें कि आपको गेटवे का बाहरी आईपी और पोर्ट इस तरह दिखता है. ये EXTERNAL-IP में शामिल होते हैं:
kubectl get svc istio-ingressgateway -n istio-system
ऐप्लिकेशन देखने के लिए, अपना ब्राउज़र खोलें और http://<gatewayurl> पर जाएं:

अगर आपको ऐप्लिकेशन नहीं दिख रहा है, तो पिछले लैब पर वापस जाएं. इससे यह पक्का किया जा सकेगा कि आपने सभी चरणों का पालन किया हो. साथ ही, यह भी पक्का किया जा सकेगा कि ऐप्लिकेशन और Istio, दोनों इंस्टॉल हो गए हों और सही तरीके से काम कर रहे हों.
इस समय, आपको लग सकता है कि "Istio का क्या फ़ायदा है?". Istio को अपने ऐप्लिकेशन के ट्रैफ़िक को मैनेज करने की अनुमति देने पर, आपको कई सुविधाएं मिलती हैं. जैसे, मेट्रिक, ट्रेसिंग, डाइनैमिक ट्रैफ़िक मैनेजमेंट, सेवा विज़ुअलाइज़ेशन, फ़ॉल्ट इंजेक्शन वगैरह. इन सुविधाओं के लिए, आपको कोई शुल्क नहीं देना पड़ता.
अगले चरण में, मेट्रिक एक्सप्लोर करना शुरू करें.
4. Grafana और Prometheus के साथ मेट्रिक
डिफ़ॉल्ट रूप से, Istio कुछ मेट्रिक जनरेट करता है. इन डिफ़ॉल्ट मेट्रिक को क्वेरी करने और विज़ुअलाइज़ करने के लिए, ऐड-ऑन का इस्तेमाल किया जा सकता है.
Prometheus
Prometheus, ओपन सोर्स मॉनिटरिंग टूल है. Istio से जनरेट की गई मेट्रिक के लिए क्वेरी करने के लिए, Prometheus का इस्तेमाल किया जा सकता है. हालांकि, इसके लिए आपको पहले Prometheus ऐड-ऑन इंस्टॉल करना होगा.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
पुष्टि करें कि Prometheus चल रहा है:
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
http://<gatewayurl> पर कुछ बार जाकर या कर्ल कमांड चलाकर, ऐप्लिकेशन पर कुछ ट्रैफ़िक भेजें.
Prometheus यूज़र इंटरफ़ेस (यूआई) के लिए पोर्ट फ़ॉरवर्डिंग सेटअप करें:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
अब क्वेरी को चलाने के लिए, Cloud Shell के सबसे ऊपर दाएं कोने में मौजूद वेब प्रीव्यू बटन पर क्लिक करें. इसके बाद, पोर्ट 8080 पर झलक देखें पर क्लिक करें:

आपको नए टैब में Prometheus का यूज़र इंटरफ़ेस (यूआई) दिखेगा:

Prometheus के बारे में ज़्यादा जानने के लिए, Prometheus की मदद से मेट्रिक के लिए क्वेरी करना लेख पढ़ें.
Grafana
Grafana, मेट्रिक को विज़ुअलाइज़ करने के लिए एक और ऐड-ऑन है.
Grafana इंस्टॉल करें. istio-version को Istio के मौजूदा वर्शन से बदलें. उदाहरण के लिए, 1.0.3-gke.3:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
पुष्टि करें कि Grafana चल रहा है या नहीं:
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
http://<gatewayurl> पर कुछ बार जाकर या कर्ल कमांड चलाकर, ऐप्लिकेशन पर कुछ ट्रैफ़िक भेजें.
Grafana के यूज़र इंटरफ़ेस (यूआई) के लिए पोर्ट फ़ॉरवर्डिंग सेट अप करें:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
वेब प्रीव्यू पर जाकर, Grafana डैशबोर्ड देखे जा सकते हैं:


Grafana के बारे में ज़्यादा जानने के लिए, Grafana की मदद से मेट्रिक को विज़ुअलाइज़ करना लेख पढ़ें.
5. ऐप्लिकेशन का नया वर्शन बनाना
किसी समय, प्रोडक्शन में डिप्लॉय किए गए ऐप्लिकेशन में गड़बड़ियां ठीक करने या अतिरिक्त सुविधाएं जोड़ने की ज़रूरत होगी. आइए, देखते हैं कि यह प्रोसेस कैसी दिखती है.
सबसे पहले, ऐप्लिकेशन में बदलाव करते हैं. Cloud Shell से कोड एडिटर खोलें.
HelloWorldAspNetCore > Views > Home में जाकर Index.cshtml पर जाएं और कैरसेल के किसी एक मैसेज को अपडेट करें.
यह लाइन ढूंढें:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
इसे बदलकर यह कर दो:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
बदलावों को सेव करें. इसके बाद, Cloud Shell पर वापस जाएं. HelloWorldAspNetCore,के अंदर, डॉकर इमेज बनाएं:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
इसके बाद, इसे Container Registry में पुश करें:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
कंटेनर इमेज को पुश करने के बाद, अगले चरण में नया वर्शन डिप्लॉय किया जा सकता है.
6. नया डिप्लॉयमेंट बनाएं
नए वर्शन को डिप्लॉय करने के लिए, आपको पहले Kubernetes में उसके लिए एक नया डिप्लॉयमेंट बनाना होगा. aspnetcore.yaml फ़ाइल के आखिर में यह जोड़ें:
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: aspnetcore-v2
spec:
replicas: 1
selector:
matchLabels:
app: aspnetcore
version: v2
template:
metadata:
labels:
app: aspnetcore
version: v2
spec:
containers:
- name: aspnetcore
image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
kubectl की मदद से, नए वर्शन को डिफ़ॉल्ट नेमस्पेस में डिप्लॉय करें:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
पुष्टि करें कि ज़रूरी पॉड चल रहे हैं:
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
अब ऐप्लिकेशन को फिर से टेस्ट करें. गेटवे का बाहरी आईपी पता पाएं:
kubectl get svc istio-ingressgateway -n istio-system
यह EXTERNAL-IP के तहत दिखता है. गुप्त ब्राउज़र खोलें और http://<replace-with-external-ip> पर जाएं
रीफ़्रेश करने पर, कभी-कभी आपको यह मैसेज दिखेगा: "ASP.NET Core की मदद से वेब ऐप्लिकेशन बनाने के बारे में जानें":

अन्य मामलों में, आपको यह मैसेज दिखेगा: "Google Cloud पर ASP.NET Core का इस्तेमाल करके वेब ऐप्लिकेशन बनाने के बारे में जानें":

ऐसा इसलिए है, क्योंकि v1 और v2, दोनों डिप्लॉयमेंट एक ही Kubernetes सेवा (aspnetcore-service) के पीछे मौजूद हैं. साथ ही, पिछले लैब (aspnetcore-virtualservice) में बनाए गए VirtualService में, उस सेवा का इस्तेमाल होस्ट के तौर पर किया जाता है.
अगले चरण में, DestinationRule का इस्तेमाल करके, सेवा को v2 डिप्लॉयमेंट पर पिन किया जाता है.
7. अपनी सेवा को नए वर्शन पर पिन करना
इस चरण में, आपको अपनी सेवा को पिन करना होगा, ताकि v2 डिप्लॉयमेंट का इस्तेमाल किया जा सके. इसके लिए, DestinationRule का इस्तेमाल किया जा सकता है. DestinationRule, नीतियों के उस सेट को कॉन्फ़िगर करता है जिसे VirtualService की राउटिंग की कार्रवाई के बाद, किसी अनुरोध पर लागू किया जाना है.
DestinationRule, डेस्टिनेशन होस्ट के ऐसे सबसेट भी तय करता है जिन्हें ऐक्सेस किया जा सकता है. इसका मतलब है कि ये डेस्टिनेशन होस्ट के नाम वाले वर्शन होते हैं. इन सबसेट का इस्तेमाल, VirtualService के रूट स्पेसिफ़िकेशन में किया जाता है. ऐसा तब किया जाता है, जब सेवा के किसी खास वर्शन पर ट्रैफ़िक भेजा जाता है.
aspnetcore-destinationrule.yaml नाम की नई फ़ाइल बनाएं:
apiVersion: networking.istio.io/v1alpha3
kind: DestinationRule
metadata:
name: aspnetcore-destinationrule
spec:
host: aspnetcore-service
trafficPolicy:
tls:
mode: ISTIO_MUTUAL
subsets:
- name: v1
labels:
version: v1
- name: v2
labels:
version: v2
इसके बाद, DestinationRule बनाएं. इससे दो सबसेट (v1 और v2) बनते हैं, जिनका इस्तेमाल VirtualService से किया जा सकता है:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
अब aspnetcore-virtualservice.yaml फ़ाइल पर वापस जाएं, ताकि v2 सबसेट का इस्तेमाल करने के लिए VirtualService को अपडेट किया जा सके:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v2
VirtualService को अपडेट करें:
kubectl apply -f aspnetcore-virtualservice.yaml
अपना ब्राउज़र खोलें और http://<replace-with-external-ip>. पर जाएं. कई बार रीफ़्रेश करने के बाद भी, आपको यह मैसेज दिखेगा: "Google Cloud पर ASP.NET Core का इस्तेमाल करके वेब ऐप्लिकेशन बनाने के बारे में जानें":

8. वर्शन के बीच ट्रैफ़िक को बांटना
कभी-कभी, आपको टेस्टिंग के लिए वर्शन के बीच ट्रैफ़िक बांटना पड़ सकता है. उदाहरण के लिए, हो सकता है कि आपको सेवा के v1 वर्शन पर 75% और v2 वर्शन पर 25% ट्रैफ़िक भेजना हो. Istio की मदद से, इसे आसानी से हासिल किया जा सकता है. अलग-अलग वेटेज वाले दो सबसेट के बारे में जानने के लिए, नई aspnetcore-virtualservice-weights.yaml फ़ाइल बनाएं:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- route:
- destination:
host: aspnetcore-service
subset: v1
weight: 75
- destination:
host: aspnetcore-service
subset: v2
weight: 25
VirtualService को अपडेट करें:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
अब ब्राउज़र को रीफ़्रेश करने पर, आपको v1 और v2 वर्शन, करीब 3:1 के अनुपात में दिखेंगे.
ज़्यादा जानने के लिए, Istio में ट्रैफ़िक स्प्लिटिंग लेख पढ़ें.
9. गड़बड़ियां इंजेक्ट करना
टेस्टिंग के लिए, एक और ज़रूरी डेवलपमेंट टास्क यह है कि ट्रैफ़िक में गड़बड़ियां या देरी की जाए. इसके बाद, यह देखा जाए कि सेवाएं कैसे काम करती हैं.
उदाहरण के लिए, हो सकता है कि आपको v1 वर्शन पर आने वाले 50% ट्रैफ़िक के लिए, अमान्य अनुरोध (एचटीटीपी 400) वाला जवाब दिखाना हो. यहां दिए गए स्ट्रक्चर के हिसाब से aspnetcore-virtualservice-fault-abort.yaml फ़ाइल बनाएं:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
abort:
percentage:
value: 50
httpStatus: 400
route:
- destination:
host: aspnetcore-service
subset: v1
VirtualService को अपडेट करें:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
अब ब्राउज़र को रीफ़्रेश करने पर, आपको दिखेगा कि आधी बार v1 सेवा, एचटीटीपी 400 रिस्पॉन्स कोड दिखाती है.
इसके अलावा, हो सकता है कि आपको अनुरोधों के बीच पांच सेकंड का समय जोड़ना हो. यहां दिए गए स्ट्रक्चर के हिसाब से aspnetcore-virtualservice-fault-delay.yaml फ़ाइल बनाएं:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: aspnetcore-virtualservice
spec:
hosts:
- "*"
gateways:
- aspnetcore-gateway
http:
- fault:
delay:
fixedDelay: 5s
percentage:
value: 100
route:
- destination:
host: aspnetcore-service
subset: v1
VirtualService को अपडेट करें:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
अब ब्राउज़र को रीफ़्रेश करने पर, आपको दिखेगा कि अनुरोधों में पांच सेकंड की देरी हो रही है.
टाइमआउट, फिर से कोशिश करना, शर्त के हिसाब से नियम, सर्किट ब्रेकर वगैरह जैसी Istio की सुविधाओं के बारे में ज़्यादा जानने के लिए, ट्रैफ़िक मैनेजमेंट की सुविधाएं देखें.
10. बधाई हो!
हमें उम्मीद है कि इस लैब से आपको यह समझने में मदद मिली होगी कि Istio, आपकी सेवाओं के लिए क्या-क्या कर सकता है. Istio और GKE के बारे में ज़्यादा जानने के लिए.
अगले चरण
- Istio के बारे में ज़्यादा जानें.
- Kubernetes के बारे में ज़्यादा जानें.
- Google Kubernetes Engine के बारे में ज़्यादा जानें.
- Google Cloud Platform पर.NET के बारे में ज़्यादा जानें.
लाइसेंस
इस काम के लिए, Creative Commons एट्रिब्यूशन 2.0 जेनेरिक लाइसेंस के तहत लाइसेंस मिला है.
11. साफ़-सफ़ाई सेवा
ऐप्लिकेशन को मिटाया जा सकता है और Istio को अनइंस्टॉल किया जा सकता है. इसके अलावा, Kubernetes क्लस्टर को भी मिटाया जा सकता है.
ऐप्लिकेशन मिटाना
ऐप्लिकेशन मिटाने के लिए:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
यह पुष्टि करने के लिए कि ऐप्लिकेशन हट गया है:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
Istio को अनइंस्टॉल करना
Istio को मिटाने के लिए:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
यह पुष्टि करने के लिए कि Istio हटा दिया गया है:
kubectl get pods -n istio-system
Kubernetes क्लस्टर मिटाना
gcloud container clusters delete hello-dotnet-cluster