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 ที่ด้านขวาบนเพื่อแสดงในหน้าต่างด้านล่างของหน้าต่างคอนโซล
ตัวเลือกการกำหนดค่าสำรองสำหรับคลัสเตอร์ 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
- ตัวอย่างเช่น โค้ดนี้จะให้รายละเอียดเกี่ยวกับการสร้างคลัสเตอร์ Kubernetes
โปรดดูรายการตัวเลือกการกำหนดค่าทั้งหมดสำหรับ 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 โดยใช้ "ตัวอย่างเว็บ"
Cloud Shell มีตัวอย่างเว็บ ซึ่งเป็นฟีเจอร์ที่ช่วยให้ใช้เบราว์เซอร์เพื่อโต้ตอบกับกระบวนการที่ทำงานในอินสแตนซ์ Cloud Shell ได้
ใช้ "แสดงตัวอย่างเว็บ" เพื่อดูแอปใน Cloud Shell
ใน Cloud Shell ให้คลิกปุ่มตัวอย่างเว็บแล้วเลือก "ดูตัวอย่างบนพอร์ต 8080" (หรือตั้งค่าการแสดงตัวอย่างเว็บในพอร์ตใดก็ตาม)
ซึ่งจะเปิดหน้าต่างเบราว์เซอร์ซึ่งมีที่อยู่ดังนี้:
https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0
ดูแอปพลิเคชัน .NET ตัวอย่างโดยใช้ตัวอย่างเว็บ
ตอนนี้ คุณดูตัวอย่างแอปที่ทำงานในขั้นตอนสุดท้ายได้โดยเริ่มการแสดงตัวอย่างเว็บและโหลด URL ที่ระบุ ซึ่งควรมีหน้าตาเช่นนี้
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 แล้วเรียกใช้ 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