Google Kubernetes Engine-এ .NET Core অ্যাপ ডিপ্লয় ও আপডেট করা

১. এক নজরে

Microsoft .NET Core হল .NET-এর একটি ওপেন-সোর্স এবং ক্রস-প্ল্যাটফর্ম ভার্সন যা কন্টেনারে নেটিভভাবে রান করতে পারে। .NET Core, GitHub-এ উপলভ্য এবং Microsoft ও .NET কমিউনিটি এটি ম্যানেজ করে। এই ল্যাব Google Kubernetes Engine (GKE)-এ কন্টেনারাইজ করা .NET Core অ্যাপ ডিপ্লয় করে।

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

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

ডেমো সিকোয়েন্স ডায়াগ্রাম

খরচ

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

২. সেট-আপ ও প্রয়োজনীয়তা

পূর্বশর্ত

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

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

Cloud Shell

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

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

  • এই কমান্ড gcloud compute machine-types list-এর মাধ্যমে মেশিনের ধরন তালিকাভুক্ত করুন
  • এই কমান্ড gcloud compute accelerator-types list-এর মাধ্যমে GPU-এর তালিকা দেখুন
  • এই কমান্ড 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 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

৩. লোকালি টেস্ট করুন এবং প্রত্যাশিত কার্যকারিতা কনফার্ম করুন

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

ফাংশনালিটি যাচাই করতে লোকালি কন্টেনার রান করুন

Cloud Shell-এ, 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

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

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

Cloud Shell-এ ওয়েব প্রিভিউ ফিচার আছে, যার সাহায্যে ব্রাউজার ব্যবহার করে Cloud Shell ইনস্ট্যান্সে চলা প্রসেসের সাথে ইন্টার‍্যাক্ট করা যায়।

Cloud Shell-এ অ্যাপ দেখতে "ওয়েব প্রিভিউ" ব্যবহার করুন

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

Cloud Shell

এটি করলে, এই ধরনের অ্যাড্রেস সহ একটি ব্রাউজার উইন্ডো খুলবে:

https://8080-cs-754738286554-default.us-central1.cloudshell.dev/

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

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

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

৫. Kubernetes-এ ডিপ্লয় করা

YAML ফাইল তৈরি করে প্রয়োগ করুন

পরবর্তী ধাপে একটি YAML ফাইল প্রয়োজন যা দুটি Kubernetes রিসোর্স, একটি ডিপ্লয়মেন্ট এবং একটি পরিষেবা বর্ণনা করে। Cloud Shell-এ 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 CLI ব্যবহার করতে পারি। প্রথমে, ডিপ্লয়মেন্ট রিসোর্স দেখুন এবং নতুন ডিপ্লয়মেন্ট সেখানে আছে কিনা তা কনফার্ম করুন।

$ 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 অপারেশনের মাধ্যমে ডেপ্লয়মেন্টে নতুন Pod যোগ করার সাথে সাথেই, সেই পরিষেবার মাধ্যমে ম্যানেজ করা অনুরোধের জন্য Pod অবিলম্বে উপলভ্য হয়ে যায়।

নিম্নলিখিত কমান্ডে পরিষেবা রিসোর্স দেখানো উচিত।

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

চালু থাকা অ্যাপ যাচাই করুন

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

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

এখন ওয়েব অ্যাপ্লিকেশন অ্যাক্সেস করতে Cloud Shell-এ ওয়েব প্রিভিউ ব্যবহার করুন।

ওয়েব প্রিভিউয়ের মাধ্যমে জেনারেট করা 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/

Google Kubernetes Engine-এ .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

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

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 Container Registry-তে পুশ করুন। উপরের ছবি আইডি ব্যবহার করে, যা দেখতে এইরকম হবে

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

লক্ষ্য করুন যে ডিপ্লয়মেন্ট রিসোর্স আপডেট করা হয়েছে এবং পরিষেবা রিসোর্স অপরিবর্তিত রয়েছে। আপডেট করা Pods আগের মতোই 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-এ ওয়েব প্রিভিউ ব্যবহার করুন।

ওয়েব প্রিভিউয়ের মাধ্যমে জেনারেট করা 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/

Kubernetes পরিষেবা লোড ডিস্ট্রিবিউট করছে কিনা তা কনফার্ম করুন

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

ইনস্ট্যান্সের সংখ্যা বাড়ান

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

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

এই কমান্ডের সাহায্যে নতুন Pods এবং তাদের বর্তমান অবস্থা দেখা যাবে

kubectl get pod -w

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

৮. অভিনন্দন!

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

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

৯. অপ্রয়োজনীয়গুলি মুছুন

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

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