1. Tổng quan
Trong phần đầu tiên của phòng thí nghiệm, bạn đã tạo một ứng dụng ASP.NET Core, đóng gói vào vùng chứa và triển khai ứng dụng đó vào Google Kubernetes Engine (GKE), đồng thời định cấu hình lưu lượng truy cập của ứng dụng để được Istio quản lý.
Phần thứ hai của bài thực hành này giả định rằng bạn đã có cụm Kubernetes và ứng dụng đang chạy từ bài thực hành đầu tiên. Bạn sẽ thấy cách Istio có thể giúp quản lý, giám sát và bảo mật các dịch vụ của bạn mà không cần thay đổi nhiều mã. Cụ thể, bạn sẽ khám phá các tính năng của Istio, chẳng hạn như chỉ số, theo dõi, trực quan hoá dịch vụ, quản lý lưu lượng truy cập động, chèn lỗi, v.v.
Kiến thức bạn sẽ học được
- Cách truy vấn chỉ số bằng Prometheus.
- Cách trực quan hoá các chỉ số bằng Grafana.
- Cách tạo phiên bản mới cho dịch vụ của bạn.
- Cách ghim một dịch vụ vào một phiên bản cụ thể.
- Cách phân chia lưu lượng truy cập giữa các phiên bản.
- Cách chèn lỗi vào các lệnh gọi dịch vụ.
Bạn cần có
Bạn sẽ sử dụng hướng dẫn này như thế nào?
Bạn đánh giá thế nào về trải nghiệm của mình với Google Cloud Platform?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tốc độ của riêng bạn
- Đăng nhập vào Cloud Console rồi tạo một dự án mới hoặc sử dụng lại một dự án hiện có. (Nếu chưa có tài khoản Gmail hoặc G Suite, bạn phải tạo một tài khoản.)
Hãy nhớ mã dự án, một tên duy nhất trên tất cả các dự án trên Google Cloud (tên ở trên đã được sử dụng và sẽ không hoạt động đối với bạn, xin lỗi!). Sau này trong lớp học lập trình này, chúng ta sẽ gọi nó là PROJECT_ID.
- Tiếp theo, bạn cần bật tính năng thanh toán trong Cloud Console để sử dụng các tài nguyên của Google Cloud.
Việc thực hiện lớp học lập trình này sẽ không tốn nhiều chi phí, nếu có. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" để biết cách tắt các tài nguyên nhằm tránh bị tính phí ngoài phạm vi hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí trị giá 300 USD.
Khởi động Cloud Shell
Mặc dù có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.
Nếu chưa từng khởi động Cloud Shell, bạn sẽ thấy một màn hình trung gian (bên dưới phần hiển thị đầu tiên) mô tả về Cloud Shell. Nếu vậy, hãy nhấp vào Tiếp tục (và bạn sẽ không bao giờ thấy màn hình này nữa). Sau đây là giao diện của màn hình xuất hiện một lần:
Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.
Máy ảo này được trang bị tất cả các công cụ phát triển mà bạn cần. Nền tảng này cung cấp một thư mục chính có dung lượng 5 GB và chạy trong Google Cloud, giúp tăng cường đáng kể hiệu suất mạng và hoạt động xác thực. Bạn có thể thực hiện hầu hết, nếu không muốn nói là tất cả, công việc trong lớp học lập trình này chỉ bằng một trình duyệt hoặc Chromebook.
Sau khi kết nối với Cloud Shell, bạn sẽ thấy rằng mình đã được xác thực và dự án đã được đặt thành mã dự án của bạn.
- Chạy lệnh sau trong Cloud Shell để xác nhận rằng bạn đã được xác thực:
gcloud auth list
Đầu ra của lệnh
Credentialed Accounts
ACTIVE ACCOUNT
* <my_account>@<my_domain.com>
To set the active account, run:
$ gcloud config set account `ACCOUNT`
gcloud config list project
Đầu ra của lệnh
[core] project = <PROJECT_ID>
Nếu không, bạn có thể đặt nó bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Đầu ra của lệnh
Updated property [core/project].
3. Kiểm thử ứng dụng
Trước khi bắt đầu bài thực hành, hãy đảm bảo ứng dụng vẫn hoạt động như trong bài thực hành trước. Xin lưu ý rằng đây là cách bạn xem IP và cổng bên ngoài của cổng, được liệt kê trong EXTERNAL-IP:
kubectl get svc istio-ingressgateway -n istio-system
Để xem ứng dụng, bạn có thể mở trình duyệt và chuyển đến http://<gatewayurl>:

Nếu bạn không thấy ứng dụng này, hãy quay lại phòng thí nghiệm trước đó để đảm bảo bạn đã làm theo tất cả các bước và cả ứng dụng cũng như Istio đều được cài đặt và chạy đúng cách.
Đến đây, có thể bạn đang thắc mắc "Istio có lợi ích gì?". Bằng cách cho phép Istio quản lý lưu lượng truy cập của ứng dụng, bạn sẽ được sử dụng miễn phí các tính năng như chỉ số, theo dõi, quản lý lưu lượng truy cập linh hoạt, trực quan hoá dịch vụ, chèn lỗi và nhiều tính năng khác.
Bạn sẽ bắt đầu khám phá các chỉ số trong bước tiếp theo.
4. Chỉ số với Grafana và Prometheus
Theo mặc định, Istio tạo một số chỉ số. Bạn có thể sử dụng các tiện ích bổ sung để truy vấn và trực quan hoá những chỉ số mặc định này.
Prometheus
Prometheus là một giải pháp giám sát nguồn mở. Bạn có thể dùng Prometheus để truy vấn các chỉ số do Istio tạo ra, nhưng trước tiên bạn cần cài đặt tiện ích bổ sung Prometheus.
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/prometheus.yaml
Xác minh rằng Prometheus đang chạy:
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
Gửi một số lưu lượng truy cập đến ứng dụng bằng cách truy cập vào http://<gatewayurl> một vài lần hoặc chạy lệnh curl.
Thiết lập chuyển tiếp cổng cho giao diện người dùng Prometheus:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=prometheus -o jsonpath='{.items[0].metadata.name}') 8080:9090
Giờ đây, bạn có thể thực thi một truy vấn bằng cách nhấp vào nút Xem trước trên web ở góc trên cùng bên phải của Cloud Shell rồi nhấp vào Xem trước trên cổng 8080:

Bạn sẽ thấy giao diện người dùng Prometheus trong một thẻ mới:

Để tìm hiểu thêm về Prometheus, hãy xem bài viết Truy vấn chỉ số bằng Prometheus.
Grafana
Grafana là một tiện ích bổ sung khác để trực quan hoá các chỉ số.
Cài đặt Grafana. Thay thế istio-version bằng phiên bản Istio hiện tại của bạn, ví dụ: 1.0.3-gke.3:
kubectl apply -f https://raw.githubusercontent.com/istio/istio/release-1.8/samples/addons/grafana.yaml
Xác minh rằng Grafana đang chạy:
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
Gửi một số lưu lượng truy cập đến ứng dụng bằng cách truy cập vào http://<gatewayurl> một vài lần hoặc chạy lệnh curl.
Thiết lập chuyển tiếp cổng cho giao diện người dùng Grafana:
kubectl -n istio-system port-forward $(kubectl -n istio-system get pod -l app=grafana -o jsonpath='{.items[0].metadata.name}') 8080:3000
Bạn có thể xem trang tổng quan Grafana bằng cách truy cập vào phần Xem trước trên web:


Để tìm hiểu thêm về Granfana, hãy xem bài viết Trực quan hoá các chỉ số bằng Grafana.
5. Tạo phiên bản mới của ứng dụng
Đến một thời điểm nào đó, ứng dụng mà bạn đã triển khai cho kênh phát hành công khai sẽ cần được sửa lỗi hoặc bổ sung tính năng. Hãy xem quy trình đó trông như thế nào.
Trước tiên, hãy sửa đổi ứng dụng. Mở trình soạn thảo mã trong Cloud Shell.
Chuyển đến Index.cshtml trong phần HelloWorldAspNetCore > Views > Home rồi cập nhật một trong các thông báo dạng băng chuyền.
Tìm dòng sau:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core
Và thay đổi thành như sau:
Learn about <a href="https://docs.microsoft.com/aspnet/core">building Web apps with ASP.NET Core on Google Cloud
Lưu các thay đổi rồi quay lại Cloud Shell. Bên trong HelloWorldAspNetCore,, hãy tạo hình ảnh docker:
docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2 .
Và đẩy vào Container Registry:
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2
Sau khi đẩy hình ảnh vùng chứa, bạn có thể triển khai phiên bản mới ở bước tiếp theo.
6. Tạo đợt triển khai mới
Để triển khai phiên bản mới, trước tiên, bạn cần tạo một quy trình triển khai mới cho phiên bản đó trong Kubernetes. Thêm đoạn mã sau vào cuối tệp 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
Triển khai phiên bản mới vào không gian tên mặc định bằng kubectl:
kubectl apply -f aspnetcore.yaml
service "aspnetcore" unchanged deployment.extensions "aspnetcore-v1" unchanged deployment.extensions "aspnetcore-v2" created
Xác minh rằng các nhóm dự kiến đang chạy:
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
Bây giờ, hãy kiểm thử lại ứng dụng. Lấy IP ngoài của cổng:
kubectl get svc istio-ingressgateway -n istio-system
Địa chỉ này nằm trong phần EXTERNAL-IP. Mở một trình duyệt ở chế độ ẩn danh rồi truy cập vào http://<replace-with-external-ip>
Đôi khi, khi làm mới, bạn sẽ thấy thông báo "Tìm hiểu về cách tạo ứng dụng Web bằng ASP.NET Core":

Trong những trường hợp khác, bạn sẽ thấy thông báo "Tìm hiểu về cách tạo ứng dụng Web bằng ASP.NET Core trên Google Cloud":

Điều này là do cả việc triển khai v1 và v2 đều được hiển thị đằng sau cùng một dịch vụ Kubernetes (aspnetcore-service) và VirtualService mà bạn đã tạo trong phòng thí nghiệm trước (aspnetcore-virtualservice) sử dụng dịch vụ đó làm máy chủ lưu trữ.
Trong bước tiếp theo, bạn sẽ ghim dịch vụ vào quá trình triển khai v2 bằng cách sử dụng DestinationRule.
7. Ghim dịch vụ của bạn vào phiên bản mới
Trong bước này, bạn sẽ ghim dịch vụ của mình để sử dụng việc triển khai v2 và bạn có thể thực hiện việc đó bằng DestinationRule. DestinationRule định cấu hình bộ chính sách sẽ được áp dụng cho một yêu cầu sau khi hoạt động định tuyến VirtualService diễn ra.
DestinationRule cũng xác định các tập hợp con có thể định địa chỉ (nghĩa là các phiên bản được đặt tên) của máy chủ đích tương ứng. Các tập hợp con này được dùng trong thông số kỹ thuật về tuyến đường VirtualService khi gửi lưu lượng truy cập đến các phiên bản cụ thể của dịch vụ.
Tạo một tệp mới có tên 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
Tiếp theo, hãy tạo DestinationRule. Thao tác này sẽ tạo ra 2 tập hợp con (v1 và v2) mà bạn có thể sử dụng từ VirtualService:
kubectl apply -f aspnetcore-destinationrule.yaml
destinationrule.networking.istio.io "aspnetcore-destionationrule" created
Bây giờ, hãy quay lại tệp aspnetcore-virtualservice.yaml để cập nhật VirtualService nhằm sử dụng tập hợp con 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
Cập nhật VirtualService:
kubectl apply -f aspnetcore-virtualservice.yaml
Mở trình duyệt và truy cập vào http://<replace-with-external-ip>. Ngay cả sau khi làm mới nhiều lần, bạn vẫn sẽ thấy thông báo "Tìm hiểu về cách tạo ứng dụng web bằng ASP.NET Core trên Google Cloud":

8. Chia lưu lượng truy cập giữa các phiên bản
Đôi khi, bạn có thể muốn phân chia lưu lượng truy cập giữa các phiên bản để thử nghiệm. Ví dụ: bạn có thể muốn gửi 75% lưu lượng truy cập đến v1 và 25% lưu lượng truy cập đến phiên bản v2 của dịch vụ. Bạn có thể dễ dàng đạt được điều này bằng Istio. Tạo một tệp aspnetcore-virtualservice-weights.yaml mới để tham chiếu đến 2 tập hợp con có trọng số khác nhau:
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
Cập nhật VirtualService:
kubectl apply -f aspnetcore-virtualservice-weights.yaml
Giờ đây, khi làm mới trình duyệt, bạn sẽ thấy các phiên bản v1 và v2 được phân phát với tỷ lệ khoảng 3:1.
Để tìm hiểu thêm, hãy xem phần phân chia lưu lượng truy cập trong Istio.
9. Chèn lỗi
Một việc phát triển hữu ích khác cần làm để kiểm thử là chèn lỗi hoặc độ trễ vào lưu lượng truy cập và xem các dịch vụ phản hồi như thế nào.
Ví dụ: bạn có thể muốn trả về phản hồi yêu cầu không hợp lệ (HTTP 400) cho 50% lưu lượng truy cập đến phiên bản v1. Tạo tệp aspnetcore-virtualservice-fault-abort.yaml sao cho khớp với nội dung sau:
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
Cập nhật VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-abort.yaml
Giờ đây, khi làm mới trình duyệt, bạn sẽ thấy rằng một nửa thời gian, dịch vụ v1 trả về mã phản hồi HTTP 400.
Hoặc có thể bạn muốn thêm độ trễ 5 giây vào các yêu cầu. Tạo tệp aspnetcore-virtualservice-fault-delay.yaml sao cho khớp với nội dung sau:
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
Cập nhật VirtualService:
kubectl apply -f aspnetcore-virtualservice-fault-delay.yaml
Giờ đây, khi làm mới trình duyệt, bạn sẽ thấy các yêu cầu bị trì hoãn 5 giây.
Để tìm hiểu thêm về các tính năng của Istio như thời gian chờ, số lần thử lại, quy tắc có điều kiện, bộ ngắt mạch và nhiều tính năng khác, hãy xem các tính năng quản lý lưu lượng truy cập.
10. Xin chúc mừng!
Hy vọng rằng lớp học này đã cung cấp cho bạn thông tin tổng quan về những việc mà Istio có thể làm cho các dịch vụ của bạn ngay khi xuất xưởng. Để tìm hiểu thêm về Istio và GKE.
Các bước tiếp theo
- Tìm hiểu thêm về Istio.
- Tìm hiểu thêm về Kubernetes.
- Tìm hiểu thêm về Google Kubernetes Engine.
- Tìm hiểu thêm về .NET trên Google Cloud Platform.
Giấy phép
Tác phẩm này được cấp phép theo giấy phép Ghi công theo Creative Commons 2.0 Chung.
11. Dọn dẹp
Bạn có thể xoá ứng dụng và gỡ cài đặt Istio hoặc chỉ cần xoá cụm Kubernetes.
Xoá ứng dụng
Cách xoá ứng dụng:
kubectl delete -f aspnetcore-gateway.yaml kubectl delete -f aspnetcore-virtualservice.yaml kubectl delete -f aspnetcore-destinationrule.yaml kubectl delete -f aspnetcore.yaml
Cách xác nhận rằng ứng dụng đã bị xoá:
kubectl get gateway kubectl get virtualservices kubectl get destinationrule kubectl get pods
Gỡ cài đặt Istio
Cách xoá Istio:
kubectl delete -f install/kubernetes/istio-demo-auth.yaml
Cách xác nhận rằng Istio đã bị xoá:
kubectl get pods -n istio-system
Xoá cụm Kubernetes
gcloud container clusters delete hello-dotnet-cluster