Google Kubernetes ইঞ্জিনে একটি .NET কোর অ্যাপ স্থাপন ও আপডেট করুন

১. সংক্ষিপ্ত বিবরণ

মাইক্রোসফট .NET Core হলো .NET-এর একটি ওপেন-সোর্স এবং ক্রস-প্ল্যাটফর্ম সংস্করণ যা কন্টেইনারে স্বাভাবিকভাবে চলতে পারে। .NET Core গিটহাবে পাওয়া যায় এবং এটি মাইক্রোসফট ও .NET কমিউনিটি দ্বারা রক্ষণাবেক্ষণ করা হয়। এই ল্যাবে একটি কন্টেইনারাইজড .NET Core অ্যাপ গুগল কুবারনেটিস ইঞ্জিন (GKE)-এ ডেপ্লয় করা হয়েছে।

এই ল্যাবটি একটি প্রচলিত ডেভেলপমেন্ট প্যাটার্ন অনুসরণ করে, যেখানে অ্যাপ্লিকেশনগুলো ডেভেলপারের লোকাল এনভায়রনমেন্টে তৈরি করা হয় এবং তারপর প্রোডাকশনে ডেপ্লয় করা হয়। ল্যাবের প্রথম অংশে, ক্লাউড শেল- এ চলমান একটি কন্টেইনার ব্যবহার করে একটি উদাহরণ .NET কোর অ্যাপ ভ্যালিডেট করা হয়। ভ্যালিডেট হয়ে গেলে, অ্যাপটি GKE ব্যবহার করে কুবারনেটিসে ডেপ্লয় করা হয়। এই ল্যাবে একটি GKE ক্লাস্টার তৈরি করার ধাপগুলো অন্তর্ভুক্ত রয়েছে।

ল্যাবের দ্বিতীয় অংশে, অ্যাপটিতে একটি ছোট পরিবর্তন করা হয় যা সেই অ্যাপ ইনস্ট্যান্সটি চালনাকারী কন্টেইনারের হোস্টনেম প্রদর্শন করে। এরপর আপডেট করা অ্যাপ্লিকেশনটি ক্লাউড শেলে যাচাই করা হয় এবং নতুন সংস্করণটি ব্যবহার করার জন্য ডিপ্লয়মেন্টটি আপডেট করা হয়। নিম্নলিখিত চিত্রটি এই ল্যাবের কার্যক্রমের ক্রম দেখায়:

ডেমো ক্রম ডায়াগ্রাম

খরচ

আপনি যদি এই ল্যাবটি হুবহু নির্দেশিত পদ্ধতিতে পরিচালনা করেন, তাহলে নিম্নলিখিত পরিষেবাগুলির জন্য স্বাভাবিক খরচ প্রযোজ্য হবে।

২. সেটআপ এবং প্রয়োজনীয়তা

পূর্বশর্ত

এই ল্যাবটি সম্পন্ন করার জন্য একটি গুগল ক্লাউড অ্যাকাউন্ট এবং প্রজেক্ট প্রয়োজন। নতুন প্রজেক্ট কীভাবে তৈরি করতে হয়, সে সম্পর্কে আরও বিস্তারিত নির্দেশাবলীর জন্য এই কোডল্যাবটি দেখুন।

এই ল্যাবে ক্লাউড শেল -এ চলমান ডকার ব্যবহার করা হয়েছে, যা গুগল ক্লাউড কনসোলের মাধ্যমে পাওয়া যায় এবং এতে জিক্লাউড ও ডকারের মতো অনেক দরকারি টুল আগে থেকেই কনফিগার করা থাকে। ক্লাউড শেল কীভাবে অ্যাক্সেস করতে হয় তা নিচে দেখানো হলো। কনসোল উইন্ডোর নিচের প্যানে এটি দেখানোর জন্য উপরের ডানদিকে থাকা ক্লাউড শেল আইকনে ক্লিক করুন।

ক্লাউড শেল

GKE ক্লাস্টারের জন্য বিকল্প কনফিগারেশন অপশন (ঐচ্ছিক)

এই ল্যাবের জন্য একটি কুবারনেটিস ক্লাস্টার প্রয়োজন। পরবর্তী অংশে, একটি সাধারণ কনফিগারেশন সহ একটি GKE ক্লাস্টার তৈরি করা হয়েছে। এই অংশে কিছু gcloud কমান্ড দেখানো হয়েছে, যা GKE ব্যবহার করে কুবারনেটিস ক্লাস্টার তৈরির সময় ব্যবহারের জন্য বিকল্প কনফিগারেশন অপশন প্রদান করে। উদাহরণস্বরূপ, নিচের কমান্ডগুলো ব্যবহার করে বিভিন্ন মেশিন টাইপ, জোন এবং এমনকি GPU (অ্যাক্সিলারেটর) শনাক্ত করা সম্ভব।

  • এই কমান্ডটি ব্যবহার করে মেশিনের প্রকারগুলি তালিকাভুক্ত করুন gcloud compute machine-types list
  • এই কমান্ডটি ব্যবহার করে GPU-গুলির তালিকা দেখুন: gcloud compute accelerator-types list
  • এই কমান্ডটি ব্যবহার করে কম্পিউট জোনগুলির তালিকা দেখুন: gcloud compute zones list
  • যেকোনো gcloud কমান্ডের জন্য সাহায্য নিন: gcloud container clusters --help
    • উদাহরণস্বরূপ, একটি কুবারনেটিস ক্লাস্টার তৈরি করার বিষয়ে বিস্তারিত জানতে gcloud container clusters create --help ব্যবহার করুন।

GKE-এর কনফিগারেশন বিকল্পগুলির সম্পূর্ণ তালিকার জন্য, এই নথিটি দেখুন।

কুবারনেটিস ক্লাস্টার তৈরি করার জন্য প্রস্তুতি নিন।

ক্লাউড শেলে কিছু এনভায়রনমেন্ট ভেরিয়েবল সেট করা এবং 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 Cloud-এ একটি নতুন 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 CLI হলো একটি 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

৩. স্থানীয়ভাবে পরীক্ষা করুন এবং কাঙ্ক্ষিত কার্যকারিতা নিশ্চিত করুন।

এই ল্যাবে ডকার হাব-এর অফিসিয়াল .NET রিপোজিটরি থেকে নিম্নলিখিত কন্টেইনার ইমেজগুলো ব্যবহার করা হয়েছে।

কার্যকারিতা যাচাই করতে কন্টেইনারটি স্থানীয়ভাবে চালান।

ক্লাউড শেলে, নিম্নলিখিত ডকার কমান্ডটি চালিয়ে যাচাই করুন যে ডকার সঠিকভাবে চালু আছে এবং .NET কন্টেইনারটি প্রত্যাশিতভাবে কাজ করছে:

$ 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

ওয়েব অ্যাপের কার্যকারিতা নিশ্চিত করুন

একটি নমুনা ওয়েব অ্যাপ্লিকেশন ক্লাউড শেলেও যাচাই করা যেতে পারে। নিচের ডকার রান কমান্ডটি একটি নতুন কন্টেইনার তৈরি করে যা পোর্ট 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

যেহেতু এটি একটি ওয়েব অ্যাপ, তাই এটিকে একটি ওয়েব ব্রাউজারে দেখতে ও যাচাই করতে হবে। পরবর্তী অংশে দেখানো হয়েছে, ক্লাউড শেলে ওয়েব প্রিভিউ ব্যবহার করে কীভাবে তা করা যায়।

৪. 'ওয়েব প্রিভিউ' ব্যবহার করে ক্লাউড শেল থেকে পরিষেবাগুলি অ্যাক্সেস করুন।

ক্লাউড শেল ওয়েব প্রিভিউ নামক একটি ফিচার প্রদান করে, যার মাধ্যমে ব্রাউজার ব্যবহার করে ক্লাউড শেল ইনস্ট্যান্সে চলমান প্রসেসগুলোর সাথে যোগাযোগ করা সম্ভব হয়।

ক্লাউড শেলে অ্যাপগুলি দেখতে 'ওয়েব প্রিভিউ' ব্যবহার করুন।

ক্লাউড শেলে, ওয়েব প্রিভিউ বোতামে ক্লিক করুন এবং " পোর্ট ৮০৮০-এ প্রিভিউ " (অথবা ওয়েব প্রিভিউ ব্যবহারের জন্য যে পোর্টটি সেট করা আছে) নির্বাচন করুন।

ক্লাউড শেল

এটি এইরকম ঠিকানাসহ একটি ব্রাউজার উইন্ডো খুলবে:

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

ওয়েব প্রিভিউ ব্যবহার করে .NET নমুনা অ্যাপ্লিকেশনটি দেখুন।

গত ধাপে চালু করা নমুনা অ্যাপটি এখন ওয়েব প্রিভিউ চালু করে এবং প্রদত্ত URL-টি লোড করে দেখা যাবে। এটি দেখতে অনেকটা এইরকম হবে:

.NET অ্যাপ V1 এর স্ক্রিনশট

৫. কুবারনেটিসে ডিপ্লয় করুন

YAML ফাইলটি তৈরি করুন এবং প্রয়োগ করুন

পরবর্তী ধাপে দুটি Kubernetes রিসোর্স—একটি Deployment এবং একটি Service—বর্ণনা করার জন্য একটি 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

এখন kubectl ব্যবহার করে এই ফাইলটি Kubernetes-এ প্রয়োগ করুন।

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

যে বার্তাগুলো থেকে বোঝা যায় কাঙ্ক্ষিত রিসোর্সগুলো তৈরি হয়েছে, সেগুলো লক্ষ্য করুন।

ফলস্বরূপ প্রাপ্ত সম্পদগুলি অন্বেষণ করুন

উপরে তৈরি করা রিসোর্সগুলো পরীক্ষা করার জন্য আমরা kubectl CLI ব্যবহার করতে পারি। প্রথমে, চলুন Deployment রিসোর্সগুলো দেখে নিশ্চিত হই যে নতুন ডিপ্লয়মেন্টটি সেখানে আছে।

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

এরপর রেপ্লিকা সেটগুলো দেখুন। উপরে উল্লিখিত ডিপ্লয়মেন্ট দ্বারা তৈরি একটি রেপ্লিকা সেট সেখানে থাকার কথা।

$ 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-এ একটি Service রিসোর্স হলো একটি লোড ব্যালান্সার। Pod-এর লেবেল দ্বারা এন্ডপয়েন্টগুলো নির্ধারিত হয়। এইভাবে, উপরে উল্লিখিত kubectl scale deployment অপারেশনের মাধ্যমে ডিপ্লয়মেন্টে নতুন Pod যোগ করার সাথে সাথেই, সেই Pod-গুলো ঐ Service দ্বারা পরিচালিত অনুরোধগুলোর জন্য তাৎক্ষণিকভাবে উপলব্ধ হয়ে যায়।

নিম্নলিখিত কমান্ডটি সার্ভিস রিসোর্সটি দেখাবে।

$ 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 ) টাইপের। এর মানে হলো, ক্লাস্টারের মধ্যে থাকা যেকোনো পড সার্ভিসের নাম, dotnet-service তার আইপি অ্যাড্রেসে রিজলভ করতে পারবে। সার্ভিসে পাঠানো রিকোয়েস্টগুলো সমস্ত ইনস্ট্যান্স (পড)-এর মধ্যে লোড ব্যালেন্স করা হবে। উপরের Endpoints ভ্যালুটি এই সার্ভিসের জন্য বর্তমানে উপলব্ধ পডগুলোর আইপি দেখাচ্ছে। এগুলোকে উপরে আউটপুট করা পডগুলোর আইপির সাথে তুলনা করুন।

চলমান অ্যাপটি যাচাই করুন

এই পর্যায়ে অ্যাপ্লিকেশনটি লাইভ এবং ব্যবহারকারীর অনুরোধের জন্য প্রস্তুত। এটি অ্যাক্সেস করার জন্য, একটি প্রক্সি ব্যবহার করুন। নিম্নলিখিত কমান্ডটি একটি লোকাল প্রক্সি তৈরি করে যা 8080 পোর্টে অনুরোধ গ্রহণ করে এবং সেগুলোকে কুবারনেটিস ক্লাস্টারে পাঠিয়ে দেয়।

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

এখন ক্লাউড শেলে থাকা ওয়েব প্রিভিউ ব্যবহার করে ওয়েব অ্যাপ্লিকেশনটি অ্যাক্সেস করুন।

ওয়েব প্রিভিউ দ্বারা তৈরি URL-এ নিম্নলিখিতটি যোগ করুন: /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/

গুগল কুবারনেটিস ইঞ্জিনে একটি .NET Core অ্যাপ স্থাপন করার জন্য অভিনন্দন। এরপর আমরা অ্যাপটিতে একটি পরিবর্তন এনে পুনরায় স্থাপন করব।

৬. অ্যাপটি পরিবর্তন করুন

এই অংশে, অ্যাপ্লিকেশনটিকে এমনভাবে পরিবর্তন করা হবে যাতে ইনস্ট্যান্সটি কোন হোস্টে চলছে তা দেখানো যায়। এর ফলে লোড ব্যালান্সিং কাজ করছে কিনা এবং উপলব্ধ পডগুলো প্রত্যাশা অনুযায়ী সাড়া দিচ্ছে কিনা, তা নিশ্চিত করা সম্ভব হবে।

সোর্স কোডটি নিন

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

আগের মতোই, ওয়েব প্রিভিউ ব্যবহার করে অ্যাপটি অ্যাক্সেস করা যাবে। এবার হোস্ট প্যারামিটারটি দৃশ্যমান হওয়া উচিত, যেমনটি এখানে দেখানো হয়েছে:

ক্লাউড শেল

ক্লাউড শেলে একটি নতুন ট্যাব খুলুন এবং 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-এর পক্ষে ইমেজটি পুল করার জন্য সেটিকে ট্যাগ করে পুশ করতে হবে। প্রথমে কন্টেইনার ইমেজগুলোর তালিকা তৈরি করুন এবং কাঙ্ক্ষিত ইমেজটি শনাক্ত করুন।

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

এরপর, সেই ইমেজটিকে ট্যাগ করুন এবং গুগল কন্টেইনার রেজিস্ট্রি- তে পুশ করুন। উপরে দেওয়া IMAGE ID ব্যবহার করলে, সেটি দেখতে এইরকম হবে।

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

৭. আপডেট করা অ্যাপ্লিকেশনটি পুনরায় স্থাপন করুন।

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

লক্ষ্য করুন যে Deployment রিসোর্সটি আপডেট হয়েছে এবং Service রিসোর্সটি অপরিবর্তিত দেখাচ্ছে। আগের মতোই kubectl get pod কমান্ড দিয়ে আপডেট হওয়া 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

এখন ক্লাউড শেলে থাকা ওয়েব প্রিভিউ ব্যবহার করে ওয়েব অ্যাপ্লিকেশনটি অ্যাক্সেস করুন।

ওয়েব প্রিভিউ দ্বারা তৈরি URL-এ নিম্নলিখিতটি যোগ করুন: /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/

কুবারনেটিস সার্ভিসটি লোড বন্টন করছে কিনা তা নিশ্চিত করুন।

এই URL-টি কয়েকবার রিফ্রেশ করুন এবং লক্ষ্য করুন যে সার্ভিসটি দ্বারা অনুরোধগুলি বিভিন্ন পডের মধ্যে লোড ব্যালেন্স করার ফলে হোস্ট পরিবর্তিত হচ্ছে। সমস্ত পড ট্র্যাফিক পাচ্ছে কিনা তা দেখতে উপরের পডের তালিকার সাথে হোস্টের মানগুলি তুলনা করুন।

ইনস্ট্যান্স স্কেল আপ করুন

Kubernetes-এ অ্যাপ স্কেল করা সহজ। নিচের কমান্ডটি অ্যাপ্লিকেশনটির ৬টি ইনস্ট্যান্স পর্যন্ত ডেপ্লয়মেন্ট স্কেল করবে।

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

এই কমান্ডের মাধ্যমে নতুন পডগুলো এবং তাদের বর্তমান অবস্থা দেখা যাবে।

kubectl get pod -w

লক্ষ্য করুন যে একই ব্রাউজার উইন্ডো রিফ্রেশ করলে দেখা যাচ্ছে, এখন সমস্ত নতুন পডগুলোর মধ্যে ট্র্যাফিক সুষমভাবে বণ্টিত হচ্ছে।

৮. অভিনন্দন!

এই ল্যাবে, একটি .NET Core নমুনা ওয়েব অ্যাপ্লিকেশন ডেভেলপার পরিবেশে যাচাই করা হয়েছিল এবং পরবর্তীতে GKE ব্যবহার করে Kubernetes-এ ডেপ্লয় করা হয়েছিল। এরপর অ্যাপটিকে এমনভাবে পরিবর্তন করা হয়েছিল যাতে এটি যে কন্টেইনারে চলছিল তার হোস্টনেম প্রদর্শন করে। তারপর Kubernetes ডেপ্লয়মেন্টটি নতুন সংস্করণে আপডেট করা হয়েছিল এবং অতিরিক্ত ইনস্ট্যান্সগুলোর মধ্যে কীভাবে লোড বণ্টিত হয় তা দেখানোর জন্য অ্যাপটিকে স্কেল আপ করা হয়েছিল।

.NET এবং Kubernetes সম্পর্কে আরও জানতে এই টিউটোরিয়ালগুলো দেখতে পারেন। এই টিউটোরিয়ালগুলো এই ল্যাবে শেখা বিষয়ের উপর ভিত্তি করে তৈরি এবং এতে আরও উন্নত রাউটিং ও রেজিলিয়েন্স প্যাটার্নের জন্য Istio Service Mesh-এর ধারণা দেওয়া হয়েছে।

৯. পরিষ্কার করুন

অনাকাঙ্ক্ষিত খরচ এড়ানোর জন্য, এই ল্যাবে তৈরি করা ক্লাস্টার এবং কন্টেইনার ইমেজটি ডিলিট করতে নিম্নলিখিত কমান্ডগুলো ব্যবহার করুন।

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