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

1. Tổng quan

ASP.NET Core là một khung 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à kết nối Internet bằng ngôn ngữ lập trình C#.

Kubernetes là một hệ thống nguồn mở dùng để tự động hoá việc triển khai, mở rộng quy mô và quản lý các ứng dụng trong vùng chứa. Istio là một khung mở giúp kết nối, bảo mật, quản lý và giám sát các dịch vụ.

Trong phần đầu tiên của 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 Google Kubernetes Engine (GKE) và định cấu hình ứng dụng này để Istio quản lý.

Trong phần thứ hai của phòng thí nghiệm này, bạn sẽ tìm hiểu thêm về các tính năng của Istio như chỉ số, hoạt động theo dõi, quản lý lưu lượng truy cập động, chèn lỗi và nhiều tính năng khác.

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

  • Cách tạo và đóng gói một ứng dụng ASP.NET Core đơn giản trong vùng chứa Docker.
  • Cách tạo cụm Kubernetes bằng Google Kubernetes Engine (GKE).
  • Cách cài đặt Istio trên một cụm Kubernetes trên GKE.
  • Cách triển khai ứng dụng ASP.NET Core và định cấu hình lưu lượng truy cập của ứng dụng để Istio quản lý.

Bạn cần có

Bạn sẽ sử dụng hướng dẫn này như thế nào?

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

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

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

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

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

  1. Đăng nhập vào Cloud Console rồi tạo dự án mới hoặc sử dụng lại dự án hiện có. Nếu chưa có tài khoản Gmail hoặc Google Workspace, bạn phải tạo một tài khoản.

96a9c957bc475304.pngs

b9a10ebdf5b5a448.png

a1e3c01a38fa61c2.png

Xin lưu ý rằng mã dự án là một tên riêng biệt trong tất cả dự án Google Cloud (tên ở trên đã được sử dụng nên sẽ không phù hợp với bạn!). Lớp này sẽ được đề cập sau trong lớp học lập trình này là PROJECT_ID.

  1. Tiếp theo, bạn sẽ cần bật tính năng thanh toán trong Cloud Console để sử dụng tài nguyên của Google Cloud.

Việc chạy qua lớp học lập trình này sẽ không tốn nhiều chi phí. Hãy nhớ làm theo mọi hướng dẫn trong phần "Dọn dẹp" sẽ tư vấn cho bạn cách tắt tài nguyên để bạn không phải chịu thanh toán ngoài hướng dẫn này. Người dùng mới của Google Cloud đủ điều kiện tham gia chương trình Dùng thử miễn phí 300 USD.

Khởi động Cloud Shell

Mặc dù bạn có thể vận hành Google Cloud từ xa trên máy tính xách tay, nhưng trong lớp học lập trình này, bạn sẽ sử dụng Google Cloud Shell, một môi trường dòng lệnh chạy trong Google Cloud.

Kích hoạt Cloud Shell

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

bce75f34b2c53987.png

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:

70f315d7b402b476.pngS

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

fbe3a0674c982259.png

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:

f579a9baedc108a9.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 trong 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:5.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:5.0-alpine 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.

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

73558f3a54ce1c0c.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/GKE bằng Istio

Trước tiên, hãy đảm bảo rằng bạn đã bật Kubernetes Engine API:

gcloud services enable container.googleapis.com

Tạo một cụm Kubernetes. Bạn có thể thay đổi khu vực thành một nơi nào đó gần bạn, nếu muốn:

gcloud container clusters create hello-istio \
  --cluster-version=latest \
  --machine-type=n1-standard-2 \
  --num-nodes=4 \
  --region europe-west1

Hãy đợi một chút trong khi cụm được thiết lập cho bạn. Thông tin này sẽ hiển thị trong phần Kubernetes Engine của bảng điều khiển Google Cloud Platform.

e46fd9c6ee82bcc4.png

Đối với lớp học lập trình này, chúng ta sẽ tải và cài đặt Istio qua istio.io. Bạn cũng có thể cài đặt các lựa chọn khác, trong đó có tiện ích bổ sung Istio cho GKEAnthos Service Mesh. Các bước áp dụng sau bước này sẽ hoạt động trên mọi bản cài đặt Istio.

Trước tiên, hãy tải ứng dụng mẫu và ứng dụng Istio xuống. Trang phát hành Istio cung cấp các cấu phần phần mềm tải xuống cho một số hệ điều hành. Trong trường hợp này, chúng ta có thể sử dụng một lệnh thuận tiện để tải xuống và trích xuất bản phát hành mới nhất cho nền tảng hiện tại:

curl -L https://istio.io/downloadIstio | sh -

Tập lệnh sẽ cho bạn biết phiên bản Istio đã được tải xuống:

Istio has been successfully downloaded into the istio-1.8.1 folder on your system.

Thư mục cài đặt chứa các ứng dụng mẫu và tệp nhị phân của ứng dụng istioctl. Thay đổi sang thư mục đó:

cd istio-1.8.1

Sao chép và dán lệnh được cung cấp để thêm thư mục bin vào PATH, nhờ đó bạn có thể sử dụng istioctl:

export PATH="$PATH:/home/<YOURHOMEID>/istio-1.8.1/bin"

Xác minh rằng istioctl đang hoạt động bằng cách kiểm tra xem cụm của bạn đã sẵn sàng cho Istio hay chưa:

istioctl x precheck

Bạn sẽ thấy một thông báo có nội dung Install Pre-Check passed! The cluster is ready for Istio installation.

Cài đặt Istio bằng hồ sơ minh hoạ:

istioctl install --set profile=demo

Istio hiện đã được cài đặt trong cụm của bạn.

Tự động chèn quảng cáo trợ giúp

Để bắt đầu sử dụng Istio, bạn không cần phải thay đổi gì trong ứng dụng. Khi bạn định cấu hình và chạy các dịch vụ, các tệp trợ giúp của Envoy sẽ tự động được đưa vào từng nhóm của dịch vụ.

Để làm được việc đó, bạn cần bật tính năng chèn trợ giúp cho không gian tên ("default") mà bạn sử dụng cho các dịch vụ vi mô của mình. Bạn có thể thực hiện việc này bằng cách áp dụng một nhãn:

kubectl label namespace default istio-injection=enabled

Để xác minh rằng nhãn đã được áp dụng thành công, hãy chạy lệnh sau:

kubectl get namespace -L istio-injection

Kết quả xác nhận rằng tính năng chèn trợ giúp đã được bật cho không gian tên mặc định:

NAME              STATUS   AGE    ISTIO-INJECTION
default           Active   3m     enabled
istio-system      Active   63s    disabled
...

7. Xác minh việc cài đặt

Istio cung cấp 3 dịch vụ: máy bay điều khiển istiod, cổng vào và cổng ra (bạn có thể coi đây là "các proxy trợ giúp cho phần còn lại của Internet") , có tên lần lượt là istio-ingressgatewayistio-egressgateway.

kubectl get svc -n istio-system

Kết quả của bạn sẽ có dạng như sau:

NAME                   TYPE           CLUSTER-IP      EXTERNAL-IP                                                                     AGE
istio-egressgateway    ClusterIP      10.55.252.182   <none>
istio-ingressgateway   LoadBalancer   10.55.250.185   35.233.118.42
istiod                 ClusterIP      10.55.253.217   <none>

Cổng vào Ingress có loại LoadBalancer nên có thể truy cập được từ Internet; các dữ liệu khác chỉ cần truy cập được từ bên trong cụm.

Tiếp theo, hãy đảm bảo rằng các nhóm Kubernetes tương ứng đã được triển khai, đồng thời tất cả các vùng chứa đều đang hoạt động:

kubectl get pods -n istio-system

Khi tất cả các nhóm đang chạy, bạn có thể tiếp tục.

NAME                                    READY   STATUS
istio-egressgateway-674988f895-m6tk4    1/1     Running
istio-ingressgateway-6996f7dcc8-7lvm2   1/1     Running
istiod-6bf5fc8b64-j79hj                 1/1     Running
  • istiod: máy bay điều khiển Istio. Xử lý cấu hình và lập trình của các tệp trợ giúp proxy, khám phá dịch vụ, phân phối chứng chỉ và chèn tệp trợ giúp
  • ingress gateway: Xử lý các yêu cầu đến từ bên ngoài cụm.
  • egress gateway: Xử lý các yêu cầu được gửi đến các điểm cuối bên ngoài cụm của bạn.

8. Triển khai ứng dụng

Giờ đây, khi xác minh rằng Istio đã được cài đặt và đang chạy, bạn có thể triển khai ứng dụng ASP.NET Core.

Triển khai và dịch vụ

Trước tiên, hãy tạo một tệp aspnetcore.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) rồi xác định Dịch vụ và Triển khai Kubernetes cho ứng dụng:

apiVersion: v1
kind: Service
metadata:
  name: aspnetcore-service
  labels:
    app: aspnetcore
spec:
  ports:
  - port: 8080
    name: http
  selector:
    app: aspnetcore
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: aspnetcore-v1
spec:
  replicas: 1
  selector:
    matchLabels:
      app: aspnetcore
      version: v1
  template:
    metadata:
      labels:
        app: aspnetcore
        version: v1
    spec:
      containers:
      - name: aspnetcore
        image: gcr.io/YOUR-PROJECT-ID/hello-dotnet:v1
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

Nội dung của tệp là các Bản triển khai và Dịch vụ tiêu chuẩn để triển khai ứng dụng và không chứa bất kỳ nội dung nào dành riêng cho Istio.

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

kubectl apply -f aspnetcore.yaml
service "aspnetcore-service" created
deployment.extensions "aspnetcore-v1" created

Xác minh rằng các nhóm đang chạy:

kubectl get pods
NAME                          READY     STATUS    RESTARTS   AGE
aspnetcore-v1-6cf64748-mddb   2/2       Running   0          34s

Cổng và dịch vụ ảo

Để cho phép lưu lượng truy cập vào lưới, bạn cần tạo CổngVirtualService.

Cổng vào định cấu hình trình cân bằng tải cho lưu lượng truy cập HTTP/TCP, thường hoạt động ở cạnh lưới để cho phép lưu lượng truy cập vào của một ứng dụng. VirtualService xác định các quy tắc kiểm soát cách định tuyến các yêu cầu cho một dịch vụ trong lưới dịch vụ Istio.

Tạo tệp aspnetcore-gateway.yaml để xác định Cổng vào:

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: aspnetcore-gateway
spec:
  selector:
    istio: ingressgateway # use istio default controller
  servers:
  - port:
      number: 80
      name: http
      protocol: HTTP
    hosts:
    - "*"

Tạo tệp aspnetcore-virtualservice.yaml để xác định VirtualService:

apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
  name: aspnetcore-virtualservice
spec:
  hosts:
  - "*"
  gateways:
  - aspnetcore-gateway
  http:
  - route:
    - destination:
        host: aspnetcore-service

Chạy lệnh kubectl để triển khai Cổng vào bằng:

kubectl apply -f aspnetcore-gateway.yaml

Lệnh này tạo ra kết quả sau:

gateway.networking.istio.io "aspnetcore-gateway" created

Tiếp theo, hãy chạy lệnh sau để triển khai VirtualService:

kubectl apply -f aspnetcore-virtualservice.yaml

Lệnh này tạo ra kết quả sau:

virtualservice.networking.istio.io "aspnetcore-virtualservice" created

Xác minh rằng mọi thứ đang chạy:

kubectl get gateway
NAME                      AGE
aspnetcore-gateway   28s
kubectl get virtualservice
NAME                             AGE
aspnetcore-virtualservice   33s

Xin chúc mừng! Bạn vừa triển khai một ứng dụng hỗ trợ Istio. Tiếp theo, bạn sẽ thấy ứng dụng đang được sử dụng.

9. Kiểm thử ứng dụng

Cuối cùng, bạn có thể xem ứng dụng hoạt động. Bạn cần lấy IP bên ngoài và cổng của cổng. Được liệt kê trong EXTERNAL-IP:

kubectl get svc istio-ingressgateway -n istio-system

Xuất IP bên ngoài và cổng sang biến GATEWAY_URL:

export INGRESS_HOST=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

export INGRESS_PORT=$(kubectl -n istio-system get service istio-ingressgateway -o jsonpath='{.spec.ports[?(@.name=="http2")].port}')

export GATEWAY_URL=$INGRESS_HOST:$INGRESS_PORT

Sử dụng curl để kiểm thử ứng dụng. Dịch vụ phải phản hồi bằng một mã phản hồi 200:

curl -o /dev/null -s -w "%{http_code}\n" http://${GATEWAY_URL}/

Ngoài ra, bạn có thể mở trình duyệt, chuyển đến http://<gatewayurl> để xem ứng dụng:

f579a9baedc108a9.png

10. Xin chúc mừng!

Bạn vừa triển khai một ứng dụng ASP.NET Core đơn giản cho Kubernetes chạy trên Google Kubernetes Engine (GKE) và định cấu hình ứng dụng này để Istio quản lý.

Có thể bạn đang thắc mắc "Lợi ích của Istio là gì?". Đó là một câu hỏi hay. Cho đến nay, việc để Istio quản lý ứng dụng này không mang lại lợi ích gì. Trong phần thứ hai của phòng thí nghiệm này, chúng ta sẽ tìm hiểu thêm về các tính năng của Istio, chẳng hạn như chỉ số, hoạt động theo dõi, quản lý lưu lượng truy cập động, trực quan hoá dịch vụ và chèn lỗi.

Các bước tiếp theo

Giấy phép

Tác phẩm này được cấp phép theo Giấy phép chung Ghi nhận tác giả Creative Commons 2.0.

11. Dọn dẹp

Nếu không tiếp tục phần thứ hai của phòng thí nghiệm này, 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 xóa ứng dụng:

kubectl delete -f aspnetcore-gateway.yaml
Kubectl delete -f aspnetcore-virtualservice.yaml
kubectl delete -f aspnetcore.yaml

Cách xác nhận ứng dụng đã biến mất:

kubectl get gateway 
kubectl get virtualservices 
kubectl get pods

Gỡ cài đặt Istio

Cách xoá Istio:

kubectl delete -f install/kubernetes/istio-demo-auth.yaml

Để xác nhận rằng Istio đã biến mất, hãy làm như sau:

kubectl get pods -n istio-system

Xoá cụm Kubernetes

gcloud container clusters delete hello-istio