Google Kubernetes Engine में .NET Core ऐप्लिकेशन डिप्लॉय और अपडेट करें

1. खास जानकारी

Microsoft .NET Core, .NET का एक ओपन सोर्स और क्रॉस-प्लैटफ़ॉर्म वर्शन है. यह कंटेनर में मूल रूप से चल सकता है. .NET Core, GitHub पर उपलब्ध है. इसे Microsoft और .NET समुदाय मैनेज करते हैं. यह लैब Google Kubernetes Engine (GKE) में कंटेनर वाला .NET Core ऐप्लिकेशन डिप्लॉय करता है.

यह लैब आम तौर पर, डेवलपमेंट के पैटर्न का पालन करता है. इसमें ऐप्लिकेशन को डेवलपर के लोकल एनवायरमेंट में डेवलप किया जाता है और उसके बाद प्रोडक्शन में डिप्लॉय किया जाता है. लैब के पहले हिस्से में, Cloud Shell में चलने वाले कंटेनर का इस्तेमाल करके, .NET कोर ऐप्लिकेशन के उदाहरण की पुष्टि की जाती है. पुष्टि होने के बाद, ऐप्लिकेशन को GKE (जीकेई) का इस्तेमाल करके Kubernetes पर डिप्लॉय किया जाता है. लैब में, GKE (जीकेई) क्लस्टर बनाने के तरीके शामिल होते हैं.

लैब के दूसरे भाग में, ऐप्लिकेशन में मामूली बदलाव किया जाता है, जो उस ऐप्लिकेशन इंस्टेंस को चलाने वाले कंटेनर का होस्टनेम दिखाता है. इसके बाद, अपडेट किए गए ऐप्लेट की पुष्टि क्लाउड शेल में की जाती है और नए वर्शन का इस्तेमाल करने के लिए डिप्लॉयमेंट को अपडेट किया जाता है. नीचे दिए गए उदाहरण में, इस लैब में की गई गतिविधियों का क्रम दिखाया गया है:

डेमो सीक्वेंस का डायग्राम

लागत

अगर आप इस लैब को ठीक वैसे ही चलाते हैं जैसा कि बताया गया है, तो नीचे दी गई सेवाओं के लिए सामान्य शुल्क लागू होगा

2. सेटअप और ज़रूरी शर्तें

ज़रूरी शर्तें

इस लैब को पूरा करने के लिए, Google Cloud खाता और प्रोजेक्ट होना ज़रूरी है. नया प्रोजेक्ट बनाने के बारे में ज़्यादा जानकारी के लिए, यह कोडलैब देखें.

यह लैब, Cloud Shell में चलने वाले Docker का इस्तेमाल करती है, जो Google Cloud Console के ज़रिए उपलब्ध होता है. यह gcloud और Docker जैसे कई उपयोगी टूल के साथ पहले से कॉन्फ़िगर होता है. क्लाउड शेल को ऐक्सेस करने का तरीका नीचे बताया गया है. सबसे ऊपर दाईं ओर मौजूद Cloud Shell आइकॉन पर क्लिक करके, इसे कंसोल विंडो के सबसे नीचे वाले पैनल में देखें.

Cloud Shell

GKE (जीकेई) क्लस्टर के लिए, कॉन्फ़िगरेशन के दूसरे विकल्प (ज़रूरी नहीं)

इस लैब के लिए Kubernetes क्लस्टर की ज़रूरत है. अगले सेक्शन में, आसान कॉन्फ़िगरेशन वाला GKE (जीकेई) क्लस्टर बनाया गया है. यह सेक्शन कुछ gcloud कमांड दिखाता है. ये निर्देश, GKE (जीकेई) का इस्तेमाल करके Kubernetes क्लस्टर बनाते समय, कॉन्फ़िगरेशन के वैकल्पिक विकल्प उपलब्ध कराते हैं. उदाहरण के लिए, नीचे दिए गए निर्देशों का इस्तेमाल करके अलग-अलग तरह की मशीन, ज़ोन, और जीपीयू (ऐक्सेलरेटर) की पहचान की जा सकती है.

  • इस निर्देश वाले मशीन टाइप की सूची बनाएं: gcloud compute machine-types list
  • इस निर्देश वाले जीपीयू की सूची बनाएं gcloud compute accelerator-types list
  • इस निर्देश की मदद से, कंप्यूट ज़ोन की सूची बनाएं gcloud compute zones list
  • gcloud के किसी भी निर्देश पर सहायता पाएं gcloud container clusters --help
    • उदाहरण के लिए, इससे kubernetes क्लस्टर gcloud container clusters create --help बनाने के बारे में जानकारी मिलती है

GKE (जीकेई) के लिए कॉन्फ़िगरेशन के विकल्पों की पूरी सूची देखने के लिए, यह दस्तावेज़ देखें

kubernetes क्लस्टर बनाने की तैयारी करें

Cloud Shell में, कुछ एनवायरमेंट वैरिएबल सेट करना और gcloud क्लाइंट कॉन्फ़िगर करना ज़रूरी है. ऐसा करने के लिए, नीचे दिए गए निर्देशों का पालन किया जाता है.

export PROJECT_ID=YOUR_PROJECT_ID
export DEFAULT_ZONE=us-central1-c

gcloud config set project ${PROJECT_ID}
gcloud config set compute/zone ${DEFAULT_ZONE}

GKE (जीकेई) क्लस्टर बनाएं

यह लैब, Kubernetes पर .NET Core ऐप्लिकेशन को डिप्लॉय करती है. इसलिए, क्लस्टर बनाना ज़रूरी है. GKE (जीकेई) का इस्तेमाल करके, Google क्लाउड में नया Kubernetes क्लस्टर बनाने के लिए, नीचे दिए गए निर्देश का इस्तेमाल करें.

gcloud container clusters create dotnet-cluster \
  --zone ${DEFAULT_ZONE} \
  --num-nodes=1 \
  --node-locations=${DEFAULT_ZONE},us-central1-b \
  --enable-stackdriver-kubernetes \
  --machine-type=n1-standard-1 \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --enable-ip-alias
  • --num-nodes, हर ज़ोन में जोड़ने के लिए नोड की संख्या है और इसे बाद में बढ़ाया जा सकता है
  • --node-locations, ज़ोन की एक ऐसी सूची है जिसे कॉमा लगाकर अलग किया गया है. इस मामले में, ऊपर दिए गए एनवायरमेंट वैरिएबल में आपके चुने गए ज़ोन और us-central1-b का इस्तेमाल किया जाता है
    • ध्यान दें: इस सूची में डुप्लीकेट शामिल नहीं हो सकते
  • --workload-pool, वर्कलोड आइडेंटिटी सेट करता है, ताकि GKE (जीकेई) वर्कलोड, Google Cloud की सेवाओं को ऐक्सेस कर सकें

जब क्लस्टर तैयार कर रहा होगा, तब ये डिसप्ले दिखाए जाएंगे

Creating cluster dotnet-cluster in us-central1-b... Cluster is being deployed...⠼

kubectl को कॉन्फ़िगर करें

kubectl सीएलआई, Kubernetes क्लस्टर के साथ इंटरैक्ट करने का मुख्य तरीका है. अभी-अभी बनाए गए नए क्लस्टर के साथ इसका इस्तेमाल करने के लिए, इसे क्लस्टर के हिसाब से प्रमाणित करने के लिए कॉन्फ़िगर करना होगा. यह काम उसके दिए निर्देश की मदद से किया जाता है.

$ gcloud container clusters get-credentials dotnet-cluster --zone ${DEFAULT_ZONE}
Fetching cluster endpoint and auth data.
kubeconfig entry generated for dotnet-cluster.

अब क्लस्टर से इंटरैक्ट करने के लिए kubectl का इस्तेमाल किया जा सकता है.

$ kubectl get nodes
NAME                                            STATUS   ROLES    AGE     VERSION
gke-dotnet-cluster-default-pool-02c9dcb9-fgxj   Ready    <none>   2m15s   v1.16.13-gke.401
gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   Ready    <none>   2m24s   v1.16.13-gke.401

3. डिवाइस पर ऐप्लिकेशन की जांच करें और मनचाहे फ़ंक्शन की पुष्टि करें

यह लैब, Docker हब पर मौजूद आधिकारिक .NET डेटा स्टोर करने की जगह से, इन कंटेनर इमेज का इस्तेमाल करती है.

फ़ंक्शन की पुष्टि करने के लिए, कंटेनर को स्थानीय तौर पर चलाएं

क्लाउड शेल में, पुष्टि करें कि Docker ठीक से काम कर रहा है और ठीक से चल रहा है. साथ ही, पुष्टि करें कि .NET कंटेनर उम्मीद के मुताबिक काम कर रहा है. इसके लिए, यह Docker कमांड चलाएं:

$ docker run --rm mcr.microsoft.com/dotnet/samples

      Hello from .NET!
      __________________
                        \
                        \
                            ....
                            ....'
                            ....
                          ..........
                      .............'..'..
                  ................'..'.....
                .......'..........'..'..'....
                ........'..........'..'..'.....
              .'....'..'..........'..'.......'.
              .'..................'...   ......
              .  ......'.........         .....
              .                           ......
              ..    .            ..        ......
            ....       .                 .......
            ......  .......          ............
              ................  ......................
              ........................'................
            ......................'..'......    .......
          .........................'..'.....       .......
      ........    ..'.............'..'....      ..........
    ..'..'...      ...............'.......      ..........
    ...'......     ...... ..........  ......         .......
  ...........   .......              ........        ......
  .......        '...'.'.              '.'.'.'         ....
  .......       .....'..               ..'.....
    ..       ..........               ..'........
            ............               ..............
          .............               '..............
          ...........'..              .'.'............
        ...............              .'.'.............
        .............'..               ..'..'...........
        ...............                 .'..............
        .........                        ..............
          .....
  
Environment:
.NET 5.0.1-servicing.20575.16
Linux 5.4.58-07649-ge120df5deade #1 SMP PREEMPT Wed Aug 26 04:56:33 PDT 2020

वेब ऐप्लिकेशन के काम करने के तरीके की पुष्टि करें

क्लाउड शेल में सैंपल वेब ऐप्लिकेशन की पुष्टि भी की जा सकती है. नीचे दिए गए Docker रन कमांड से एक नया कंटेनर बनता है, जो पोर्ट 80 को दिखाता है और उसे localhost पोर्ट 8080 पर मैप करता है. याद रखें कि इस मामले में localhost, क्लाउड शेल में है.

$ docker run -it --rm -p 8080:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/samples:aspnetapp
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {64a3ed06-35f7-4d95-9554-8efd38f8b5d3} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

यह एक वेब ऐप्लिकेशन है. इसलिए, इसे वेब ब्राउज़र पर देखना और इसकी पुष्टि करना ज़रूरी है. अगले सेक्शन में, Web Preview का इस्तेमाल करके क्लाउड शेल में ऐसा करने का तरीका बताया गया है.

4. "वेब झलक" का इस्तेमाल करके, Cloud शेल से सेवाएं ऐक्सेस करना

Cloud Shell, वेब झलक की सुविधा देता है. इस सुविधा की मदद से ब्राउज़र का इस्तेमाल करके, क्लाउड शेल इंस्टेंस में चल रही प्रोसेस से इंटरैक्ट किया जा सकता है.

"वेब झलक" का इस्तेमाल करना Cloud Shell में ऐप्लिकेशन देखने के लिए

Cloud Shell में, वेब झलक बटन पर क्लिक करें और "पोर्ट 8080 पर झलक देखें" चुनें (या कोई भी पोर्ट वेब झलक इस्तेमाल करने के लिए सेट किया गया हो).

Cloud Shell

इससे एक ब्राउज़र विंडो इस तरह के पते के साथ खुलेगी:

https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0

वेब झलक का इस्तेमाल करके .NET सैंपल ऐप्लिकेशन देखें

आखिरी चरण में शुरू किए गए सैंपल ऐप्लिकेशन को, अब वेब झलक (वेब झलक) शुरू करके और दिया गया यूआरएल लोड करके देखा जा सकता है. यह कुछ ऐसी नज़र आनी चाहिए:

.NET ऐप्लिकेशन V1 का स्क्रीनशॉट

5. Kubernetes में डिप्लॉय करें

YAML फ़ाइल बनाएं और उसका इस्तेमाल करें

अगले चरण में, दो Kubernetes संसाधनों, डिप्लॉयमेंट और सेवा के बारे में बताने वाली YAML फ़ाइल की ज़रूरत होगी. क्लाउड शेल में dotnet-app.yaml नाम की फ़ाइल बनाएं और उसमें नीचे दिया गया कॉन्टेंट जोड़ें.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dotnet-deployment
  labels:
    app: dotnetapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dotnetapp
  template:
    metadata:
      labels:
        app: dotnetapp
    spec:
      containers:
      - name: dotnet
        image: mcr.microsoft.com/dotnet/samples:aspnetapp
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: dotnet-service
spec:
    selector:
      app: dotnetapp
    ports:
      - protocol: TCP
        port: 8080
        targetPort: 80

अब इस फ़ाइल को kubernetes पर लागू करने के लिए, kubectl का इस्तेमाल करें.

$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment created
service/dotnet-service created

उन मैसेज पर ध्यान दें जो यह बताते हैं कि ज़रूरी संसाधन बनाए गए हैं.

इससे जुड़े संसाधनों को एक्सप्लोर करें

हम ऊपर बनाए गए संसाधनों की जांच करने के लिए, kubectl सीएलआई का इस्तेमाल कर सकते हैं. सबसे पहले, डिप्लॉयमेंट संसाधनों को देखते हैं और पुष्टि करते हैं कि नया डिप्लॉयमेंट मौजूद है.

$ kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
dotnet-deployment   3/3     3            3           80s

आगे ReplicaSets पर नज़र डालें. ऊपर दिए गए डिप्लॉयमेंट से एक ReplicaSet बनाया जाना चाहिए.

$ kubectl get replicaset
NAME                           DESIRED   CURRENT   READY   AGE
dotnet-deployment-5c9d4cc4b9   3         3         3       111s

आखिर में, पॉड पर नज़र डालें. डिप्लॉयमेंट ने बताया कि इस तरह के तीन इवेंट होने चाहिए. नीचे दिए गए कमांड से यह पता चलना चाहिए कि इस तरह के तीन उदाहरण हैं. -o wide विकल्प जोड़ा जाता है, ताकि जिन नोड पर ये इंस्टेंस चल रहे हैं वे दिखाए जा सकें.

$ kubectl get pod -o wide
NAME                                 READY   STATUS    RESTARTS   AGE     IP          NODE                                            NOMINATED NODE   READINESS GATES
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Running   0          2m25s   10.16.0.8   gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   <none>           <none>
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Running   0          2m25s   10.16.1.7   gke-dotnet-cluster-default-pool-02c9dcb9-fgxj   <none>           <none>
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Running   0          2m25s   10.16.0.7   gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   <none>           <none>

सेवा से जुड़े संसाधन देखें

Kubernetes में सेवा संसाधन, एक लोड बैलेंसर है. एंडपॉइंट को पॉड पर लेबल के हिसाब से तय किया जाता है. इस तरह, जैसे ही ऊपर बताई गई kubectl scale deployment कार्रवाई के ज़रिए डिप्लॉयमेंट में नए पॉड जोड़े जाते हैं, नतीजे देने वाले पॉड, सेवा से मैनेज किए जा रहे अनुरोधों के लिए तुरंत उपलब्ध हो जाते हैं.

इस निर्देश में सेवा से जुड़ा संसाधन दिखना चाहिए.

$ kubectl get svc
NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
dotnet-service   ClusterIP   10.20.9.124   <none>        8080/TCP   2m50s
...

नीचे दिए गए निर्देश की मदद से, सेवा के बारे में ज़्यादा जानकारी देखी जा सकती है.

$ kubectl describe svc dotnet-service
Name:              dotnet-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=dotnetapp
Type:              ClusterIP
IP:                10.20.9.124
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.16.0.7:80,10.16.0.8:80,10.16.1.7:80
Session Affinity:  None
Events:            <none>

ध्यान दें कि सेवा ClusterIP प्रकार की है. इसका मतलब है कि क्लस्टर में मौजूद कोई भी Pod, सेवा के नाम dotnet-service को उसके आईपी पते के साथ इस्तेमाल कर सकता है. सेवा को भेजे गए अनुरोध, सभी इंस्टेंस (पॉड) में संतुलित तरीके से लोड होंगे. ऊपर दी गई Endpoints वैल्यू, इस सेवा के लिए उपलब्ध पॉड के आईपी दिखाती है. इनकी तुलना, ऊपर दिए गए पॉड के आईपी पते से करें.

मौजूदा ऐप्लिकेशन की पुष्टि करें

इस समय ऐप्लिकेशन लाइव है और उपयोगकर्ता के अनुरोधों के लिए तैयार है. इसे ऐक्सेस करने के लिए, प्रॉक्सी का इस्तेमाल करें. नीचे दिया गया निर्देश एक लोकल प्रॉक्सी बनाता है, जो 8080 पोर्ट पर किए गए अनुरोधों को स्वीकार करता है और उन्हें kubernetes क्लस्टर में भेजता है.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

अब वेब ऐप्लिकेशन को ऐक्सेस करने के लिए, Cloud Shell में Web Preview का इस्तेमाल करें.

वेब झलक से जनरेट किए गए यूआरएल में यह जोड़ें: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. यह कुछ ऐसा दिखेगा:

https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/

Google Kubernetes Engine पर .NET Core ऐप्लिकेशन डिप्लॉय करने पर बधाई. इसके बाद, हम ऐप्लिकेशन में बदलाव करेंगे और फिर से डिप्लॉय करेंगे.

6. ऐप्लिकेशन में बदलाव करना

इस सेक्शन में, ऐप्लिकेशन में बदलाव करके उस होस्ट को दिखाया जाएगा जिस पर इंस्टेंस चल रहा है. इससे यह पुष्टि की जा सकेगी कि लोड बैलेंसिंग सही तरीके से काम कर रही है और उपलब्ध पॉड उम्मीद के मुताबिक काम कर रहे हैं.

सोर्स कोड पाना

git clone https://github.com/dotnet/dotnet-docker.git
cd dotnet-docker/samples/aspnetapp/

होस्ट का नाम शामिल करने के लिए, ऐप्लिकेशन अपडेट करें

vi aspnetapp/Pages/Index.cshtml
    <tr>
        <td>Host</td>
        <td>@Environment.MachineName</td>
    </tr>

कंटेनर की नई इमेज बनाएं और स्थानीय तौर पर टेस्ट करें

अपडेट किए गए कोड के साथ नई कंटेनर इमेज बनाएं.

docker build --pull -t aspnetapp:alpine -f Dockerfile.alpine-x64 .

पहले की तरह ही, नए ऐप्लिकेशन को स्थानीय तौर पर टेस्ट करें

$ docker run --rm -it -p 8080:80 aspnetapp:alpine
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {f71feb13-8eae-4552-b4f2-654435fff7f8} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

पहले की तरह ही, इस ऐप्लिकेशन को वेब प्रीव्यू का इस्तेमाल करके ऐक्सेस किया जा सकता है. इस बार, होस्ट पैरामीटर दिखना चाहिए, जैसा कि यहां दिखाया गया है:

Cloud Shell

क्लाउड शेल में एक नया टैब खोलें. इसके बाद, docker ps चलाकर देखें कि कंटेनर आईडी, ऊपर दिखाई गई 'होस्ट' वैल्यू से मेल खाता है या नहीं.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
ab85ce11aecd        aspnetapp:alpine    "./aspnetapp"       2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   relaxed_northcutt

इमेज को टैग करें और पुश करें, ताकि वह Kubernetes पर उपलब्ध हो

इमेज को टैग करने और पुश करने की ज़रूरत होती है, ताकि Kubernetes उसे खींच सके. सबसे पहले कंटेनर इमेज की सूची बनाएं और अपनी पसंद की इमेज की पहचान करें.

$ docker image list
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
aspnetapp                                          alpine              95b4267bb6d0        6 days ago          110MB

इसके बाद, उस इमेज को टैग करें और उसे Google कंटेनर रजिस्ट्री में भेजें. ऊपर दिए गए इमेज आईडी का इस्तेमाल करने पर, यह ऐसा दिखेगा

docker tag 95b4267bb6d0 gcr.io/${PROJECT_ID}/aspnetapp:alpine
docker push gcr.io/${PROJECT_ID}/aspnetapp:alpine

7. अपडेट किए गए ऐप्लिकेशन को फिर से डिप्लॉय करें

YAML फ़ाइल में बदलाव करें

उस डायरेक्ट्री में वापस जाएं जहां dotnet-app.yaml फ़ाइल सेव की गई है. YAML फ़ाइल में यह लाइन ढूंढें

        image: mcr.microsoft.com/dotnet/core/samples:aspnetapp

इसे उस कंटेनर इमेज का रेफ़रंस देने के लिए बदलना होगा जिसे ऊपर gcr.io में बनाया गया था और पुश किया गया था.

        image: gcr.io/PROJECT_ID/aspnetapp:alpine

PROJECT_ID का इस्तेमाल करने के लिए, इसमें बदलाव करना न भूलें. जब आप पूरा कर लेंगे, तो यह कुछ ऐसा दिखाई देगा

        image: gcr.io/myproject/aspnetapp:alpine

अपडेट की गई YAML फ़ाइल को लागू करें

$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment configured
service/dotnet-service unchanged

ध्यान दें कि डिप्लॉयमेंट संसाधन पर अपडेट किया गया डेटा दिखता है और सेवा संसाधन में कोई बदलाव नहीं होता. अपडेट किए गए पॉड को kubectl get pod निर्देश के साथ पहले की तरह देखा जा सकता है. हालांकि, इस बार हम -w को जोड़ देंगे, जो सभी बदलावों को होते ही देखेंगे.

$ kubectl get pod -w
NAME                                 READY   STATUS              RESTARTS   AGE
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Running             0          34m
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Running             0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Running             0          34m
dotnet-deployment-85f6446977-tmbdq   0/1     ContainerCreating   0          4s
dotnet-deployment-85f6446977-tmbdq   1/1     Running             0          5s
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Terminating         0          34m
dotnet-deployment-85f6446977-lcc58   0/1     Pending             0          0s
dotnet-deployment-85f6446977-lcc58   0/1     Pending             0          0s
dotnet-deployment-85f6446977-lcc58   0/1     ContainerCreating   0          0s
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-lcc58   1/1     Running             0          6s
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          0s
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          0s
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          2s
dotnet-deployment-85f6446977-hw24v   0/1     ContainerCreating   0          2s
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   1/1     Running             0          3s
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-httw6   0/1     Terminating         0          34m

ऊपर दिया गया आउटपुट, रोलिंग अपडेट को उसी तरह दिखाता है जैसे वह होता है. सबसे पहले, नए कंटेनर शुरू किए जाते हैं. जब वे चल रहे होते हैं, तो पुराने कंटेनर खत्म कर दिए जाते हैं.

मौजूदा ऐप्लिकेशन की पुष्टि करें

इस समय ऐप्लिकेशन अपडेट हो गया है और उपयोगकर्ता के अनुरोधों के लिए तैयार है. पहले की तरह ही, इसे प्रॉक्सी का इस्तेमाल करके ऐक्सेस किया जा सकता है.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

अब वेब ऐप्लिकेशन को ऐक्सेस करने के लिए, Cloud Shell में Web Preview का इस्तेमाल करें.

वेब झलक से जनरेट किए गए यूआरएल में यह जोड़ें: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. यह कुछ ऐसा दिखेगा:

https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/

पुष्टि करें कि Kubernetes सेवा, लोड डिस्ट्रिब्यूट कर रही है

इस यूआरएल को कई बार रीफ़्रेश करें. साथ ही, ध्यान दें कि होस्ट की सेटिंग बदल जाती है, क्योंकि सेवा के अलग-अलग पॉड के लिए अनुरोध, लोड होते रहते हैं. होस्ट वैल्यू की तुलना, ऊपर दिए गए पॉड की सूची से करें. इससे यह पता चलेगा कि सभी पॉड को ट्रैफ़िक मिल रहा है.

इंस्टेंस बढ़ाएं

Kubernetes में ऐप्लिकेशन की क्वालिटी को बेहतर बनाना आसान है. फ़ॉलो कमांड, डिप्लॉयमेंट को बड़े पैमाने पर ऐप्लिकेशन के छह इंस्टेंस तक बढ़ाएगा.

$ kubectl scale deployment dotnet-deployment --replicas 6
deployment.apps/dotnet-deployment scaled

नए पॉड और उनकी मौजूदा स्थिति को इस निर्देश की मदद से देखा जा सकता है

kubectl get pod -w

ध्यान दें कि ब्राउज़र की एक ही विंडो को रीफ़्रेश करने से पता चलता है कि अब सभी नए पॉड के लिए ट्रैफ़िक को संतुलित किया जा रहा है.

8. बधाई हो!

इस लैब में, डेवलपर एनवायरमेंट में .NET Core के सैंपल वेब ऐप्लिकेशन की पुष्टि की गई और बाद में उसे GKE का इस्तेमाल करके, Kubernetes पर डिप्लॉय कर दिया गया. इसके बाद, ऐप्लिकेशन में बदलाव करके उस कंटेनर का होस्टनेम दिखाया गया जिसमें वह चल रहा था. इसके बाद, Kubernetes डिप्लॉयमेंट को नए वर्शन पर अपडेट किया गया है. साथ ही, ऐप्लिकेशन का साइज़ बढ़ाया गया है, ताकि यह दिखाया जा सके कि अन्य इंस्टेंस में लोड कैसे बांटा जाता है.

.NET और Kubernetes के बारे में ज़्यादा जानने के लिए, ये ट्यूटोरियल देखें. बेहतर रूटिंग और लचीलेपन के पैटर्न के लिए Istio Service Mesh टूल की मदद से, इस लैब में सीखी गई चीज़ों को बेहतर बनाया गया है.

9. व्यवस्थित करें

अनचाहे शुल्क से बचने के लिए, इस लैब में बनाए गए क्लस्टर और कंटेनर इमेज को मिटाने के लिए, इन निर्देशों का इस्तेमाल करें.

gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine