ทำให้แอป ASP.NET Core ใช้งานได้กับ Google Kubernetes Engine ด้วย Istio (ส่วนที่ 2)
เกี่ยวกับ Codelab นี้
1 ภาพรวม
ในส่วนแรกของห้องทดลอง คุณได้สร้างแอปพลิเคชัน ASP.NET Core สร้างคอนเทนเนอร์ และทำให้ใช้งานได้กับ Google Kubernetes Engine (GKE) และกำหนดค่าการรับส่งข้อมูลให้จัดการโดย Istio
ส่วนที่สองของ Lab นี้จะถือว่าคุณมีคลัสเตอร์ Kubernetes และแอปพลิเคชันจากห้องทดลองแรกที่ทำงานอยู่แล้ว คุณจะเห็นว่า Istio ช่วยจัดการ ตรวจสอบ และรักษาความปลอดภัยให้กับบริการของคุณได้โดยการเปลี่ยนแปลงโค้ดเพียงเล็กน้อย โดยเฉพาะอย่างยิ่ง คุณจะได้สำรวจฟีเจอร์ต่างๆ ของ Istio เช่น เมตริก, การติดตาม, การแสดงภาพบริการ, การจัดการการรับส่งข้อมูลแบบไดนามิก, Fault Injection และอื่นๆ
สิ่งที่คุณจะได้เรียนรู้
- วิธีค้นหาเมตริกด้วย Prometheus
- วิธีแสดงภาพเมตริกด้วย Grafana
- วิธีสร้างบริการเวอร์ชันใหม่
- วิธีปักหมุดบริการให้เป็นเวอร์ชันที่ต้องการ
- วิธีแยกการเข้าชมระหว่างเวอร์ชันต่างๆ
- วิธีแทรกข้อผิดพลาดในการเรียกใช้บริการ
สิ่งที่ต้องมี
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์การใช้งาน Google Cloud Platform อย่างไร
2 การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมตามเวลาที่สะดวก
- ลงชื่อเข้าใช้ Cloud Console และสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีคนใช้แล้ว และจะใช้ไม่ได้ ขออภัย) และจะมีการอ้างอิงใน Codelab ว่า PROJECT_ID
ในภายหลัง
- ถัดไป คุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การใช้งาน Codelab นี้น่าจะไม่มีค่าใช้จ่ายใดๆ หากมี ตรวจสอบว่าคุณได้ทำตามวิธีการใน "การล้างข้อมูล" ซึ่งจะแนะนำคุณเกี่ยวกับวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ใหม่ของ Google Cloud จะมีสิทธิ์เข้าร่วมโปรแกรมทดลองใช้ฟรี$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะดำเนินการ Google Cloud จากระยะไกลได้จากแล็ปท็อป แต่ใน Codelab นี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมแบบบรรทัดคำสั่งที่ทำงานใน Google Cloud
เปิดใช้งาน Cloud Shell
- คลิกเปิดใช้งาน Cloud Shell
จาก Cloud Console
หากคุณไม่เคยเริ่มต้นใช้งาน Cloud Shell มาก่อน คุณจะเห็นหน้าจอตรงกลาง (ครึ่งหน้าล่าง) ซึ่งอธิบายว่านี่คืออะไร หากเป็นเช่นนั้น ให้คลิกดำเนินการต่อ (คุณจะไม่เห็นการดำเนินการนี้อีก) หน้าจอแบบครั้งเดียวมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell ใช้เวลาเพียงไม่กี่นาที
เครื่องเสมือนนี้เต็มไปด้วยเครื่องมือการพัฒนาทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักขนาด 5 GB ที่ทำงานอย่างต่อเนื่องใน Google Cloud ซึ่งจะช่วยเพิ่มประสิทธิภาพของเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก งานส่วนใหญ่ใน Codelab นี้สามารถทำได้โดยใช้เบราว์เซอร์หรือ Chromebook เท่านั้น
เมื่อเชื่อมต่อกับ Cloud Shell คุณควรเห็นว่าได้รับการตรวจสอบสิทธิ์แล้ว และโปรเจ็กต์ได้รับการตั้งค่าเป็นรหัสโปรเจ็กต์แล้ว
- เรียกใช้คำสั่งต่อไปนี้ใน Cloud Shell เพื่อยืนยันว่าคุณได้รับการตรวจสอบสิทธิ์แล้ว
gcloud auth list
เอาต์พุตจากคำสั่ง
Credentialed Accounts ACTIVE ACCOUNT * <my_account>@<my_domain.com> To set the active account, run: $ gcloud config set account `ACCOUNT`
gcloud config list project
เอาต์พุตจากคำสั่ง
[core] project = <PROJECT_ID>
หากไม่ใช่ ให้ตั้งคำสั่งด้วยคำสั่งนี้
gcloud config set project <PROJECT_ID>
เอาต์พุตจากคำสั่ง
Updated property [core/project].
3 ทดสอบแอปพลิเคชัน
ก่อนที่คุณจะเริ่มต้นห้องทดลอง ตรวจสอบให้แน่ใจว่าแอปพลิเคชันยังคงทำงานอยู่จากห้องทดลองก่อนหน้านี้ ขอแจ้งให้ทราบอีกครั้งว่าคุณจะเห็น IP ภายนอกและพอร์ตของเกตเวย์ซึ่งอยู่ภายใต้ EXTERNAL-IP
ดังนี้
kubectl get svc istio-ingressgateway -n istio-system
หากต้องการดูแอปพลิเคชัน ให้เปิดเบราว์เซอร์และไปยัง http://<gatewayurl>
:
หากไม่เห็นแอปพลิเคชัน ให้กลับไปที่ห้องทดลองก่อนหน้าเพื่อให้แน่ใจว่าคุณได้ทำตามขั้นตอนทั้งหมด รวมถึงทั้งแอปพลิเคชันและ Istio ได้รับการติดตั้งและทำงานอย่างเหมาะสมแล้ว
ในตอนนี้ คุณอาจสงสัยว่า "ประโยชน์ของ Istio คืออะไร" เมื่ออนุญาตให้ Istio จัดการการรับส่งข้อมูลของแอปพลิเคชัน คุณจะได้รับฟีเจอร์ต่างๆ เช่น เมตริก การติดตาม การจัดการการรับส่งข้อมูลแบบไดนามิก การแสดงข้อมูลผ่านภาพบริการ Fault Injection และอื่นๆ โดยไม่เสียค่าใช้จ่าย
เริ่มจากการสำรวจเมตริกในขั้นตอนถัดไป
4 เมตริกจาก Grafana และ Prometheus
โดยค่าเริ่มต้น Istio จะสร้างเมตริกบางรายการ คุณสามารถใช้ส่วนเสริมเพื่อค้นหาและแสดงภาพเมตริกเริ่มต้นเหล่านี้ได้
Prometheus
Prometheus เป็นโซลูชันการตรวจสอบแบบโอเพนซอร์ส คุณใช้ Prometheus เพื่อค้นหาเมตริกที่ Istio สร้างขึ้นได้ แต่ต้องติดตั้งส่วนเสริม Prometheus ก่อน
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
ตรวจสอบว่า Prometheus ทำงานอยู่หรือไม่โดยทำดังนี้
kubectl get svc prometheus -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE prometheus ClusterIP 10.31.243.62 <none> 9090/TCP 1d
ส่งการจราจรของข้อมูลไปยังแอปพลิเคชันโดยไปที่ http://<gatewayurl>
2-3 ครั้ง หรือเรียกใช้คำสั่ง curl
ตั้งค่าการส่งต่อพอร์ตสำหรับ Prometheus UI
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
ตอนนี้คุณเรียกใช้การค้นหาได้โดยคลิกปุ่มตัวอย่างเว็บที่มุมขวาบนของ Cloud Shell แล้วคลิกแสดงตัวอย่างบนพอร์ต 8080
คุณจะเห็น UI ของ Prometheus ในแท็บใหม่:
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับ Prometheus โปรดดูการค้นหาเมตริกด้วย Prometheus
Grafana
Grafana เป็นส่วนเสริมอีกอย่างหนึ่งสําหรับการแสดงภาพเมตริก
ติดตั้ง Grafana แทนที่ istio-version
ด้วย Istio เวอร์ชันปัจจุบัน เช่น 1.0.3-gke.3
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
ตรวจสอบว่า Grafana ทำงานอยู่
kubectl get svc grafana -n istio-system NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE grafana ClusterIP 10.31.248.230 <none> 3000/TCP 1d
ส่งการจราจรของข้อมูลไปยังแอปพลิเคชันโดยไปที่ http://<gatewayurl>
2-3 ครั้ง หรือเรียกใช้คำสั่ง curl
ตั้งค่าการส่งต่อพอร์ตสำหรับ Grafana UI ดังนี้
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
คุณสามารถดูแดชบอร์ด Grafana ได้โดยไปที่ตัวอย่างเว็บ:
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Granfana ได้ที่การแสดงภาพเมตริกด้วย Grafana
5 สร้างแอปพลิเคชันเวอร์ชันใหม่
ในบางจุด แอปพลิเคชันที่คุณทำให้ใช้งานได้เป็นเวอร์ชันที่ใช้งานจริงต้องมีการแก้ไขข้อบกพร่องหรือฟีเจอร์เพิ่มเติม มาดูกระบวนการเหล่านั้นกัน
ก่อนอื่น มาแก้ไขแอปพลิเคชันกัน เปิดตัวแก้ไขโค้ดจาก Cloud Shell
ไปที่ Index.cshtml
ในส่วน HelloWorldAspNetCore > Views > Home
และอัปเดตข้อความภาพสไลด์
ค้นหาบรรทัดต่อไปนี้
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
และเปลี่ยนเป็นข้อความนี้
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
บันทึกการเปลี่ยนแปลงแล้วกลับไปที่ Cloud Shell ใน HelloWorldAspNetCore,
ให้สร้างอิมเมจ Docker:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
และพุชไปยัง Container Registry ด้วยคำสั่งต่อไปนี้
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
หลังจากพุชอิมเมจคอนเทนเนอร์ คุณจะทำให้เวอร์ชันใหม่ใช้งานได้ในขั้นตอนถัดไป
6 สร้างการทำให้ใช้งานได้ใหม่
หากต้องการทำให้เวอร์ชันใหม่ใช้งานได้ คุณต้องสร้างการทำให้ใช้งานได้ใหม่สำหรับเวอร์ชันดังกล่าวใน Kubernetes ก่อน เพิ่มโค้ดต่อไปนี้ที่ส่วนท้ายของไฟล์ aspnetcore.yaml
--- apiVersion: apps/v1 kind: Deployment metadata: name: aspnetcore-v2 spec: replicas: 1 selector: matchLabels: app: aspnetcore version: v2 template: metadata: labels: app: aspnetcore version: v2 spec: containers: - name: aspnetcore image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v2 imagePullPolicy: IfNotPresent ports: - containerPort: 8080
ทำให้เวอร์ชันใหม่ใช้งานได้กับเนมสเปซเริ่มต้นด้วย kubectl
:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
ตรวจสอบว่าพ็อดที่คาดไว้ทำงานอยู่
kubectl get pods
NAME READY STATUS RESTARTS AGE aspnetcore-v1-6cf64748-mddb 2/2 Running 0 34s aspnetcore-v2-5d765db-l9xmg 2/2 Running 0 1m
จากนั้นทดสอบแอปพลิเคชันอีกครั้ง รับ IP ภายนอกของเกตเวย์
kubectl get svc istio-ingressgateway -n istio-system
โดยอยู่ภายใต้ EXTERNAL-IP เปิดเบราว์เซอร์ไม่ระบุตัวตน แล้วไปที่ http://<replace-with-external-ip>
เมื่อรีเฟรช บางครั้งคุณจะเห็นข้อความ "เรียนรู้เกี่ยวกับการสร้างเว็บแอปด้วย ASP.NET Core"
แต่ในบางครั้ง คุณจะเห็นข้อความ "เรียนรู้เกี่ยวกับการสร้างเว็บแอปด้วย ASP.NET Core บน Google Cloud"
ที่เป็นเช่นนี้เพราะการทำให้ใช้งานได้ของทั้ง v1
และ v2
ถูกเปิดเผยเบื้องหลังบริการ Kubernetes (aspnetcore-service
) เดียวกัน และ VirtualService ที่คุณสร้างในห้องทดลองก่อนหน้า (aspnetcore-virtualservice
) ใช้บริการนั้นเป็นโฮสต์
ในขั้นตอนถัดไป ให้ปักหมุดบริการกับการทำให้ใช้งานได้ของ v2
โดยใช้ DestinationRule
7 ปักหมุดบริการเป็นเวอร์ชันใหม่
ในขั้นตอนนี้ คุณจะต้องปักหมุดบริการเพื่อใช้การทําให้ v2
ใช้งานได้ และทําได้ด้วย DestinationRule ปลายทางกฎจะกำหนดค่าชุดนโยบายที่จะใช้กับคำขอหลังจากมีการดำเนินการกำหนดเส้นทาง VirtualService
นอกจากนี้ กฎปลายทางยังจะกำหนดชุดย่อยที่ระบุที่อยู่ได้ (ซึ่งก็คือเวอร์ชันที่มีชื่อ) ของโฮสต์ปลายทางที่เกี่ยวข้อง ชุดย่อยเหล่านี้จะใช้ในข้อมูลจำเพาะของเส้นทาง VirtualService เมื่อส่งการรับส่งข้อมูลไปยังบริการบางเวอร์ชัน
สร้างไฟล์ใหม่ชื่อ aspnetcore-destinationrule.yaml
apiVersion: networking.istio.io/v1alpha3 kind: DestinationRule metadata: name: aspnetcore-destinationrule spec: host: aspnetcore-service trafficPolicy: tls: mode: ISTIO_MUTUAL subsets: - name: v1 labels: version: v1 - name: v2 labels: version: v2
จากนั้นสร้างกฎปลายทาง การดำเนินการนี้จะสร้างชุดย่อย 2 ชุด (v1 และ v2) ที่คุณใช้จาก VirtualService ได้
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
ตอนนี้ ให้กลับไปที่ไฟล์ aspnetcore-virtualservice.yaml
เพื่ออัปเดต VirtualService เพื่อใช้เซ็ตย่อย v2
ดังนี้
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service subset: v2
อัปเดต VirtualService ด้วยคำสั่งต่อไปนี้
kubectl apply -f aspnetcore-virtualservice.yaml
เปิดเบราว์เซอร์และไปที่ http://<replace-with-external-ip>.
แม้ว่าจะรีเฟรชหลายครั้งแล้ว คุณควรเห็นข้อความ "เรียนรู้เกี่ยวกับการสร้างเว็บแอปด้วย ASP.NET Core บน Google Cloud":
8 แยกการรับส่งข้อมูลระหว่างเวอร์ชัน
บางครั้งคุณอาจต้องการแยกการเข้าชมระหว่างเวอร์ชันสำหรับการทดสอบ ตัวอย่างเช่น คุณอาจต้องการส่ง 75% ของการเข้าชมไปยังบริการ v1 และ 25% ไปยังบริการเวอร์ชัน v2 ซึ่งทำได้อย่างง่ายดายด้วย Istio สร้างไฟล์ aspnetcore-virtualservice-weights.yaml
ใหม่เพื่ออ้างอิงส่วนย่อย 2 รายการที่มีน้ำหนักต่างกัน
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - route: - destination: host: aspnetcore-service subset: v1 weight: 75 - destination: host: aspnetcore-service subset: v2 weight: 25
อัปเดต VirtualService ด้วยคำสั่งต่อไปนี้
kubectl apply -f aspnetcore-virtualservice-weights.yaml
ตอนนี้ เมื่อคุณรีเฟรชเบราว์เซอร์ คุณจะเห็นเวอร์ชัน v1 เทียบกับ v2 ที่แสดงโดยมีอัตราส่วนประมาณ 3:1
ดูข้อมูลเพิ่มเติมได้ที่การแยกการเข้าชมใน Istio
9 แทรกข้อผิดพลาด
งานการพัฒนาที่เป็นประโยชน์อีกงานหนึ่งที่ต้องทำสำหรับการทดสอบคือการแทรกข้อผิดพลาดหรือความล่าช้าในการรับส่งข้อมูล และดูว่าบริการมีลักษณะการทำงานอย่างไร
เช่น คุณอาจต้องการส่งคืนการตอบกลับคำขอที่ไม่ถูกต้อง (HTTP 400) สำหรับการรับส่งข้อมูล 50% ไปยังเวอร์ชัน v1 สร้างไฟล์ aspnetcore-virtualservice-fault-abort.yaml
ไฟล์ให้ตรงกับรายการต่อไปนี้
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: abort: percentage: value: 50 httpStatus: 400 route: - destination: host: aspnetcore-service subset: v1
อัปเดต VirtualService ด้วยคำสั่งต่อไปนี้
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
ตอนนี้เมื่อรีเฟรชเบราว์เซอร์ คุณจะเห็นได้ว่าครึ่งหนึ่งของเวลาทั้งหมดนั้น บริการ v1 ส่งคืนรหัสตอบกลับ HTTP 400
หรือคุณอาจต้องการเพิ่มการหน่วงเวลา 5 วินาทีในคำขอ สร้างไฟล์ aspnetcore-virtualservice-fault-delay.yaml
ไฟล์ให้ตรงกับรายการต่อไปนี้
apiVersion: networking.istio.io/v1alpha3 kind: VirtualService metadata: name: aspnetcore-virtualservice spec: hosts: - "*" gateways: - aspnetcore-gateway http: - fault: delay: fixedDelay: 5s percentage: value: 100 route: - destination: host: aspnetcore-service subset: v1
อัปเดต VirtualService ด้วยคำสั่งต่อไปนี้
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
ในตอนนี้เมื่อรีเฟรชเบราว์เซอร์ คุณจะเห็นได้ว่าคำขอล่าช้าไป 5 วินาที
หากต้องการดูข้อมูลเพิ่มเติมเกี่ยวกับฟีเจอร์ของ Istio เช่น ระยะหมดเวลา การลองใหม่ กฎแบบมีเงื่อนไข เบรกเกอร์ และอื่นๆ โปรดดูฟีเจอร์การจัดการการรับส่งข้อมูล
10 ยินดีด้วย
หวังว่าห้องทดลองนี้จะให้ภาพรวมเกี่ยวกับสิ่งที่ Istio ทำให้คุณใช้บริการได้ตั้งแต่แกะกล่อง ดูข้อมูลเพิ่มเติมเกี่ยวกับ Istio และ GKE
ขั้นตอนถัดไป
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Istio
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Kubernetes
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Kubernetes Engine
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ .NET บน Google Cloud Platform
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้ใบอนุญาตทั่วไปครีเอทีฟคอมมอนส์แบบระบุแหล่งที่มา 2.0
11 ล้างข้อมูล
คุณสามารถลบแอปและถอนการติดตั้ง Istio หรือลบคลัสเตอร์ Kubernetes ได้เลย
ลบแอปพลิเคชัน
วิธีลบแอปพลิเคชัน
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
วิธียืนยันว่าไม่มีแอปพลิเคชันแล้ว
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
ถอนการติดตั้ง Istio
วิธีลบ Istio
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
วิธียืนยันว่า Istio หายไปแล้ว
kubectl get pods -n istio-system
ลบคลัสเตอร์ Kubernetes
gcloud container clusters delete hello-dotnet-cluster