Triển khai ứng dụng ASP.NET Core cho Google Kubernetes Engine bằng Istio (Phần 2)

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?

Chỉ có thể đọc Đọc và hoàn thành bài tập

Bạn đánh giá thế nào về trải nghiệm sử dụng Google Cloud Platform?

Người mới tập Trung cấp Thành thạo

2. Thiết lập và yêu cầu

Thiết lập môi trường theo tiến độ riêng

  1. Đă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.)

H_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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.

  1. 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

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell dnDTxS9j60RcXdTjea12HLB9paS9Gzf7PfFLE9RW8g0Qx1bz7nmCzyCu4rjluX3bOEwavOpDwioXEkzOf6xtZp6-ZbJa08jwQHPveeW8jxz1.

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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:

DKPiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kQnsS3FXEqGDFG

Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

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.

  1. 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>:

f579a9baedc108a9.png

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:

772a5248aa493025.pngS

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

272ee63c1fe0be16.pngs

Để 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:

806d696d85267a37.pngS

524cb9f6d66f8655.pngS

Để 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.

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

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":

11d528132dbb6cee.pngS

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":

3eb0d5be1b4cb40b.png.

Điều này là do cả hai phiên bản triển khai v1v2 đề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":

3eb0d5be1b4cb40b.png.

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

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