1. ภาพรวม
ในส่วนแรกของแล็บ คุณได้สร้างแอปพลิเคชัน ASP.NET Core สร้างคอนเทนเนอร์ และนำไปใช้งานใน Google Kubernetes Engine (GKE) รวมถึงกำหนดค่าให้ Istio จัดการการรับส่งข้อมูล
ห้องทดลองส่วนที่ 2 นี้ถือว่าคุณมีคลัสเตอร์ Kubernetes และแอปพลิเคชันจากห้องทดลองแรกที่กำลังทำงานอยู่แล้ว คุณจะเห็นว่า Istio ช่วยจัดการ ตรวจสอบ และรักษาความปลอดภัยบริการของคุณได้อย่างไรโดยมีการเปลี่ยนแปลงโค้ดน้อยที่สุด โดยเฉพาะอย่างยิ่ง คุณจะได้สำรวจฟีเจอร์ต่างๆ ของ Istio เช่น เมตริก การติดตามภาพ การแสดงภาพบริการ การจัดการการรับส่งข้อมูลแบบไดนามิก การแทรกข้อบกพร่อง และอื่นๆ
สิ่งที่คุณจะได้เรียนรู้
- วิธีค้นหาเมตริกด้วย Prometheus
- วิธีแสดงภาพเมตริกด้วย Grafana
- วิธีสร้างบริการเวอร์ชันใหม่
- วิธีปักหมุดบริการเป็นเวอร์ชันที่เฉพาะเจาะจง
- วิธีแยกการรับส่งข้อมูลระหว่างเวอร์ชันต่างๆ
- วิธีแทรกข้อบกพร่องในการเรียกใช้บริการ
สิ่งที่คุณต้องมี
คุณจะใช้บทแนะนำนี้อย่างไร
คุณจะให้คะแนนประสบการณ์การใช้งาน Google Cloud Platform เท่าไร
2. การตั้งค่าและข้อกำหนด
การตั้งค่าสภาพแวดล้อมแบบเรียนรู้ด้วยตนเอง
- ลงชื่อเข้าใช้ Cloud Console แล้วสร้างโปรเจ็กต์ใหม่หรือใช้โปรเจ็กต์ที่มีอยู่ซ้ำ (หากยังไม่มีบัญชี Gmail หรือ G Suite คุณต้องสร้างบัญชี)
โปรดจดจำรหัสโปรเจ็กต์ ซึ่งเป็นชื่อที่ไม่ซ้ำกันในโปรเจ็กต์ Google Cloud ทั้งหมด (ชื่อด้านบนมีผู้ใช้แล้วและจะใช้ไม่ได้ ขออภัย) ซึ่งจะเรียกว่า PROJECT_ID ในภายหลังใน Codelab นี้
- จากนั้นคุณจะต้องเปิดใช้การเรียกเก็บเงินใน Cloud Console เพื่อใช้ทรัพยากร Google Cloud
การทำตาม Codelab นี้ไม่ควรมีค่าใช้จ่ายมากนัก หรืออาจไม่มีเลย โปรดทำตามวิธีการในส่วน "การล้างข้อมูล" ซึ่งจะแนะนำวิธีปิดทรัพยากรเพื่อไม่ให้มีการเรียกเก็บเงินนอกเหนือจากบทแนะนำนี้ ผู้ใช้ Google Cloud รายใหม่มีสิทธิ์เข้าร่วมโปรแกรมช่วงทดลองใช้ฟรีมูลค่า$300 USD
เริ่มต้น Cloud Shell
แม้ว่าคุณจะใช้งาน Google Cloud จากระยะไกลจากแล็ปท็อปได้ แต่ใน Codelab นี้ คุณจะใช้ Google Cloud Shell ซึ่งเป็นสภาพแวดล้อมบรรทัดคำสั่งที่ทำงานใน Google Cloud
เปิดใช้งาน Cloud Shell
- จาก Cloud Console ให้คลิกเปิดใช้งาน Cloud Shell
หากไม่เคยเริ่มใช้ Cloud Shell มาก่อน คุณจะเห็นหน้าจอระดับกลาง (ด้านล่าง) ที่อธิบายว่า Cloud Shell คืออะไร ในกรณีนี้ ให้คลิกต่อไป (และคุณจะไม่เห็นหน้าจอนี้อีก) หน้าจอแบบครั้งเดียวจะมีลักษณะดังนี้
การจัดสรรและเชื่อมต่อกับ Cloud Shell จะใช้เวลาไม่นาน
เครื่องเสมือนนี้มาพร้อมเครื่องมือพัฒนาซอฟต์แวร์ทั้งหมดที่คุณต้องการ โดยมีไดเรกทอรีหลักแบบถาวรขนาด 5 GB และทำงานใน Google Cloud ซึ่งช่วยเพิ่มประสิทธิภาพเครือข่ายและการตรวจสอบสิทธิ์ได้อย่างมาก คุณสามารถทำงานในโค้ดแล็บนี้ได้โดยใช้เพียงเบราว์เซอร์หรือ 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 จัดการการรับส่งข้อมูลของแอปพลิเคชันจะทำให้คุณได้รับฟีเจอร์ต่างๆ เช่น เมตริก การติดตาม การจัดการการรับส่งข้อมูลแบบไดนามิก การแสดงภาพบริการ การแทรกข้อบกพร่อง และอื่นๆ โดยไม่มีค่าใช้จ่าย
คุณจะเริ่มสำรวจเมตริกในขั้นตอนถัดไป
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
ตั้งค่าการส่งต่อพอร์ตสำหรับ UI ของ Prometheus โดยทำดังนี้
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
ตั้งค่าการส่งต่อพอร์ตสำหรับ UI ของ Grafana โดยทำดังนี้
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
คุณดูแดชบอร์ด Grafana ได้โดยไปที่ตัวอย่างเว็บ


ดูข้อมูลเพิ่มเติมเกี่ยวกับ Grafana ได้ที่การแสดงภาพเมตริกด้วย 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 ที่คุณสร้างขึ้นใน Lab ก่อนหน้า (aspnetcore-virtualservice) จะใช้บริการดังกล่าวเป็นโฮสต์
ในขั้นตอนถัดไป คุณจะปักหมุดบริการไปยังv2การติดตั้งใช้งานโดยใช้ DestinationRule
7. ปักหมุดบริการของคุณไปยังเวอร์ชันใหม่
ในขั้นตอนนี้ คุณจะปักหมุดบริการเพื่อใช้การติดตั้งใช้งาน v2 และทำได้ด้วย DestinationRule DestinationRule จะกำหนดค่านโยบายชุดหนึ่งที่จะใช้กับคำขอหลังจากที่การดำเนินการกำหนดเส้นทาง VirtualService เกิดขึ้น
นอกจากนี้ DestinationRule ยังกําหนดชุดย่อยที่ระบุได้ ซึ่งหมายถึงเวอร์ชันที่มีชื่อของโฮสต์ปลายทางที่เกี่ยวข้อง ระบบจะใช้เซ็ตย่อยเหล่านี้ในการระบุเส้นทาง 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
จากนั้นสร้าง DestinationRule ซึ่งจะสร้าง 2 เซ็ตย่อย (v1 และ v2) ที่คุณใช้ได้จาก VirtualService
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
ตอนนี้ ให้กลับไปที่ไฟล์ aspnetcore-virtualservice.yaml เพื่ออัปเดต VirtualService ให้ใช้v2 Subset
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. ยินดีด้วย
หวังว่า Lab นี้จะช่วยให้คุณเห็นภาพรวมของสิ่งที่ Istio ทำได้สำหรับบริการของคุณโดยไม่ต้องปรับแต่ง ดูข้อมูลเพิ่มเติมเกี่ยวกับ Istio และ GKE
ขั้นตอนถัดไป
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Istio
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Kubernetes
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ Google Kubernetes Engine
- ดูข้อมูลเพิ่มเติมเกี่ยวกับ .NET ใน Google Cloud Platform
ใบอนุญาต
ผลงานนี้ได้รับอนุญาตภายใต้สัญญาอนุญาตครีเอทีฟคอมมอนส์สำหรับยอมรับสิทธิของผู้สร้าง (Creative Commons Attribution License) 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