Triển khai và cập nhật ứng dụng .NET Core trong Google Kubernetes Engine

1. Tổng quan

Microsoft .NET Core là một phiên bản .NET nguồn mở và nhiều nền tảng, có thể chạy nguyên gốc trong vùng chứa. .NET Core có trên GitHub và được Microsoft cũng như cộng đồng .NET duy trì. Phòng thí nghiệm này triển khai ứng dụng .NET Core trong vùng chứa cho Google Kubernetes Engine (GKE).

Phòng thí nghiệm này tuân theo một mô hình phát triển điển hình, trong đó các ứng dụng được phát triển trong môi trường cục bộ của nhà phát triển, sau đó được triển khai cho phiên bản chính thức. Trong phần đầu của phòng thí nghiệm, một ứng dụng lõi .NET mẫu được xác thực bằng cách sử dụng một vùng chứa chạy trong Cloud Shell. Sau khi xác thực, ứng dụng sẽ được triển khai trên Kubernetes bằng GKE. Phòng thí nghiệm này trình bày các bước tạo cụm GKE.

Trong phần thứ hai của phòng thí nghiệm, một thay đổi nhỏ được thực hiện đối với ứng dụng để hiển thị tên máy chủ của vùng chứa đang chạy phiên bản ứng dụng đó. Sau đó, ứng dụng đã cập nhật sẽ được xác thực trong Cloud shell và quá trình triển khai được cập nhật để sử dụng phiên bản mới. Hình minh hoạ sau đây trình bày trình tự hoạt động trong phòng thí nghiệm này:

Sơ đồ trình tự minh hoạ

Chi phí

Nếu bạn chạy phòng thí nghiệm này chính xác như đã viết, chi phí thông thường cho các dịch vụ sau sẽ được áp dụng

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

Điều kiện tiên quyết

Để hoàn tất phòng thí nghiệm này, bạn cần có một tài khoản và dự án Google Cloud. Để xem hướng dẫn chi tiết hơn về cách tạo một dự án mới, hãy tham khảo Lớp học lập trình này.

Phòng thí nghiệm này sử dụng Docker chạy trong Cloud Shell, được cung cấp qua Google Cloud Console và được định cấu hình sẵn với nhiều công cụ hữu ích như gcloud và Docker. Dưới đây là cách truy cập vào Cloud shell. Nhấp vào biểu tượng Cloud Shell ở trên cùng bên phải để hiển thị biểu tượng này ở ngăn dưới cùng của cửa sổ bảng điều khiển.

Cloud Shell

Các lựa chọn cấu hình thay thế cho cụm GKE (không bắt buộc)

Phòng thí nghiệm này cần có một cụm Kubernetes. Trong phần tiếp theo, một cụm GKE có cấu hình đơn giản sẽ được tạo. Phần này trình bày một số lệnh gcloud cung cấp các lựa chọn cấu hình thay thế để sử dụng khi xây dựng một cụm Kubernetes bằng GKE. Ví dụ: bằng cách sử dụng các lệnh bên dưới, bạn có thể xác định các loại máy, vùng khác nhau và thậm chí cả GPU (trình tăng tốc).

  • Liệt kê các loại máy bằng lệnh gcloud compute machine-types list
  • Liệt kê các GPU bằng lệnh này gcloud compute accelerator-types list
  • Dùng lệnh gcloud compute zones list này để liệt kê các vùng điện toán
  • Nhận trợ giúp về bất kỳ lệnh gcloud nào gcloud container clusters --help
    • Ví dụ: thao tác này cung cấp thông tin chi tiết về cách tạo một cụm kubernetes gcloud container clusters create --help

Để xem danh sách đầy đủ các lựa chọn cấu hình cho GKE, hãy xem tài liệu này

Chuẩn bị tạo cụm kubernetes

Trong Cloud Shell, bạn cần thiết lập một số biến môi trường và định cấu hình ứng dụng gcloud. Bạn có thể thực hiện việc này bằng các lệnh sau.

export PROJECT_ID=YOUR_PROJECT_ID
export DEFAULT_ZONE=us-central1-c

gcloud config set project ${PROJECT_ID}
gcloud config set compute/zone ${DEFAULT_ZONE}

Tạo một cụm GKE

Vì phòng thí nghiệm này triển khai ứng dụng .NET Core trên Kubernetes, nên bạn cần phải tạo một cụm. Dùng lệnh sau để tạo một cụm Kubernetes mới trong Google Cloud bằng GKE.

gcloud container clusters create dotnet-cluster \
  --zone ${DEFAULT_ZONE} \
  --num-nodes=1 \
  --node-locations=${DEFAULT_ZONE},us-central1-b \
  --enable-stackdriver-kubernetes \
  --machine-type=n1-standard-1 \
  --workload-pool=${PROJECT_ID}.svc.id.goog \
  --enable-ip-alias
  • --num-nodes là số nút cần thêm trên mỗi vùng và có thể điều chỉnh theo tỷ lệ sau này
  • --node-locations là một danh sách các khu vực được phân tách bằng dấu phẩy. Trong trường hợp này, vùng bạn xác định trong biến môi trường ở trên và us-central1-b sẽ được sử dụng
    • LƯU Ý: Danh sách này không thể chứa bản sao
  • --workload-pool thiết lập thông tin nhận dạng của khối lượng công việc để các tải công việc GKE có thể sử dụng các dịch vụ của Google Cloud

Trong khi cụm đang tạo, các thông tin sau đây sẽ hiển thị

Creating cluster dotnet-cluster in us-central1-b... Cluster is being deployed...⠼

Định cấu hình kubectl

kubectl CLI là cách chính để tương tác với cụm Kubernetes. Để sử dụng thuộc tính này với cụm mới vừa được tạo, bạn cần định cấu hình thuộc tính này để xác thực dựa trên cụm đó. Thao tác này được thực hiện bằng cách tuân theo lệnh.

$ gcloud container clusters get-credentials dotnet-cluster --zone ${DEFAULT_ZONE}
Fetching cluster endpoint and auth data.
kubeconfig entry generated for dotnet-cluster.

Hiện tại, bạn có thể sử dụng kubectl để tương tác với cụm.

$ kubectl get nodes
NAME                                            STATUS   ROLES    AGE     VERSION
gke-dotnet-cluster-default-pool-02c9dcb9-fgxj   Ready    <none>   2m15s   v1.16.13-gke.401
gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   Ready    <none>   2m24s   v1.16.13-gke.401

3. Kiểm thử cục bộ và xác nhận chức năng mong muốn

Phòng thí nghiệm này sử dụng các hình ảnh vùng chứa sau đây từ kho lưu trữ .NET chính thức trên trung tâm Docker.

Chạy vùng chứa cục bộ để xác minh chức năng

Trong Cloud shell, hãy xác minh rằng Docker đang hoạt động và chạy đúng cách, cũng như vùng chứa .NET hoạt động như mong đợi bằng cách chạy lệnh Docker sau:

$ docker run --rm mcr.microsoft.com/dotnet/samples

      Hello from .NET!
      __________________
                        \
                        \
                            ....
                            ....'
                            ....
                          ..........
                      .............'..'..
                  ................'..'.....
                .......'..........'..'..'....
                ........'..........'..'..'.....
              .'....'..'..........'..'.......'.
              .'..................'...   ......
              .  ......'.........         .....
              .                           ......
              ..    .            ..        ......
            ....       .                 .......
            ......  .......          ............
              ................  ......................
              ........................'................
            ......................'..'......    .......
          .........................'..'.....       .......
      ........    ..'.............'..'....      ..........
    ..'..'...      ...............'.......      ..........
    ...'......     ...... ..........  ......         .......
  ...........   .......              ........        ......
  .......        '...'.'.              '.'.'.'         ....
  .......       .....'..               ..'.....
    ..       ..........               ..'........
            ............               ..............
          .............               '..............
          ...........'..              .'.'............
        ...............              .'.'.............
        .............'..               ..'..'...........
        ...............                 .'..............
        .........                        ..............
          .....
  
Environment:
.NET 5.0.1-servicing.20575.16
Linux 5.4.58-07649-ge120df5deade #1 SMP PREEMPT Wed Aug 26 04:56:33 PDT 2020

Xác nhận chức năng của ứng dụng web

Bạn cũng có thể xác thực ứng dụng web mẫu trong giao diện đám mây. Lệnh chạy Docker bên dưới sẽ tạo một vùng chứa mới hiển thị cổng 80 và liên kết cổng đó với cổng localhost 8080. Hãy nhớ rằng localhost trong trường hợp này nằm trong shell trên đám mây.

$ docker run -it --rm -p 8080:80 --name aspnetcore_sample mcr.microsoft.com/dotnet/samples:aspnetapp
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {64a3ed06-35f7-4d95-9554-8efd38f8b5d3} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

Vì đây là ứng dụng web nên bạn cần xem và xác thực ứng dụng này trong trình duyệt web. Phần tiếp theo cho biết cách thực hiện việc đó trong Cloud shell bằng Bản xem trước trên web.

4. Truy cập các dịch vụ từ Cloud shell bằng tính năng "Xem trước trên web"

Cloud Shell cung cấp Bản xem trước trên web, một tính năng giúp bạn có thể sử dụng trình duyệt để tương tác với các quy trình đang chạy trong phiên bản Cloud shell.

Sử dụng tính năng "Xem trước trên web" để xem các ứng dụng trong Cloud Shell

Trong Cloud Shell, hãy nhấp vào nút xem trước trên web rồi chọn "Xem trước trên cổng 8080" (hoặc bất kỳ cổng nào mà Bản xem trước trên web được đặt để sử dụng).

Cloud Shell

Thao tác này sẽ mở ra một cửa sổ trình duyệt có địa chỉ như sau:

https://8080-cs-754738286554-default.us-central1.cloudshell.dev/?authuser=0

Xem ứng dụng mẫu .NET bằng Bản xem trước trên web

Giờ đây, bạn có thể xem ứng dụng mẫu được bắt đầu ở bước cuối cùng bằng cách bắt đầu Xem trước trên web và tải URL được cung cấp. Hàm này có dạng như sau:

Ảnh chụp màn hình ứng dụng .NET V1

5. Triển khai cho Kubernetes

Tạo tệp YAML và áp dụng

Bước tiếp theo yêu cầu bạn có một tệp YAML mô tả 2 tài nguyên Kubernetes: Triển khai và Dịch vụ. Tạo một tệp có tên dotnet-app.yaml trong Cloud shell và thêm nội dung sau vào tệp đó.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dotnet-deployment
  labels:
    app: dotnetapp
spec:
  replicas: 3
  selector:
    matchLabels:
      app: dotnetapp
  template:
    metadata:
      labels:
        app: dotnetapp
    spec:
      containers:
      - name: dotnet
        image: mcr.microsoft.com/dotnet/samples:aspnetapp
        ports:
        - containerPort: 80
---
apiVersion: v1
kind: Service
metadata:
  name: dotnet-service
spec:
    selector:
      app: dotnetapp
    ports:
      - protocol: TCP
        port: 8080
        targetPort: 80

Bây giờ, hãy sử dụng kubectl để áp dụng tệp này cho kubernetes.

$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment created
service/dotnet-service created

Hãy lưu ý các thông báo cho biết tài nguyên mong muốn đã được tạo.

Khám phá các tài nguyên kết quả

Chúng ta có thể sử dụng CLI kubectl để kiểm tra các tài nguyên được tạo ở trên. Trước tiên, hãy xem xét Tài nguyên triển khai và xác nhận rằng hoạt động triển khai mới đã có ở đó.

$ kubectl get deployment
NAME                READY   UP-TO-DATE   AVAILABLE   AGE
dotnet-deployment   3/3     3            3           80s

Tiếp theo, hãy xem ReplicaSets. Cần có một Bản sao được tạo qua hoạt động triển khai ở trên.

$ kubectl get replicaset
NAME                           DESIRED   CURRENT   READY   AGE
dotnet-deployment-5c9d4cc4b9   3         3         3       111s

Cuối cùng, hãy xem Pod. Quá trình Triển khai chỉ ra rằng sẽ có 3 thực thể. Lệnh bên dưới sẽ cho thấy có 3 thực thể. Tuỳ chọn -o wide được thêm vào để hiển thị các nút nơi các thực thể đó đang chạy.

$ kubectl get pod -o wide
NAME                                 READY   STATUS    RESTARTS   AGE     IP          NODE                                            NOMINATED NODE   READINESS GATES
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Running   0          2m25s   10.16.0.8   gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   <none>           <none>
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Running   0          2m25s   10.16.1.7   gke-dotnet-cluster-default-pool-02c9dcb9-fgxj   <none>           <none>
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Running   0          2m25s   10.16.0.7   gke-dotnet-cluster-default-pool-ed09d7b7-xdx9   <none>           <none>

Xem Tài nguyên dịch vụ

Tài nguyên Dịch vụ trong Kubernetes là một trình cân bằng tải. Các điểm cuối được xác định theo các nhãn trên Nhóm. Bằng cách này, ngay khi các Nhóm mới được thêm vào quy trình triển khai thông qua thao tác kubectl scale deployment ở trên, các Nhóm thu được sẽ có sẵn ngay lập tức cho các yêu cầu do Dịch vụ đó xử lý.

Lệnh sau sẽ hiển thị tài nguyên Dịch vụ.

$ kubectl get svc
NAME             TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)    AGE
dotnet-service   ClusterIP   10.20.9.124   <none>        8080/TCP   2m50s
...

Bạn có thể xem thêm thông tin chi tiết về Dịch vụ bằng lệnh sau đây.

$ kubectl describe svc dotnet-service
Name:              dotnet-service
Namespace:         default
Labels:            <none>
Annotations:       <none>
Selector:          app=dotnetapp
Type:              ClusterIP
IP:                10.20.9.124
Port:              <unset>  8080/TCP
TargetPort:        80/TCP
Endpoints:         10.16.0.7:80,10.16.0.8:80,10.16.1.7:80
Session Affinity:  None
Events:            <none>

Xin lưu ý rằng Dịch vụ thuộc loại ClusterIP. Điều này có nghĩa là mọi Nhóm trong cụm đều có thể phân giải tên Dịch vụ, dotnet-service thành địa chỉ IP của nhóm đó. Các yêu cầu gửi đến dịch vụ sẽ được cân bằng tải trong mọi trường hợp (Nhóm). Giá trị Endpoints ở trên cho biết IP của các Nhóm hiện có sẵn cho dịch vụ này. So sánh các thông tin này với IP của các Nhóm đã xuất ở trên.

Xác minh ứng dụng đang chạy

Tại thời điểm này, ứng dụng hoạt động và sẵn sàng cho yêu cầu của người dùng. Hãy sử dụng proxy để truy cập vào tệp này. Lệnh sau đây sẽ tạo một proxy cục bộ chấp nhận các yêu cầu trên cổng 8080 và chuyển các yêu cầu đó đến cụm kubernetes.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

Bây giờ, hãy sử dụng tính năng Xem trước trên web trong Cloud Shell để truy cập vào ứng dụng web.

Thêm đoạn mã sau vào URL do tính năng Bản xem trước trên web tạo: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. URL đó sẽ có dạng như sau:

https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/

Chúc mừng bạn đã triển khai thành công ứng dụng .NET Core trên Google Kubernetes Engine. Tiếp theo, chúng ta sẽ thay đổi ứng dụng và triển khai lại.

6. Sửa đổi ứng dụng

Trong phần này, ứng dụng sẽ được sửa đổi để hiển thị máy chủ lưu trữ nơi thực thể đang chạy. Điều này sẽ giúp bạn có thể xác nhận rằng tính năng cân bằng tải đang hoạt động và các Nhóm có sẵn đang phản hồi như mong đợi.

Lấy mã nguồn

git clone https://github.com/dotnet/dotnet-docker.git
cd dotnet-docker/samples/aspnetapp/

Cập nhật ứng dụng để thêm tên máy chủ

vi aspnetapp/Pages/Index.cshtml
    <tr>
        <td>Host</td>
        <td>@Environment.MachineName</td>
    </tr>

Tạo hình ảnh vùng chứa mới và thử nghiệm cục bộ

Tạo hình ảnh vùng chứa mới bằng mã đã cập nhật.

docker build --pull -t aspnetapp:alpine -f Dockerfile.alpine-x64 .

Như trước đây, hãy kiểm thử ứng dụng mới trên máy

$ docker run --rm -it -p 8080:80 aspnetapp:alpine
warn: Microsoft.AspNetCore.DataProtection.Repositories.FileSystemXmlRepository[60]
      Storing keys in a directory '/root/.aspnet/DataProtection-Keys' that may not be persisted outside of the container. Protected data will be unavailable when container is destroyed.
warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35]
      No XML encryptor configured. Key {f71feb13-8eae-4552-b4f2-654435fff7f8} may be persisted to storage in unencrypted form.
info: Microsoft.Hosting.Lifetime[0]
      Now listening on: http://[::]:80
info: Microsoft.Hosting.Lifetime[0]
      Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
      Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
      Content root path: /app

Như trước đây, bạn có thể truy cập ứng dụng bằng tính năng Xem trước trên web. Lần này, thông số Host sẽ xuất hiện, như minh hoạ dưới đây:

Cloud Shell

Mở một thẻ mới trong Cloud shell và chạy docker ps để xem mã vùng chứa khớp với giá trị Máy chủ lưu trữ hiển thị ở trên.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                  NAMES
ab85ce11aecd        aspnetapp:alpine    "./aspnetapp"       2 minutes ago       Up 2 minutes        0.0.0.0:8080->80/tcp   relaxed_northcutt

Gắn thẻ và đẩy hình ảnh để truy cập vào Kubernetes

Hình ảnh cần được gắn thẻ và đẩy để Kubernetes có thể kéo hình ảnh. Bắt đầu bằng cách liệt kê các hình ảnh vùng chứa và xác định hình ảnh mong muốn.

$ docker image list
REPOSITORY                                         TAG                 IMAGE ID            CREATED             SIZE
aspnetapp                                          alpine              95b4267bb6d0        6 days ago          110MB

Tiếp theo, hãy gắn thẻ hình ảnh đó và đẩy hình ảnh đó đến Google Container Registry (Đăng ký vùng chứa của Google). Sử dụng ID IMAGE ở trên, kết quả sẽ có dạng như sau

docker tag 95b4267bb6d0 gcr.io/${PROJECT_ID}/aspnetapp:alpine
docker push gcr.io/${PROJECT_ID}/aspnetapp:alpine

7. Triển khai lại ứng dụng đã cập nhật

Chỉnh sửa tệp YAML

Quay lại thư mục lưu tệp dotnet-app.yaml. Tìm dòng sau trong tệp YAML

        image: mcr.microsoft.com/dotnet/core/samples:aspnetapp

Bạn cần thay đổi thông tin này để tham chiếu đến hình ảnh vùng chứa đã được tạo và đẩy vào gcr.io ở trên.

        image: gcr.io/PROJECT_ID/aspnetapp:alpine

Đừng quên sửa đổi để sử dụng PROJECT_ID của bạn. Sau khi bạn hoàn tất, ứng dụng sẽ có dạng như sau

        image: gcr.io/myproject/aspnetapp:alpine

Áp dụng tệp YAML đã cập nhật

$ kubectl apply -f dotnet-app.yaml
deployment.apps/dotnet-deployment configured
service/dotnet-service unchanged

Lưu ý rằng Tài nguyên triển khai cho thấy trạng thái đã cập nhật và Tài nguyên dịch vụ không thay đổi. Bạn có thể xem các Nhóm đã cập nhật như trước đây bằng lệnh kubectl get pod, nhưng lần này chúng ta sẽ thêm -w để theo dõi tất cả thay đổi khi chúng diễn ra.

$ kubectl get pod -w
NAME                                 READY   STATUS              RESTARTS   AGE
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Running             0          34m
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Running             0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Running             0          34m
dotnet-deployment-85f6446977-tmbdq   0/1     ContainerCreating   0          4s
dotnet-deployment-85f6446977-tmbdq   1/1     Running             0          5s
dotnet-deployment-5c9d4cc4b9-vvdln   1/1     Terminating         0          34m
dotnet-deployment-85f6446977-lcc58   0/1     Pending             0          0s
dotnet-deployment-85f6446977-lcc58   0/1     Pending             0          0s
dotnet-deployment-85f6446977-lcc58   0/1     ContainerCreating   0          0s
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-lcc58   1/1     Running             0          6s
dotnet-deployment-5c9d4cc4b9-cspqd   1/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          0s
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          0s
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-vvdln   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   0/1     Pending             0          2s
dotnet-deployment-85f6446977-hw24v   0/1     ContainerCreating   0          2s
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-cspqd   0/1     Terminating         0          34m
dotnet-deployment-85f6446977-hw24v   1/1     Running             0          3s
dotnet-deployment-5c9d4cc4b9-httw6   1/1     Terminating         0          34m
dotnet-deployment-5c9d4cc4b9-httw6   0/1     Terminating         0          34m

Kết quả ở trên cho thấy quá trình cập nhật liên tục khi nó diễn ra. Đầu tiên, các vùng chứa mới được bắt đầu và khi đang chạy, các vùng chứa cũ sẽ bị chấm dứt.

Xác minh ứng dụng đang chạy

Tại thời điểm này, ứng dụng được cập nhật và sẵn sàng cho các yêu cầu của người dùng. Giống như trước đây, bạn có thể truy cập vào tệp này bằng proxy.

$ kubectl proxy --port 8080
Starting to serve on 127.0.0.1:8080

Bây giờ, hãy sử dụng tính năng Xem trước trên web trong Cloud Shell để truy cập vào ứng dụng web.

Thêm đoạn mã sau vào URL do tính năng Bản xem trước trên web tạo: /api/v1/namespaces/default/services/dotnet-service:8080/proxy/. URL đó sẽ có dạng như sau:

https://8080-cs-473655782854-default.us-central1.cloudshell.dev/api/v1/namespaces/default/services/dotnet-service:8080/proxy/

Kiểm tra để xác nhận rằng Dịch vụ Kubernetes đang phân phối tải

Hãy làm mới URL này nhiều lần và để ý rằng Máy chủ lưu trữ thay đổi khi các yêu cầu được cân bằng tải trên các Nhóm khác nhau của Dịch vụ. So sánh các giá trị Máy chủ lưu trữ với danh sách Nhóm ở trên để xem tất cả các Nhóm đều đang nhận được lưu lượng truy cập.

Mở rộng thực thể

Mở rộng quy mô ứng dụng trong Kubernetes thật dễ dàng. Lệnh sau đây sẽ mở rộng quy mô triển khai lên đến 6 phiên bản của ứng dụng.

$ kubectl scale deployment dotnet-deployment --replicas 6
deployment.apps/dotnet-deployment scaled

Bạn có thể dùng lệnh này để xem các Nhóm mới và trạng thái hiện tại của chúng

kubectl get pod -w

Lưu ý rằng việc làm mới cùng một cửa sổ trình duyệt cho thấy rằng lưu lượng truy cập hiện đang được cân bằng trên tất cả các Nhóm mới.

8. Xin chúc mừng!

Trong phòng thí nghiệm này, một ứng dụng web mẫu .NET Core đã được xác thực trong môi trường dành cho nhà phát triển và sau đó được triển khai cho Kubernetes bằng GKE. Sau đó, ứng dụng này được sửa đổi để hiển thị tên máy chủ của vùng chứa nơi ứng dụng đang chạy. Sau đó, quy trình triển khai Kubernetes được cập nhật lên phiên bản mới và ứng dụng đã được mở rộng để minh hoạ cách phân bổ tải trên các phiên bản khác.

Để tìm hiểu thêm về .NET và Kubernetes, hãy cân nhắc xem các hướng dẫn sau. Những tính năng này được phát triển dựa trên những gì học được trong phòng thí nghiệm này bằng cách giới thiệu Istio Service Mesh cho các mẫu định tuyến và thích ứng tinh vi hơn.

9. Dọn dẹp

Để tránh các chi phí ngoài ý muốn, hãy sử dụng các lệnh sau để xoá cụm và hình ảnh vùng chứa đã được tạo trong phòng thí nghiệm này.

gcloud container clusters delete dotnet-cluster --zone ${DEFAULT_ZONE}
gcloud container images delete gcr.io/${PROJECT_ID}/aspnetapp:alpine