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 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?

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

Bạn đánh giá thế nào về trải nghiệm của mình với Google Cloud Platform?

Người mới bắt đầu 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 tốc độ của riêng bạn

  1. Đă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_hgylo4zxOllHaAbPKJ7VyqCKPDUnDhkr-BsBIFBsrB6TYSisg6LX-uqmMhh4sXUy_hoa2Qv87C2nFmkg-QAcCiZZp0qtpf6VPaNEEfP_iqt29KVLD-gklBWugQVeOWsFnJmNjHDw

dcCPqfBIwNO4R-0fNQLUC4aYXOOZhKhjUnakFLZJGeziw2ikOxGjGkCHDwN5x5kCbPFB8fiOzZnX-GfuzQ8Ox-UU15BwHirkVPR_0RJwl0oXrhqZmMIvZMa_uwHugBJIdx5-bZ6Z8Q

jgLzVCxk93d6E2bbonzATKA4jFZReoQ-fORxZZLEi5C3D-ubnv6nL-eP-iyh7qAsWyq_nyzzuEoPFD1wFOFZOe4FWhPBJjUDncnTxTImT3Ts9TM54f4nPpsAp52O0y3Cb19IceAEgQ

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.

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

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

yzBQBp2RC1EFvSSLYVkMA2m6LHqGsp22O81rUS5tGb9Y1FqlVhoRj_ka8V_uEjtpcirZRULMy1IjNr848uYvb9mC9RcGGqeayaLcXFfRwUGeXWChZPtWkHzUshTcqx_wJHis0X8viA

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:

VgsaqGbKPRiqK24CqAKjSXjepuJT96PmiDqQMcySmWKx8QyW5F3G2D8JH2d08ek-YM77wWKxPvggpOFER8Hbq3aaZipTDU2o0il7A0kS3FXY_NzuujjEqDF1nsbDKkNMThrqcdMGtQ

Quá trình cung cấp và kết nối với Cloud Shell chỉ mất vài giây.

7RuYr-LCKzdiE1veTFmL_lYrVxsMZ6-xDoxAnfwPPc5uFA0utmFGejvu81jGmTdbqnqxrytW3KcHT6xrMIRc3bskctnDZC5nJdpqw-LRxu3r35hL4A0BSBTtbtirfh3PKv-eOKt8Rg

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.

  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

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

f579a9baedc108a9.png

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:

772a5248aa493025.png

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

272ee63c1fe0be16.png

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

806d696d85267a37.png

524cb9f6d66f8655.png

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

mxrggIJ2Zz8E47ULCEo4NywjM-EpSkZF5c3TQgfGx4nODwP2obiQXrwQjEEaXuBhJDA2jJ5evR7TuHIy1gsqqDRFm0Wh3xhZUu9tn_xb1ygFlBm1HKJqLdfz_aK7WJS33u2IBDO2oQ

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

11d528132dbb6cee.png

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

3eb0d5be1b4cb40b.png

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

3eb0d5be1b4cb40b.png

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

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