1. Tổng quan
ASP.NET Core là một khung mới, nguồn mở và đa nền tảng để xây dựng các ứng dụng hiện đại dựa trên đám mây và có kết nối Internet bằng ngôn ngữ lập trình C#.
Kubernetes là một dự án mã nguồn mở có thể chạy trong nhiều môi trường khác nhau, từ máy tính xách tay đến các cụm nhiều nút có tính sẵn sàng cao, từ đám mây công cộng đến các triển khai tại cơ sở hạ tầng riêng, từ máy ảo đến máy chủ vật lý.
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 vào Kubernetes đang 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 Tạo và chạy ứng dụng ASP.NET Core từ Google Cloud Shell. Bạn nên thực hiện bài thực hành đó trước khi thử bài thực hành này.
Mục tiêu của lớp học lập trình này là giúp bạn chuyển đổi mã (một ứng dụng ASP.NET Core Hello World đơn giản) thành một ứng dụng được sao chép chạy trên Kubernetes. Bạn lấy mã mà bạn đã phát triển trên máy của mình, chuyển mã đó thành một hình ảnh vùng chứa Docker, rồi chạy hình ảnh đó trên Google Kubernetes Engine.
Sau đây là sơ đồ về các phần khác nhau trong lớp học lập trình này để giúp bạn hiểu cách các phần khớp với nhau. Hãy dùng danh sách này làm tài liệu tham khảo khi bạn tham gia lớp học lập trình; mọi thứ sẽ trở nên rõ ràng khi bạn hoàn thành lớp học lập trình (nhưng bạn có thể bỏ qua danh sách này ở thời điểm hiện tại).

Trong phạm vi 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 (một phiên bản Kubernetes do Google lưu trữ chạy trên Compute Engine) cho phép bạn tập trung 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 tìm hiểu về Minikube. Điều này giúp thiết lập đơn giản một cụm Kubernetes có một nút cho mục đích phát triển và kiểm thử. Bạn có thể sử dụng Minikube để thực hiện 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 một 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 vào một nhóm.
- Cách cho phép lưu lượng truy cập bên ngoài vào nhóm của bạn.
- Cách mở rộng quy mô dịch vụ và ra mắt bản nâng cấp.
- Cách chạy trang tổng quan đồ hoạ Kubernetes.
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 của mình với Google Cloud Platform?
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
- Đăng nhập vào Google 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 Google Workspace, bạn phải tạo một tài khoản.



- 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ự mà các API của Google không 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 trên tất cả các dự án trên Google Cloud và không thể thay đổi (bạn không thể thay đổi sau khi đã đặt). Cloud Console sẽ tự động tạo một chuỗi duy nhất; thường thì bạn không cần quan tâm đến chuỗi này. 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 (thường được xác định là
PROJECT_ID). Nếu không thích mã nhận dạng được tạo, bạn có thể tạo một mã nhận dạng ngẫu nhiên khác. Hoặc bạn có thể thử tên người dùng của riêng mình để xem tên đó có dùng được hay không. Bạn không thể thay đổi thông tin này sau bước này và thông tin này sẽ giữ nguyên trong suốt thời gian diễn ra dự án. - Để bạn biết, có một giá trị thứ ba là Số dự án mà một số API sử dụng. Tìm hiểu thêm về cả 3 giá trị này trong tài liệu.
- 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/API trên 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ó. Để tắt các tài nguyên nhằm tránh phát sinh phí thanh toán ngoài hướng dẫn này, bạn có thể xoá các tài nguyê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í 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 trên Cloud.
Kích hoạt Cloud Shell
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell
.

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:

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

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.
- 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`
- 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
Đầ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. Tạo một ứng dụng ASP.NET Core trong Cloud Shell
Trong dấu nhắc Cloud Shell, bạn có thể xác minh rằng công cụ dòng lệnh dotnet đã được cài đặt bằng cách kiểm tra phiên bản của công cụ này. Lệnh 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 một ứng dụng web ASP.NET Core cơ bản.
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 sắp chạy xong ứ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, hãy nhấp vào nút xem trước trên web ở trên cùng bên phải rồi chọn "Xem trước trên cổng 8080".

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

Sau khi bạn xác minh rằng ứng dụng đang chạy, hãy nhấn Ctrl+C để tắt ứng dụng.
5. Đóng gói ứng dụng ASP.NET Core dưới dạng một vùng chứa Docker
Tiếp theo, hãy chuẩn bị ứng dụng để chạy dưới dạng một 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 vào Dockerfile bằng trình chỉnh sửa mà 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 là cổng mà ứng dụng lắ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 thiết lập biến môi trường ASPNETCORE_URLS. Các ứng dụng ASP.NET Core sẽ dùng biến này để xác định cổng cần theo dõi.
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 một chút thời gian để tải xuống và trích xuất mọi thứ), bạn có thể thấy hình ảnh được tạo và lưu cục 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. Lệnh này sẽ chạy một vùng chứa Docker cục bộ trên cổng 8080 từ hình ảnh vùng chứa bạn vừa tạo:
docker run -p 8080:8080 gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Và một lần nữa, hãy tận dụng tính năng Xem trước trên web của Cloud Shell :

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

Sau khi xác minh rằng ứng dụng đang chạy bình thường trên một vùng chứa Docker cục bộ, bạn có thể dừng vùng chứa đang chạy bằng cách nhấn Ctrl-> C.
Giờ đây, khi hình ảnh hoạt động như mong đợi, bạn có thể đẩy hình ảnh đó vào Google Container Registry, một kho lưu trữ riêng cho các hình ảnh Docker của bạn mà mọi dự án trên đám mây của Google đều có thể truy cập (nhưng cũng có thể truy cập từ bên ngoài Google Cloud Platform) :
docker push gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v1
Nếu không có vấn đề gì xảy ra và sau một thời gian ngắn, bạn sẽ thấy hình ảnh vùng chứa xuất hiện trong phần Container Registry (Sổ đăng ký vùng chứa). Lúc này, bạn đã có một hình ảnh Docker trên toàn dự án mà Kubernetes có thể truy cập và điều phối như bạn sẽ thấy trong vài phút nữa.

Nếu muốn tìm hiểu, bạn có thể di chuyển qua các hình ảnh vùng chứa khi 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 đủ thu được sẽ có dạng như 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 phần Google Kubernetes Engine của bảng điều khiển trên web và đợi hệ thống khởi tạo (quá trình này chỉ mất vài giây).

Một cụm bao gồm một máy chủ API chính Kubernetes do Google quản lý và một nhóm 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 Cloud Shell để tạo một cụm. Điều chỉnh vùng của bạn thành một nơi nào đó 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 đã được 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 hoạt động đầy đủ nhờ Google Kubernetes Engine:

Giờ là lúc bạn triển khai ứng dụng được chứa trong vùng chứa của riêng mình vào cụm Kubernetes! Từ giờ trở đi, bạn sẽ sử dụng dòng lệnh kubectl (đã được 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 máy chủ và ứng dụng kubernetes đều phải là 1.2 trở lên. kubectl version sẽ cho bạn biết phiên bản hiện tại của lệnh.
7. Tạo quá trình triển khai
Pod của Kubernetes là một nhóm các vùng chứa, được liên kết với nhau cho mục đích quản trị và kết nối mạng. Vùng chứa này có thể chứa một hoặc nhiều vùng chứa. Ở đâ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 tư. Nó 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 mà 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 Kubernetes Deployment 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 vào 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 thấy, bạn đã tạo một đối tượng deployment (triển khai). Triển khai là cách được đề xuất để tạo và mở rộng quy mô nhóm pod. Ở đây, một hoạt động triển khai mới sẽ quản lý một bản sao nhóm duy nhất đang chạy hình ảnh hello-dotnet:v1.
Để xem bản triển khai mà bạn vừa tạo, chỉ cần chạy:
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE hello-dotnet 1 1 1 1 37s
Để xem pod do quy trình triển khai tạo, 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 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, bạn có thể xem toàn bộ tài liệu 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 sẽ có vùng chứa đang chạy dưới sự kiểm soát của Kubernetes nhưng vẫn phải cho phép thế giới bên ngoài truy cập vào vùng chứa đó.
8. Cho phép lưu lượng truy cập bên ngoài
Theo mặc định, chỉ có thể truy cập vào nhóm bằng IP nội bộ trong cụ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ị pod dưới dạng một dịch vụ kubernetes.
Từ Cloud Shell, bạn có thể hiển thị nhóm cho Internet công cộng bằng lệnh kubectl expose kết hợp với cờ --type="LoadBalancer". Bạn cần có cờ này để tạo một IP có thể truy cập từ bên ngoài :
kubectl expose deployment hello-dotnet --type="LoadBalancer" --port=8080
Cờ được dùng trong lệnh này chỉ định 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 Compute Engine). Xin lưu ý rằng bạn sẽ hiển thị việc triển khai chứ không phải pod một cách trực tiếp. Điều này sẽ khiến dịch vụ kết quả cân bằng tải lưu lượng truy cập trên tất cả các nhóm do quá trình triển khai quản lý (trong trường hợp này chỉ có 1 nhóm, nhưng sau này bạn sẽ thêm nhiều bản sao hơn).
Kubernetes master tạo bộ cân bằng tải và các quy tắc chuyển tiếp, nhóm mục tiêu và quy tắc tường lửa liên quan của Compute Engine để giúp dịch vụ có thể truy cập 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ủa 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
Xin lưu ý rằng có 2 địa chỉ IP được liệt kê cho dịch vụ của bạn, cả hai đều phục vụ cổng 8080. Một là IP nội bộ chỉ hiển thị bên trong mạng ảo trên đám mây của bạn; còn lại là IP bên ngoài được cân bằng tải. Trong ví dụ này, địa chỉ IP ngoài là 104.155.20.69.
Giờ đây, bạn có thể truy cập vào dịch vụ bằng cách chuyển trình duyệt đến địa chỉ này: http://<EXTERNAL_IP>:8080

Đến thời điểm này, bạn đã có ít nhất một số tính năng khi chuyển sang vùng chứa và Kubernetes – bạn không cần chỉ định máy chủ lưu trữ nào để chạy khối lượng công việc của mình, đồng thời bạn cũng được 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ể khai thác những lợi ích nào khác từ cơ sở hạ tầng Kubernetes mới.
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à khả năng dễ dàng mở rộng quy mô ứng dụng của bạn. Giả sử bạn đột nhiê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ộ điều khiển sao chép quản lý một số lượng bản sao mới cho nhóm của bạn:
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 ý phương pháp khai báo ở đây – thay vì bắt đầu hoặc dừng các phiên bản mới, bạn khai báo số lượng phiên bản sẽ chạy mọi lúc. Vòng lặp điều phối Kubernetes chỉ cần đảm bảo rằng thực tế khớp với những gì bạn yêu cầu và thực hiện hành động nếu cần.
Sau đây là sơ đồ tóm tắt trạng thái của cụm Kubernetes:

Bạn cũng có thể giảm quy mô dịch vụ một cách dễ dàng. Sau đây là cách bạn giảm quy mô từ 4 nhóm thành 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. Khả năng phục hồi khi thử nghiệm
Kubernetes (hoặc cụ thể hơn là ReplicaSet) sẽ theo dõi các pod của bạn và nếu có vấn đề với pod và pod đó ngừng hoạt động, thì Kubernetes sẽ tạo ngay một pod mới. Hãy thử tính năng này để 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 các pod, bạn sẽ thấy một pod 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
Đế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.

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
Giờ đây, bạn đã sẵn sàng để Kubernetes cập nhật bộ điều khiển sao chép một cách suôn sẻ lên phiên bản mới của ứng dụng. Để 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 có 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 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 hiển thị cấu hình yaml triển khai đầy đủ. Bạn không cần hiểu toàn bộ cấu hình yaml ngay bây giờ, thay vào đó, 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 quá trình triển khai cập nhật các pod để 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 thay đổi, hãy lưu và đóng tệp (thao tác này sử dụng vi, vì vậy hãy nhấn "Esc" rồi nhập :wq và nhấn phím "Enter").
deployment "hello-dotnet" edited
Thao tác này sẽ cập nhật việc triển khai bằng hình ảnh mới, khiến các nhóm mới được tạo bằng hình ảnh mới và các nhóm cũ bị xoá.
kubectl get deployments
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
hello-dotnet 4 5 4 3 1h
Trong quá trình này, người dùng các dịch vụ sẽ không gặp phải tình trạng gián đoạn nào. Sau một thời gian ngắn, họ sẽ bắt đầu truy cập vào phiên bản mới của ứng dụng.

Bạn có thể tìm thêm thông tin chi tiết về các bản cập nhật từng bước trong tài liệu về Kubernetes.
Hy vọng rằng với các tính năng triển khai, mở rộng quy mô 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 của bạn ở đây), Kubernetes có thể giúp bạn tập trung vào ứng dụng của mình thay vì quản lý cơ sở hạ tầng.
12. Cloud Build
Cho đến nay, chúng ta đã tạo các vùng chứa bằng các lệnh Docker thông thường (docker build ...), sau đó đẩy hình ảnh vào Container Registry của Google Cloud Platform theo cách thủ công. Bạn cũng có thể trì hoãn cả hai bước này sang phía máy chủ Cloud Build. Cloud Build 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 > Library (Trình quản lý API > Thư viện). Tìm Cloud Build, nhấp vào Cloud Build API:

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

Sau khi bật Cloud Build API, bạn có thể chạy lệnh sau để tạo và đẩy hình ảnh từ dịch vụ Container Builder:
$ gcloud builds submit --tag gcr.io/${GOOGLE_CLOUD_PROJECT}/hello-dotnet:v3
Hình ảnh sẽ tự động được lưu trữ trên Container Registry.
13. Chạy trang tổng quan đồ hoạ Kubernetes
Với các phiên bản Kubernetes gần đây, một giao diện người dùng đồ hoạ trên web (bảng điều khiển) đã được giới thiệu. Giao diện người dùng này giúp bạn bắt đầu nhanh chóng và cho phép một số chức năng có trong CLI dưới dạng một cách tương tác dễ tiếp cận và dễ khám phá hơn với hệ thống.
Để định cấu hình quyền truy cập vào trang tổng quan của cụm Kubernetes, trong cửa sổ Cloud Shell, hãy nhập các lệnh sau :
gcloud container clusters get-credentials hello-dotnet-cluster \
--zone europe-west1-b --project ${GOOGLE_CLOUD_PROJECT}
kubectl proxy --port 8081
Sau đó, hãy sử dụng lại tính năng xem trước Cloud Shell để chuyển đến cổng 8081:

Thao tác này sẽ đưa bạn đến điểm cuối API. Bạn có thể thấy trang "Không được phép" nhưng đừng lo lắng về điều đó. Để chuyển đến trang tổng quan, hãy xoá "?authuser=3" và thay thế bằng "/ui".
Tận hưởng bảng điều khiển đồ hoạ Kubernetes và sử dụng bảng điều khiển này để triển khai các ứng dụng được chứa trong vùng chứa, cũng như để giám sát và quản lý các cụm của bạn!

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


Sau khi hoàn tất việc sử dụng trang tổng quan, bạn có thể nhấn tổ hợp phím Control + C để dừng proxy. Tìm hiểu thêm về trang tổng quan Kubernetes bằng cách tham gia chuyến 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 đang chạy 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ả thông tin đầu ra của nhật ký từ các nhóm bằng cách chuyển đến Stackdriver → Logging → Logs (Ghi nhật ký → Nhật ký) trong bảng điều khiển Cloud:

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

Từ đây, bạn có thể tuỳ ý xuất nhật ký vào Google BigQuery để phân tích nhật ký sâu hơn hoặc thiết lập cảnh báo dựa trên nhật ký. Hôm nay, chúng ta sẽ không làm việc này trong phòng thí nghiệm.
15. Xin chúc mừng!
Đến đây là kết thúc lớp học lập trình đơn giản này về cách bắt đầu với ASP.NET Core và Kubernetes. Chúng ta mới chỉ tìm hiểu sơ bộ về công nghệ này. Bạn nên khám phá thêm bằng các nhóm, bộ điều khiển sao chép và dịch vụ của riêng mình, đồng thời kiểm tra các lệnh kiểm tra trạng thái (kiểm tra tình trạng) và cân nhắc sử dụng trực tiếp API Kubernetes.
Dọn dẹp
Vậy là xong! Đã đến lúc dọn dẹp một số tài nguyên đã dùng (để tiết kiệm chi phí và trở thành một công dân đám mây gương mẫu).
Xoá Deployment (cũng sẽ xoá các pod đang chạy) và Service (cũng sẽ xoá trình cân bằng tải bên ngoài):
Trước tiên, hãy xoá dịch vụ và quá trình triển khai. Thao tác này cũng sẽ xoá bộ 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ả các phiên bản Google Compute Engine đang chạy cụm.
Cuối cùng, hãy xoá vùng lưu trữ của sổ đăng ký Docker 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 chế độ thiết lập thông tin thanh toán mà bạn đã thực hiện (bạn phải tắt thông tin thanh toán của dự án trước). Ngoài ra, việc xoá dự án sẽ chỉ dừng tất cả hoạt động thanh toán sau khi chu kỳ thanh toán hiện tại kết thúc.
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 một 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 vào một nhóm.
- Cách cho phép lưu lượng truy cập bên ngoài vào nhóm của bạn.
- Cách mở rộng quy mô dịch vụ và ra mắt bản nâng cấp.
- Cách chạy trang tổng quan đồ hoạ Kubernetes.
Các bước tiếp theo
- Tìm hiểu thêm về Kubernetes ( http://kubernetes.io/).
- Tìm hiểu thêm về Windows trên Google Cloud Platform.
- Tìm hiểu thêm về .NET trên Google Cloud Platform.
- Tìm hiểu thêm về SQL Server trên Google Cloud Platform.
- Tìm hiểu thêm về Cloud Tools for Visual Studio.
- Tìm hiểu thêm về Cloud Tools for PowerShell.
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.