1. Tổng quan
Trong phần đầu của phòng thí nghiệm, bạn đã tạo một ứng dụng ASP.NET Core, được chứa trong vùng chứa và triển khai ứng dụng đó cho Google Kubernetes Engine (GKE) và định cấu hình lưu lượng truy cập của ứng dụng này để Istio quản lý.
Phần thứ hai của phòng thí nghiệm này giả định rằng bạn đã có cụm Kubernetes và ứng dụng trong phòng thí nghiệm đầu tiên đang chạy. Bạn sẽ tìm hiểu 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 mã nhiều. Cụ thể, bạn sẽ khám phá các tính năng của Istio 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 các chỉ số bằng Prometheus.
- Cách trình bày trực quan các chỉ số bằng Grafana.
- Cách tạo phiên bản mới của dịch vụ.
- 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 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 sử dụng Google Cloud Platform?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại 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.)
Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID
.
- Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.
Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài 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í 300 USD.
Khởi động Cloud Shell
Mặc dù bạn 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 trước đây chưa từng khởi động Cloud Shell, bạn sẽ được trình bày một màn hình trung gian (dưới màn hình đầu tiên) mô tả về ứng dụng này. Nếu trường hợp đó xảy ra, hãy nhấp vào Tiếp tục (và bạn sẽ không thấy thông báo đó nữa). Màn hình một lần đó sẽ có dạng như sau:
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
Máy ảo này chứa tất cả các công cụ phát triển mà bạn cần. Dịch vụ này cung cấp thư mục gốc 5 GB ổn định và chạy trong Google Cloud, giúp nâng cao đáng kể hiệu suất và khả năng xác thực của mạng. Trong lớp học lập trình này, đa số mọi người đều có thể thực hiện 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 mình đã được xác thực và dự án đã được đặt thành mã dự á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
Kết quả 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
Kết quả lệnh
[core] project = <PROJECT_ID>
Nếu chưa, bạn có thể thiết lập chế độ này bằng lệnh sau:
gcloud config set project <PROJECT_ID>
Kết quả lệnh
Updated property [core/project].
3. Kiểm thử ứng dụng
Trước khi bạn bắt đầu phòng thí nghiệm, hãy đảm bảo rằng ứng dụng vẫn đang hoạt động từ phòng thí nghiệm trước đó. Xin lưu ý, đây là cách bạn xem IP ngoài và cổng của cổng vào, được liệt kê trong phần EXTERNAL-IP
:
kubectl get svc istio-ingressgateway -n istio-system
Để xem ứng dụng, bạn có thể mở trình duyệt rồi chuyển đến http://<gatewayurl>
:
Nếu bạn không thấy ứng dụng, 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 cũng như cả ứng dụng và Istio đều được cài đặt và chạy đúng cách.
Đến đây, có thể bạn sẽ thắc mắc "Lợi ích của Istio là gì?". Khi cho phép Istio quản lý lưu lượng truy cập vào ứng dụng của bạn, bạn sẽ được sử dụng các tính năng như chỉ số, theo dõi, quản lý lưu lượng truy cập động, trực quan hoá dịch vụ, chèn lỗi, v.v. mà không mất phí.
Bạn sẽ bắt đầu bằng việc tìm hiểu 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 tiện ích bổ sung để truy vấn và trực quan hoá các 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ể sử dụng Prometheus để truy vấn các chỉ số do Istio tạo 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 http://<gatewayurl>
vài lần hoặc chạy lệnh curl.
Thiết lập tính năng 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
Bây giờ, bạn có thể thực thi 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 và 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 phần Truy vấn chỉ số bằng Prometheus.
Grafana
Grafana là một tiện ích bổ sung khác giúp 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 http://<gatewayurl>
vài lần hoặc chạy lệnh curl.
Thiết lập tính năng 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 các trang tổng quan của Grafana bằng cách truy cập vào Bả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
Tại một số thời điểm, ứng dụng mà bạn đã triển khai phát hành công khai sẽ yêu cầu sửa lỗi hoặc bổ sung tính năng. Hãy xem quy trình đó diễn ra như thế nào.
Trước tiên, hãy cùng sửa đổi ứng dụng. Mở trình soạn thảo mã của Cloud Shell.
Hãy chuyển đến Index.cshtml
trong HelloWorldAspNetCore > Views > Home
rồi cập nhật một trong các tin nhắn 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 nội dung 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 .
Sau đó, đẩy đến Container Registry (Sổ đăng ký vùng chứa):
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 quy trình 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 cho 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 vào:
kubectl get svc istio-ingressgateway -n istio-system
Danh sách này nằm trong phần EXTERNAL-IP. Mở trình duyệt ẩn danh rồi truy cập http://<replace-with-external-ip>
Khi làm mới, đôi khi bạn sẽ thấy thông báo "Tìm hiểu cách tạo ứng dụng web bằng ASP.NET Core":
Vào những lúc 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ả hai phiên bản triển khai v1
và v2
đều sử dụng cùng một dịch vụ Kubernetes (aspnetcore-service
) và dịch vụ ảo 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 quy 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
Ở bước này, bạn ghim dịch vụ của mình để sử dụng tính năng triển khai v2
và bạn có thể thực hiện việc đó bằng DestinationRule. DestinationRule sẽ định cấu hình tập hợp các chính sách sẽ được áp dụng cho một yêu cầu sau khi diễn ra thao tác định tuyến VirtualService.
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ủ lưu trữ đích tương ứng. Các tập hợp con này được dùng trong thông số kỹ thuật định tuyến 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 là 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 hai 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 rồi truy cập vào http://<replace-with-external-ip>.
Ngay cả sau nhiều lần làm mới, bạn vẫn sẽ thấy thông báo "Tìm hiểu cách tạo ứng dụng web bằng ASP.NET Core trên Google Cloud":
8. Phân chia lưu lượng truy cập giữa các phiên bản
Đôi khi, bạn nê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 phiên bả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 thực hiện việc này nhờ Istio. Tạo một tệp aspnetcore-virtualservice-weights.yaml
mới để tham chiếu đến 2 tập hợp con có cá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
Bây giờ, khi làm mới trình duyệt, bạn sẽ thấy phiên bản v1 so với 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. Lỗi chèn
Một nhiệm vụ phát triển hữu ích khác mà bạn có thể thực hiện trong quá trình kiểm thử là chèn lỗi hoặc độ trễ vào lưu lượng truy cập và xem cách các dịch vụ hoạt động để phản hồi.
Ví dụ: bạn có thể muốn trả về một phản hồi yêu cầu không hợp lệ (HTTP 400) cho 50% lưu lượng truy cập vào phiên bản v1. Tạo tệp aspnetcore-virtualservice-fault-abort.yaml
để khớp với yêu cầu 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
Bây giờ, khi làm mới trình duyệt, bạn sẽ thấy một nửa thời gian, dịch vụ v1 trả về mã phản hồi HTTP 400s.
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
để khớp với yêu cầu 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ư hết thời gian chờ, lượt thử lại, quy tắc có điều kiện, cầu dao 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 phòng thí nghiệm này đã cung cấp cho bạn thông tin tổng quan về những việc Istio có thể làm để hỗ trợ bạn ngay lập tức cho các dịch vụ của mình. Để 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 chung Ghi nhận tác giả Creative Commons 2.0.
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
Để xác nhận rằng ứng dụng đã biến mất, hãy làm như sau:
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
Để xác nhận rằng Istio đã biến mất, hãy làm như sau:
kubectl get pods -n istio-system
Xoá cụm Kubernetes
gcloud container clusters delete hello-dotnet-cluster