เกี่ยวกับ Codelab นี้
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