Triển khai ứng dụng ASP.NET Core cho Kubernetes trên Google Kubernetes Engine

1. Tổng quan

ASP.NET Core là một khung nguồn mở và đa nền tảng mới dùng để xây dựng các ứng dụng hiện đại dựa trên đám mây và kết nối Internet bằng ngôn ngữ lập trình C#.

Kubernetes là một dự án nguồn mở có thể chạy trên nhiều môi trường, từ máy tính xách tay cho đến cụm nhiều nút có khả năng hoạt động cao, từ đám mây công cộng đến triển khai tại chỗ, từ máy ảo đến kim loại trần.

Trong phòng thí nghiệm này, bạn sẽ triển khai một ứng dụng ASP.NET Core đơn giản cho Kubernetes chạy trên Kubernetes Engine. Lớp học lập trình này dựa trên lớp học lập trình Xây dựng và khởi chạy ứng dụng ASP.NET Core trong Google Cloud Shell. Bạn có thể thực hiện phòng thí nghiệm đó trước trước khi thử phòng thí nghiệm này.

Mục tiêu của lớp học lập trình này là giúp bạn biến đoạn mã của mình (một ứng dụng Hello World ASP.NET Core đơn giản tại đây) thành một ứng dụng được sao chép trên Kubernetes. Bạn lấy mã đã phát triển trên máy, biến mã đó thành hình ảnh vùng chứa Docker, rồi chạy hình ảnh đó trên Google Kubernetes Engine.

Dưới đây là sơ đồ gồm các phần đang hoạt động trong lớp học lập trình này để giúp bạn hiểu cách các thành phần kết hợp với nhau. Hãy dùng nội dung này làm tài liệu tham khảo khi tham gia lớp học lập trình; mọi thông tin sẽ có ý nghĩa vào thời điểm cuối cùng (nhưng tạm thời hãy bỏ qua phần này).

7dbdc973aceef1af.jpeg

Để phục vụ mục đích của lớp học lập trình này, việc sử dụng một môi trường được quản lý như Kubernetes Engine (phiên bản Kubernetes chạy trên Compute Engine do Google lưu trữ) cho phép bạn tập trung nhiều hơn vào việc trải nghiệm Kubernetes thay vì thiết lập cơ sở hạ tầng cơ bản.

Nếu muốn chạy Kubernetes trên máy cục bộ, chẳng hạn như máy tính xách tay phát triển, bạn nên cân nhắc sử dụng Minikube. Giải pháp này cung cấp cách thiết lập đơn giản cho một cụm kubernetes nút duy nhất cho mục đích phát triển và thử nghiệm. Bạn có thể dùng Minikube để tham gia lớp học lập trình này nếu muốn.

Kiến thức bạn sẽ học được

  • Cách đóng gói một ứng dụng ASP.NET Core đơn giản dưới dạng vùng chứa Docker.
  • Cách tạo cụm Kubernetes trên Google Kubernetes Engine (GKE).
  • Cách triển khai ứng dụng ASP.NET Core cho một nhóm.
  • Cách cho phép lưu lượng truy cập từ bên ngoài vào nhóm của bạn.
  • Cách mở rộng quy mô dịch vụ và triển khai bản nâng cấp.
  • Cách chạy trang tổng quan đồ hoạ của Kubernetes.

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 Google 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 Google Workspace, bạn phải tạo một tài khoản.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • Tên dự án là tên hiển thị của những người tham gia dự án này. Đây là một chuỗi ký tự không được API của Google sử dụng. Bạn có thể cập nhật thông tin này bất cứ lúc nào.
  • Mã dự án phải là duy nhất trong tất cả các dự án Google Cloud và không thể thay đổi (bạn không thể thay đổi mã này sau khi đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường bạn không quan tâm đến sản phẩm đó là gì. Trong hầu hết các lớp học lập trình, bạn sẽ cần tham chiếu đến Mã dự án (mã này thường được xác định là PROJECT_ID). Nếu không thích mã đã tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Ngoài ra, bạn có thể thử phương pháp của riêng mình và xem có được cung cấp hay không. Bạn không thể thay đổi thông tin này sau bước này và thông báo đó sẽ vẫn tồn tại trong thời gian của dự án.
  • Đối với thông tin của bạn, có giá trị thứ ba, Project Number (Số dự án) mà một số API sử dụng. Tìm hiểu thêm về cả ba giá trị này trong tài liệu này.
  1. Tiếp theo, bạn sẽ phải bật tính năng thanh toán trong Cloud Console để sử dụng API/tài nguyên trên đám mây. Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Để tắt các tài nguyên nhằm tránh bị tính phí ngoài hướng dẫn này, bạn có thể xoá các tài nguyên bạn đã tạo hoặc xoá toàn bộ dự án. 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 Đám mây.

Kích hoạt Cloud Shell

  1. Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell 853e55310c205094.pngs.

55efc1aaa7a4d3ad.pngS

Nếu trước đây bạn chưa từng khởi động Cloud Shell, thì bạn sẽ thấ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:

9c92662c6a846a5c.pngS

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

9f0e51b578fecce5.pngs

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`
  1. Chạy lệnh sau trong Cloud Shell để xác nhận rằng lệnh gcloud biết về dự án của bạn:
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. Tạo ứng dụng ASP.NET Core trong Cloud Shell

Trong dấu nhắc của Cloud Shell, bạn có thể kiểm tra phiên bản của công cụ dòng lệnh Dotnet đã được cài đặt. Thao tác này sẽ in phiên bản của công cụ dòng lệnh Dotnet đã cài đặt:

dotnet --version

Tiếp theo, hãy tạo ứng dụng web ASP.NET Core mới.

dotnet new mvc -o HelloWorldAspNetCore

Thao tác này sẽ tạo một dự án và khôi phục các phần phụ thuộc của dự án đó. Bạn sẽ thấy một thông báo tương tự như bên dưới.

Restore completed in 11.44 sec for HelloWorldAspNetCore.csproj.

Restore succeeded.

4. Chạy ứng dụng ASP.NET Core

Chúng ta gần như đã sẵn sàng chạy ứng dụng. Chuyển đến thư mục ứng dụng.

cd HelloWorldAspNetCore

Cuối cùng, hãy chạy ứng dụng.

dotnet run --urls=http://localhost:8080

Ứng dụng bắt đầu nghe trên cổng 8080.

Hosting environment: Production
Content root path: /home/atameldev/HelloWorldAspNetCore
Now listening on: http://[::]:8080
Application started. Press Ctrl+C to shut down.

Để xác minh rằng ứng dụng đang chạy, nhấp vào nút xem trước trên web ở trên cùng bên phải và chọn "Xem trước trên cổng 8080".

Capture.PNG

Bạn sẽ thấy trang web ASP.NET Core mặc định:

f42271880ce4d572.png

Sau khi bạn xác minh rằng ứng dụng đang chạy, hãy nhấn tổ hợp phím Ctrl+C để tắt ứng dụng.

5. Đóng gói ứng dụng ASP.NET Core dưới dạng vùng chứa Docker

Tiếp theo, hãy chuẩn bị để ứng dụng của bạn chạy dưới dạng vùng chứa. Bước đầu tiên là xác định vùng chứa và nội dung của vùng chứa đó.

Trong thư mục cơ sở của ứng dụng, hãy tạo một Dockerfile để xác định hình ảnh Docker.

touch Dockerfile

Thêm nội dung sau đây vào Dockerfile bằng trình chỉnh sửa bạn yêu thích (vim, nano,emacs hoặc trình soạn thảo mã của Cloud Shell).

# Use Microsoft's official build .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-sdk/
FROM mcr.microsoft.com/dotnet/sdk:6.0-alpine AS build
WORKDIR /app

# Install production dependencies.
# Copy csproj and restore as distinct layers.
COPY *.csproj ./
RUN dotnet restore

# Copy local code to the container image.
COPY . ./
WORKDIR /app

# Build a release artifact.
RUN dotnet publish -c Release -o out

# Use Microsoft's official runtime .NET image.
# https://hub.docker.com/_/microsoft-dotnet-core-aspnet/
FROM mcr.microsoft.com/dotnet/aspnet:6.0-alpine-amd64 AS runtime
WORKDIR /app
COPY --from=build /app/out ./

# Make sure the app binds to port 8080
ENV ASPNETCORE_URLS http://*:8080

# Run the web service on container startup.
ENTRYPOINT ["dotnet", "HelloWorldAspNetCore.dll"]

Một cấu hình quan trọng có trong Dockerfile của bạn là cổng nơi ứng dụng nghe lưu lượng truy cập đến (8080). Bạn có thể thực hiện việc này bằng cách đặt biến môi trường ASPNETCORE_URLS mà các ứng dụng ASP.NET Core dùng để xác định cổng nào cần nghe.

Lưu Dockerfile này. Bây giờ, hãy tạo hình ảnh:

docker build -t gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 .

Sau khi quá trình này hoàn tất (sẽ mất chút thời gian để tải xuống và giải nén mọi thứ), bạn có thể thấy hình ảnh đã được tạo và lưu trên thiết bị:

docker images

REPOSITORY                             TAG   
gcr.io/yourproject-XXXX/hello-dotnet   v1            

Kiểm thử hình ảnh cục bộ bằng lệnh sau để chạy vùng chứa Docker cục bộ trên cổng 8080 từ hình ảnh vùng chứa mới tạo của bạn:

docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

Và một lần nữa tận dụng tính năng xem trước trên web của CloudShell :

Ảnh chụp màn hình từ 2015-11-03 17:20:22.png

Bạn sẽ thấy trang web ASP.NET Core mặc định trong thẻ mới.

f42271880ce4d572.png

Sau khi xác minh rằng ứng dụng đang chạy bình thường trong vùng chứa Docker, bạn có thể dừng vùng chứa đang chạy chậm nhất vào Ctrl-> C.

Bây giờ, hình ảnh đã hoạt động đúng như dự tính, bạn có thể đẩy hình ảnh này vào Google Container Registry, một kho lưu trữ riêng cho các hình ảnh Docker của bạn có thể truy cập được từ mọi dự án Google Cloud (cũng như từ bên ngoài Google Cloud Platform) :

docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1

Nếu mọi việc suôn sẻ và sau một thời gian, bạn sẽ có thể thấy hình ảnh vùng chứa được liệt kê trong mục Đăng ký vùng chứa. Đến đây, bạn đã có hình ảnh Docker trên toàn dự án mà Kubernetes có thể truy cập và sắp xếp như bạn sẽ thấy sau vài phút.

576374602b52f4e4.pngs

Nếu muốn, bạn có thể di chuyển qua những hình ảnh vùng chứa vì chúng được lưu trữ trong Google Cloud Storage bằng cách truy cập vào đường liên kết này: https://console.cloud.google.com/storage/browser/ (đường liên kết đầy đủ sẽ có dạng sau: https://console.cloud.google.com/project/PROJECT_ID/storage/browser/).

6. Tạo cụm Kubernetes

Được rồi. Giờ đây, bạn đã sẵn sàng tạo cụm GKE. Tuy nhiên, trước đó, hãy chuyển đến mục Google Kubernetes Engine của bảng điều khiển web rồi đợi hệ thống khởi động (chỉ mất vài giây).

d5f6e3c267feea1a.png

Một cụm bao gồm một máy chủ API chính của Kubernetes do Google quản lý và một tập hợp các nút worker. Các nút worker là máy ảo Compute Engine.

Hãy sử dụng CLI gcloud trong phiên CloudShell của bạn để tạo một cụm. Điều chỉnh vùng của bạn đến vị trí gần bạn ( danh sách các vùng). Quá trình này sẽ mất vài phút để hoàn tất:

gcloud container clusters create hello-dotnet-cluster --cluster-version=latest --num-nodes 4 --zone europe-west1-b

Cuối cùng, bạn sẽ thấy cụm đã tạo.

Creating cluster hello-dotnet-cluster...done.
Created [https://container.googleapis.com/v1/projects/dotnet-atamel/zones/europe-west1-b/clusters/hello-dotnet-cluster].
kubeconfig entry generated for hello-dotnet-cluster.
NAME                  ZONE            MASTER_VERSION  
hello-dotnet-cluster  europe-west1-b  1.10.7-gke.6

Giờ đây, bạn sẽ có một cụm Kubernetes với đầy đủ chức năng do Google Kubernetes Engine cung cấp:

eefb8d9b7f39598b.png

Đã đến lúc triển khai ứng dụng trong vùng chứa của riêng bạn cho cụm Kubernetes! Từ giờ trở đi, bạn sẽ sử dụng dòng lệnh kubectl (đã thiết lập trong môi trường Cloud Shell). Phần còn lại của lớp học lập trình này yêu cầu cả phiên bản ứng dụng và máy chủ của kubernetes đều phải từ 1.2 trở lên. kubectl version sẽ cho bạn thấy phiên bản hiện tại của lệnh.

7. Tạo quá trình triển khai

Nhóm kubernetes là một nhóm các vùng chứa, được liên kết với nhau nhằm mục đích quản trị và kết nối mạng. Nó có thể chứa một hoặc nhiều vùng chứa. Tại đây, bạn chỉ cần sử dụng một vùng chứa được tạo bằng hình ảnh ASP.NET Core được lưu trữ trong sổ đăng ký vùng chứa riêng của bạn. Cổng này sẽ phân phát nội dung trên cổng 8080.

Tạo tệp hello-dotnet.yaml bằng trình chỉnh sửa bạn yêu thích (vim, nano,emacs hoặc trình soạn thảo mã của Cloud Shell) và xác định Triển khai Kubernetes cho nhóm:

apiVersion: apps/v1
kind: Deployment
metadata:
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
spec:
  replicas: 1
  selector:
    matchLabels:
      run: hello-dotnet
  template:
    metadata:
      labels:
        run: hello-dotnet
    spec:
      containers:
      - name: hello-dotnet
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Triển khai cho không gian tên mặc định bằng kubectl:

kubectl apply -f hello-dotnet.yaml
deployment.apps/hello-dotnet created

Như bạn có thể thấy, bạn đã tạo một đối tượng implementation (triển khai). Bạn nên sử dụng triển khai để tạo và mở rộng các nhóm. Ở đây, quy trình triển khai mới quản lý một bản sao nhóm duy nhất chạy hình ảnh hello-dotnet:v1.

Để xem phiên bản triển khai bạn vừa tạo, bạn chỉ cần chạy:

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   1         1         1            1           37s

Để xem nhóm được tạo bởi quá trình triển khai, hãy chạy lệnh sau:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-ztzrb   1/1       Running   0          57s

Bây giờ là thời điểm thích hợp để chạy qua một số lệnh kubectl thú vị (không có lệnh nào trong số này sẽ thay đổi trạng thái của cụm, tài liệu đầy đủ có tại đây):

kubectl get pods
kubectl cluster-info
kubectl config view
kubectl get events
kubectl logs <pod-name>

Tại thời điểm này, bạn nên chạy vùng chứa dưới sự kiểm soát của Kubernetes nhưng vẫn phải làm cho vùng chứa có thể tiếp cận với thế giới bên ngoài.

8. Cho phép lưu lượng truy cập bên ngoài

Theo mặc định, chỉ IP nội bộ của nhóm trong cụm mới có thể truy cập vào nhóm. Để có thể truy cập vào vùng chứa hello-dotnet từ bên ngoài mạng ảo kubernetes, bạn phải hiển thị nhóm quảng cáo dưới dạng một dịch vụ của kubernetes.

Trên Cloud Shell, bạn có thể hiển thị nhóm này trên Internet công cộng bằng lệnh kubectl expose kết hợp với cờ --type="LoadBalancer". Cờ này là bắt buộc để tạo IP có thể truy cập từ bên ngoài :

kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080

Cờ dùng trong lệnh này chỉ rõ rằng bạn sẽ sử dụng trình cân bằng tải do cơ sở hạ tầng cơ bản cung cấp (trong trường hợp này là Trình cân bằng tải của Compute Engine). Xin lưu ý rằng bạn sẽ hiển thị quá trình triển khai chứ không phải trực tiếp cho nhóm. Điều này sẽ khiến dịch vụ cuối cùng cân bằng lưu lượng truy cập trên tất cả các nhóm được triển khai quản lý (trong trường hợp này, chỉ có 1 nhóm, nhưng bạn sẽ thêm các bản sao khác sau).

Bậc thầy Kubernetes tạo trình cân bằng tải và các quy tắc chuyển tiếp Compute Engine, nhóm mục tiêu và quy tắc tường lửa có liên quan để giúp người dùng có thể sử dụng dịch vụ hoàn toàn từ bên ngoài Google Cloud Platform.

Để tìm địa chỉ IP có thể truy cập công khai của dịch vụ, bạn chỉ cần yêu cầu kubectl liệt kê tất cả các dịch vụ cụm:

kubectl get services
NAME         CLUSTER-IP     EXTERNAL-IP      PORT(S)    AGE
hello-dotnet 10.3.253.62   104.155.20.69   8080/TCP    1m
kubernetes   10.3.240.1     <none>           443/TCP    5m

Lưu ý rằng có 2 địa chỉ IP được liệt kê cho dịch vụ của bạn, cả hai đều cung cấp cổng 8080. Một là IP nội bộ chỉ hiển thị trong mạng ảo trên đám mây của bạn; hai là IP cân bằng tải bên ngoài. Trong ví dụ này, địa chỉ IP bên ngoài là 104.155.20.69.

Bây giờ, bạn có thể truy cập dịch vụ bằng cách trỏ trình duyệt của bạn tới địa chỉ sau: http://<EXTERNAL_IP>:8080

6b053874002827fe.pngS

Tại thời điểm này, bạn đã có được ít nhất một số tính năng từ việc di chuyển sang vùng chứa và Kubernetes. Bạn không cần chỉ định máy chủ nào sẽ chạy khối lượng công việc của mình và bạn cũng có thể hưởng lợi từ việc giám sát và khởi động lại dịch vụ. Hãy xem bạn có thể thu được những lợi ích gì khác từ cơ sở hạ tầng Kubernetes mới của mình.

9. Mở rộng quy mô dịch vụ

Một trong những tính năng mạnh mẽ mà Kubernetes cung cấp là dễ dàng mở rộng quy mô ứng dụng. Giả sử đột nhiên bạn cần thêm dung lượng cho ứng dụng của mình; bạn chỉ cần yêu cầu bộ kiểm soát sao chép quản lý số lượng bản sao mới cho nhóm của mình:

kubectl scale deployment hello-dotnet --replicas=4
kubectl get deployment
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         4         4            3           16m
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m
hello-dotnet-714049816-sh812   1/1       Running   0          1m
hello-dotnet-714049816-ztzrb   1/1       Running   0          16m

Lưu ý về phương pháp khai báo ở đây – thay vì bắt đầu hoặc dừng các thực thể mới, bạn sẽ khai báo số lượng thực thể sẽ chạy tại mọi thời điểm. Vòng lặp điều chỉnh của Kubernetes chỉ cần đảm bảo rằng thông tin thực tế khớp với yêu cầu của bạn và xử lý nếu cần.

Dưới đây là sơ đồ tóm tắt trạng thái của cụm Kubernetes:

6af0243662464ca9.pngS

Bạn cũng có thể thu hẹp quy mô dịch vụ của mình rất dễ dàng. Sau đây là cách bạn giảm quy mô từ 4 nhóm xuống 2 nhóm.

kubectl scale deployment hello-dotnet --replicas=2
kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

10. Kiểm tra khả năng phục hồi

Kubernetes (hay cụ thể hơn là ReplicaSet) theo dõi các nhóm của bạn và nếu nhóm bị lỗi và nhóm bị ngừng hoạt động, thì nhóm sẽ tạo ngay một nhóm mới. Hãy cùng kiểm thử và xem cách hoạt động.

Trước tiên, hãy lấy danh sách các nhóm:

kubectl get pods
NAME                         READY     STATUS    RESTARTS   AGE
hello-dotnet-714049816-g4azy   1/1       Running   0          1m
hello-dotnet-714049816-rk0u6   1/1       Running   0          1m

Xoá một trong các nhóm bằng cách truyền tên nhóm:

kubectl delete pod hello-dotnet-714049816-g4azy

Nếu xem lại danh sách nhóm, bạn sẽ thấy một nhóm mới được tạo và chạy lại ngay lập tức:

kubectl get pods
NAME                         READY     STATUS           RESTARTS   AGE
hello-dotnet-714049816-abczy   1/1    ContainerCreating  0          1m
hello-dotnet-714049816-rk0u6   1/1    Running            0          1m

11. Ra mắt bản nâng cấp cho dịch vụ của bạn

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.

f487389b8b1cc105.png

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 

Giờ đây, bạn đã sẵn sàng để Kubernetes cập nhật bộ điều khiển sao chép lên phiên bản mới một cách suôn sẻ. Để thay đổi nhãn hình ảnh cho vùng chứa đang chạy, bạn cần chỉnh sửa hello-dotnet deployment hiện tại và thay đổi hình ảnh từ gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1 thành gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v2.

Để thực hiện việc này, bạn cần sử dụng lệnh kubectl edit. Thao tác này sẽ mở một trình chỉnh sửa văn bản cho thấy toàn bộ cấu hình yaml triển khai. Bạn không cần phải hiểu cấu hình yaml đầy đủ ngay bây giờ, mà chỉ cần hiểu rằng bằng cách cập nhật trường spec.template.spec.containers.image trong cấu hình, bạn đang yêu cầu triển khai cập nhật các nhóm để sử dụng hình ảnh mới.

kubectl edit deployment hello-dotnet
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: 2017-01-06T10:05:28Z
  generation: 3
  labels:
    run: hello-dotnet
  name: hello-dotnet
  namespace: default
  resourceVersion: "151017"
  selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/hello-dotnet
  uid: 981fe302-f1e9-11e5-9a78-42010af00005
spec:
  replicas: 4
  selector:
    matchLabels:
      run: hello-dotnet
  strategy:
    rollingUpdate:
      maxSurge: 1
      maxUnavailable: 1
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        run: hello-dotnet
    spec:
      containers:
      - image: gcr.io/PROJECT_ID/hello-dotnet:v1 # Update this line
        imagePullPolicy: IfNotPresent
        name: hello-dotnet
        ports:
        - containerPort: 8080
          protocol: TCP
        resources: {}
        terminationMessagePath: /dev/termination-log
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      securityContext: {}
      terminationGracePeriodSeconds: 30

Sau khi thực hiện thay đổi, hãy lưu và đóng tệp (thao tác này sử dụng vi, vì vậy, nhấn "Esc" sau đó nhập :wq và nhấn phím "Enter").

deployment "hello-dotnet" edited

Thao tác này sẽ cập nhật hoạt động triển khai bằng hình ảnh mới, khiến các nhóm mới được tạo với hình ảnh mới và các nhóm cũ sẽ bị xoá.

kubectl get deployments
NAME         DESIRED   CURRENT   UP-TO-DATE   AVAILABLE   AGE
hello-dotnet   4         5         4            3           1h

Trong khi quá trình này diễn ra, người dùng các dịch vụ sẽ không thấy bất kỳ sự gián đoạn nào. Sau giây lát, họ sẽ bắt đầu truy cập vào phiên bản mới của ứng dụng.

fb9f41e814dda653.png

Bạn có thể xem thêm thông tin chi tiết về nội dung cập nhật được cập nhật trong tài liệu về Kerberos.

Hy vọng với những tính năng triển khai, mở rộng và cập nhật này, bạn sẽ đồng ý rằng sau khi thiết lập môi trường (cụm GKE/Kubernetes tại đây), Kubernetes có thể giúp bạn tập trung vào ứng dụng thay vì quản lý cơ sở hạ tầng.

12. Cloud Build

Cho đến nay, chúng tôi đang xây dựng các vùng chứa bằng các lệnh Docker thông thường (bản dựng docker ...) và sau đó đẩy hình ảnh theo cách thủ công vào Sổ đăng ký vùng chứa của Google Cloud Platform. Bạn cũng có thể trì hoãn cả hai bước cho Cloud Build phía máy chủ. Phương thức này có thể tạo và đẩy hình ảnh vùng chứa mà không cần cài đặt Docker cục bộ.

Trước tiên, hãy bật Cloud Build API trong API Manager > Thư viện. Tìm Cloud Build, rồi nhấp vào Cloud Build API:

f8b0239fa7719f29.png

Nhấp vào Bật API nếu chưa bật. Cuối cùng, bạn sẽ thấy API được bật như sau:

ea6053f9603613b5.png

Sau khi bật Cloud Build API, bạn có thể chạy lệnh sau để tạo và đẩy hình ảnh của mình tất cả từ dịch vụ Trình tạo vùng chứa:

$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3

Hình ảnh được tự động lưu trữ trên Container Registry.

13. Chạy trang tổng quan đồ hoạ của Kubernetes

Với các phiên bản gần đây của Kubernetes, chúng tôi đã ra mắt giao diện người dùng web đồ hoạ (trang tổng quan). Giao diện người dùng này cho phép bạn bắt đầu nhanh chóng và hỗ trợ một số chức năng có trong CLI như một cách tương tác với hệ thống dễ tiếp cận và dễ khám phá hơn.

Để định cấu hình quyền truy cập vào trang tổng quan của cụm Kubernetes, hãy nhập các lệnh sau trong cửa sổ Cloud Shell :

gcloud container clusters get-credentials hello-dotnet-cluster \
    --zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081

Sau đó, sử dụng tính năng xem trước Cloud Shell một lần nữa để chuyển đến cổng 8081:

port8081.png

Thao tác này sẽ chuyển bạn đến điểm cuối của API. Bạn có thể nhận được thông báo "Chưa được uỷ quyền" nhưng đừng lo lắng về nó. Để truy cập trang tổng quan, hãy xoá "?authuser=3" và thay thế bằng "/ui".

Sử dụng trang tổng quan đồ hoạ của Kubernetes và sử dụng trang tổng quan này để triển khai các ứng dụng trong vùng chứa, cũng như để giám sát và quản lý các cụm của bạn!

177789527b650f6b.png.

Ngoài ra, bạn có thể truy cập trang tổng quan từ máy phát triển hoặc máy cục bộ bằng cách sử dụng các hướng dẫn tương tự được cung cấp khi bạn nhấn nút "Kết nối" từ Bảng điều khiển web cho cụm bạn muốn giám sát.

da1ccc707dd6647.png

a51c7160e237f32f.png

Khi đã hoàn tất với trang tổng quan, bạn có thể Control + C để dừng proxy. Tìm hiểu thêm về trang tổng quan Kubernetes bằng cách xem Tham quan trang tổng quan.

14. Ghi nhật ký

Bạn có thể dùng lệnh kubectl logs để truy xuất nhật ký của một vùng chứa chạy bên trong Kubernetes. Khi bạn sử dụng Google Kubernetes Engine để chạy các cụm Kubernetes được quản lý, tất cả nhật ký sẽ tự động được chuyển tiếp và lưu trữ trong Google Cloud Logging. Bạn có thể xem tất cả đầu ra nhật ký từ các nhóm bằng cách chuyển đến StackdriverLogging → Logs (Ghi nhật ký → Nhật ký) trong bảng điều khiển Google Cloud:

b63159b959ba5010.png

Sau khi truy cập vào bảng điều khiển ghi nhật ký, bạn có thể chuyển đến Vùng chứa của GKE để xem tất cả nhật ký được thu thập từ STDOUT:

43e9aab3e02358d5.pngS

Từ đây, bạn có thể xuất nhật ký vào Google BigQuery (không bắt buộc) để phân tích thêm nhật ký hoặc thiết lập cảnh báo dựa trên nhật ký. Chúng tôi sẽ không làm việc này trong phòng thí nghiệm hôm nay.

15. Xin chúc mừng!

Đến đây, chúng tôi xin khép lại lớp học lập trình đơn giản về cách bắt đầu sử dụng ASP.NET Core và Kubernetes này. Chúng tôi mới chỉ mới tìm hiểu sơ qua về công nghệ này. Bạn nên tìm hiểu thêm qua các nhóm, bộ điều khiển sao chép và dịch vụ của riêng mình. Bạn cũng có thể dùng các thiết bị thăm dò trực tiếp (kiểm tra tình trạng) và cân nhắc trực tiếp sử dụng Kubernetes API.

Dọn dẹp

Vậy là xong! Thời gian để dọn dẹp các tài nguyên được sử dụng (để tiết kiệm chi phí và trở thành một công dân tốt của công nghệ đám mây).

Xoá Triển khai (cũng sẽ xoá các nhóm đang chạy) và Dịch vụ (cũng xoá trình cân bằng tải bên ngoài của bạn):

Trước tiên, hãy xoá dịch vụ và quy trình triển khai. Thao tác này cũng sẽ xoá trình cân bằng tải bên ngoài của bạn:

kubectl delete service,deployment hello-dotnet
service "hello-dotnet" deleted
deployment "hello-dotnet" deleted

Tiếp theo, hãy xoá cụm của bạn:

gcloud container clusters delete hello-dotnet-cluster --zone=europe-west1-b
The following clusters will be deleted.
 - [hello-dotnet-cluster] in [europe-west1-b]
Do you want to continue (Y/n)?  Y
Deleting cluster hello-dotnet-cluster...done.                                                                                                                                                                                            
Deleted [https://container.googleapis.com/v1/projects/<PROJECT_ID>/zones/europe-west1-b/clusters/hello-dotnet-cluster].

Thao tác này sẽ xoá tất cả phiên bản Google Compute Engine đang chạy cụm.

Cuối cùng, xoá bộ chứa lưu trữ sổ đăng ký Docker đang lưu trữ(các) hình ảnh của bạn:

gsutil ls
gs://artifacts.<PROJECT_ID>.appspot.com/
gsutil rm -r gs://artifacts.${GOOGLE_CLOUD_PROJECT}.appspot.com/
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...
Removing gs://artifacts.<PROJECT_ID>.appspot.com/...

Tất nhiên, bạn cũng có thể xoá toàn bộ dự án nhưng sẽ mất mọi thông tin thanh toán bạn đã thực hiện (bắt buộc phải tắt tính năng thanh toán cho dự án trước tiên). Ngoài ra, việc xoá dự án sẽ chỉ dừng tất cả các khoản thanh toán sau khi kết thúc chu kỳ thanh toán hiện tại.

Nội dung đã đề cập

  • Cách đóng gói một ứng dụng ASP.NET Core đơn giản dưới dạng vùng chứa Docker.
  • Cách tạo cụm Kubernetes trên Google Kubernetes Engine.
  • Cách triển khai ứng dụng ASP.NET Core cho một nhóm.
  • Cách cho phép lưu lượng truy cập từ bên ngoài vào nhóm của bạn.
  • Cách mở rộng quy mô dịch vụ và triển khai bản nâng cấp.
  • Cách chạy trang tổng quan đồ hoạ của Kubernetes.

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.