ทำให้ใช้งานได้และอัปเดตแอป .NET Core ใน Google Kubernetes Engine

ทำให้ใช้งานได้และอัปเดตแอป .NET Core ใน Google Kubernetes Engine

เกี่ยวกับ Codelab นี้

subjectอัปเดตล่าสุดเมื่อ พ.ย. 16, 2021
account_circleเขียนโดย Daniel Watrous (Dec 2020)

1 ภาพรวม

Microsoft .NET Core คือ .NET เวอร์ชันแบบโอเพนซอร์สและข้ามแพลตฟอร์มซึ่งทำงานในคอนเทนเนอร์ได้ตั้งแต่ต้น .NET Core มีอยู่ใน GitHub และได้รับการดูแลโดย Microsoft และชุมชน .NET ห้องทดลองนี้จะนำแอป .NET Core ที่มีคอนเทนเนอร์ไปใช้ใน Google Kubernetes Engine (GKE)

ห้องทดลองนี้เป็นไปตามรูปแบบการพัฒนาโดยทั่วไปที่พัฒนาแอปพลิเคชันในสภาพแวดล้อมท้องถิ่นของนักพัฒนาซอฟต์แวร์ จากนั้นจึงนำไปใช้งานจริง ในส่วนแรกของห้องทดลอง ตัวอย่างแอปหลัก .NET ได้รับการตรวจสอบโดยใช้คอนเทนเนอร์ที่ทำงานใน Cloud Shell เมื่อตรวจสอบแล้ว ระบบจะทำให้แอปใช้งานได้บน Kubernetes โดยใช้ GKE Lab มีขั้นตอนในการสร้างคลัสเตอร์ GKE

ในส่วนที่ 2 ของ Lab จะมีการเปลี่ยนแปลงเล็กน้อยกับแอปที่แสดงชื่อโฮสต์ของคอนเทนเนอร์ที่เรียกใช้อินสแตนซ์ของแอปนั้น จากนั้นระบบจะตรวจสอบแอปพลิเคชันที่อัปเดตใน Cloud Shell และอัปเดตการทำให้ใช้งานได้เพื่อใช้เวอร์ชันใหม่ ภาพประกอบต่อไปนี้แสดงลำดับของกิจกรรมในห้องทดลองนี้

แผนภาพลำดับการสาธิต

ค่าใช้จ่าย

หากคุณใช้ Lab นี้ตามที่เขียนไว้ทุกประการ จะมีค่าใช้จ่ายปกติสำหรับบริการต่อไปนี้

2 การตั้งค่าและข้อกำหนด

ข้อกำหนดเบื้องต้น

หากต้องการใช้ห้องทดลองนี้ให้เสร็จสมบูรณ์ คุณต้องมีบัญชีและโปรเจ็กต์ Google Cloud ดูวิธีการสร้างโปรเจ็กต์ใหม่โดยละเอียดได้ที่ Codelab นี้

ห้องทดลองนี้ใช้ Docker ที่ทำงานใน Cloud Shell ซึ่งพร้อมใช้งานผ่าน Google Cloud Console และกำหนดค่าไว้ล่วงหน้าด้วยเครื่องมือที่มีประโยชน์มากมาย เช่น gcloud และ Docker วิธีเข้าถึง Cloud Shell แสดงอยู่ด้านล่าง คลิกไอคอน Cloud Shell ที่ด้านขวาบนเพื่อแสดงในหน้าต่างด้านล่างของหน้าต่างคอนโซล

Cloud Shell

ตัวเลือกการกำหนดค่าสำรองสำหรับคลัสเตอร์ GKE (ไม่บังคับ)

ห้องทดลองนี้ต้องใช้คลัสเตอร์ Kubernetes ในส่วนถัดไป ระบบจะสร้างคลัสเตอร์ GKE ที่มีการกำหนดค่าแบบง่าย ส่วนนี้จะแสดงคำสั่ง gcloud บางรายการที่มีตัวเลือกการกำหนดค่าสำรองสำหรับใช้ในการสร้างคลัสเตอร์ Kubernetes โดยใช้ GKE ตัวอย่างเช่น การใช้คำสั่งด้านล่างจะช่วยให้คุณระบุประเภทเครื่อง โซน และแม้แต่ GPU (Accelerator) ที่แตกต่างกันได้

  • แสดงรายการประเภทเครื่องด้วยคำสั่งนี้ gcloud compute machine-types list
  • แสดงรายการ GPU ด้วยคำสั่งนี้ gcloud compute accelerator-types list
  • แสดงรายการโซนการประมวลผลด้วยคำสั่งนี้ gcloud compute zones list
  • รับความช่วยเหลือเกี่ยวกับคำสั่ง gcloud gcloud container clusters --help
    • ตัวอย่างเช่น โค้ดนี้จะให้รายละเอียดเกี่ยวกับการสร้างคลัสเตอร์ Kubernetes gcloud container clusters create --help

โปรดดูรายการตัวเลือกการกำหนดค่าทั้งหมดสำหรับ GKE ได้ที่เอกสารนี้

เตรียมสร้างคลัสเตอร์ Kubernetes

ต้องตั้งค่าตัวแปรสภาพแวดล้อมบางรายการและกำหนดค่าไคลเอ็นต์ gcloud ใน Cloud Shell ซึ่งทำได้โดยใช้คำสั่งต่อไปนี้

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

เนื่องจากห้องทดลองนี้ทำให้แอป .NET Core ใช้งานได้บน Kubernetes จึงจำเป็นต้องสร้างคลัสเตอร์ ใช้คำสั่งต่อไปนี้เพื่อสร้างคลัสเตอร์ Kubernetes ใหม่ใน Google Cloud โดยใช้ GKE

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 สร้าง Workload Identity เพื่อให้ภาระงานของ 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

3 ทดสอบในเครื่องและยืนยันฟังก์ชันการทำงานที่ต้องการ

ห้องทดลองนี้ใช้อิมเมจคอนเทนเนอร์ต่อไปนี้จากที่เก็บ .NET อย่างเป็นทางการบน Docker Hub

เรียกใช้คอนเทนเนอร์ภายในเครื่องเพื่อยืนยันฟังก์ชันการทำงาน

ใน 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

ยืนยันฟังก์ชันการทำงานของเว็บแอป

นอกจากนี้ยังตรวจสอบเว็บแอปพลิเคชันตัวอย่างใน Cloud Shell ได้ด้วย คำสั่งการเรียกใช้งาน Docker ด้านล่างจะสร้างคอนเทนเนอร์ใหม่ที่แสดงพอร์ต 80 และแมปพอร์ตนั้นกับ localhost พอร์ต 8080 โปรดทราบว่า localhost ในกรณีนี้อยู่ใน Cloud Shell

$ 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 โดยใช้ Web Preview

4 เข้าถึงบริการจาก Cloud Shell โดยใช้ &quot;ตัวอย่างเว็บ&quot;

Cloud Shell มีตัวอย่างเว็บ ซึ่งเป็นฟีเจอร์ที่ช่วยให้ใช้เบราว์เซอร์เพื่อโต้ตอบกับกระบวนการที่ทำงานในอินสแตนซ์ Cloud Shell ได้

ใช้ "แสดงตัวอย่างเว็บ" เพื่อดูแอปใน Cloud Shell

ใน Cloud Shell ให้คลิกปุ่มตัวอย่างเว็บแล้วเลือก "ดูตัวอย่างบนพอร์ต 8080" (หรือตั้งค่าการแสดงตัวอย่างเว็บในพอร์ตใดก็ตาม)

Cloud Shell

ซึ่งจะเปิดหน้าต่างเบราว์เซอร์ซึ่งมีที่อยู่ดังนี้:

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

ดูแอปพลิเคชัน .NET ตัวอย่างโดยใช้ตัวอย่างเว็บ

ตอนนี้ คุณดูตัวอย่างแอปที่ทำงานในขั้นตอนสุดท้ายได้โดยเริ่มการแสดงตัวอย่างเว็บและโหลด URL ที่ระบุ ซึ่งควรมีหน้าตาเช่นนี้

ภาพหน้าจอของแอป .NET V1

5 ทำให้ใช้งานได้กับ Kubernetes

สร้างไฟล์ YAML แล้วนำไปใช้

ขั้นตอนถัดไปต้องใช้ไฟล์ YAML ที่อธิบายทรัพยากร Kubernetes 2 รายการ ได้แก่ การทำให้ใช้งานได้และบริการ สร้างไฟล์ชื่อ dotnet-app.yaml ใน Cloud Shell และเพิ่มเนื้อหาต่อไปนี้ลงในไฟล์

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

คุณจะเห็นข้อความที่ระบุว่ามีการสร้างทรัพยากรที่ต้องการแล้ว

สำรวจแหล่งข้อมูลที่ได้

เราใช้ CLI ของ 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

สุดท้าย ให้คุณดูที่พ็อด การทำให้ใช้งานได้ระบุว่าควรมี 3 อินสแตนซ์ คำสั่งด้านล่างควรแสดงว่ามี 3 อินสแตนซ์ เพิ่มตัวเลือก -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 ซึ่งหมายความว่าพ็อดภายในคลัสเตอร์จะแปลค่าชื่อบริการ dotnet-service เป็นที่อยู่ IP ได้ คำขอที่ส่งไปยังบริการจะมีการจัดสรรภาระงานในอินสแตนซ์ทั้งหมด (พ็อด) ค่า Endpoints ด้านบนแสดง IP ของพ็อดที่พร้อมใช้งานสำหรับบริการนี้ในปัจจุบัน ให้เปรียบเทียบกับ IP ของพ็อดที่แสดงผลด้านบน

ยืนยันแอปที่ทำงานอยู่

ณ จุดนี้ แอปพลิเคชันพร้อมให้บริการและพร้อมรับคำขอของผู้ใช้แล้ว โปรดใช้พร็อกซีเพื่อเข้าถึงแพ็กเกจดังกล่าว คำสั่งต่อไปนี้จะสร้างพร็อกซีภายในซึ่งยอมรับคำขอในพอร์ต 8080 และส่งไปยังคลัสเตอร์ Kubernetes

$ 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/

ขอแสดงความยินดีกับการทำให้แอป .NET Core ใช้งานได้บน Google Kubernetes Engine ต่อไปเราจะทำการเปลี่ยนแปลงในแอปและทำให้ใช้งานได้อีกครั้ง

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

เปิดแท็บใหม่ใน 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 เมื่อใช้ IMAGE ID ด้านบน ซึ่งจะมีลักษณะเช่นนี้

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 เพื่อเข้าถึงเว็บแอปพลิเคชัน

เพิ่มข้อมูลต่อไปนี้ลงใน 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 นี้หลายๆ ครั้งและสังเกตเห็นว่าโฮสต์มีการเปลี่ยนแปลงเนื่องจากมีการจัดสรรภาระงานให้กับคำขอในพ็อดต่างๆ โดยบริการ เปรียบเทียบค่าโฮสต์กับรายการพ็อดจากด้านบนเพื่อดูว่าพ็อดทั้งหมดรับการรับส่งข้อมูล

เพิ่มขนาดอินสแตนซ์

การปรับขนาดแอปใน Kubernetes เป็นเรื่องง่าย คำสั่งต่อไปนี้จะปรับขนาดการติดตั้งใช้งานเป็น 6 อินสแตนซ์ของแอปพลิเคชัน

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

คุณดูพ็อดใหม่และสถานะปัจจุบันของพ็อดได้ด้วยคำสั่งนี้

kubectl get pod -w

โปรดทราบว่าการรีเฟรชหน้าต่างเบราว์เซอร์เดียวกันแสดงว่าการรับส่งข้อมูลกำลังปรับสมดุลให้กับพ็อดใหม่ทั้งหมด

8 ยินดีด้วย

ในห้องทดลองนี้ มีการตรวจสอบเว็บแอปพลิเคชันตัวอย่าง .NET Core ในสภาพแวดล้อมของนักพัฒนาซอฟต์แวร์ และจากนั้นจึงทำให้ใช้งานได้กับ Kubernetes โดยใช้ GKE จากนั้นมีการแก้ไขแอปให้แสดงชื่อโฮสต์ของคอนเทนเนอร์ที่แอปทำงานอยู่ จากนั้นจึงอัปเดตการทำให้ 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