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