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?
Bạn đánh giá thế nào về trải nghiệm sử dụng Google Cloud Platform?
2. Thiết lập và yêu cầu
Thiết lập môi trường theo tiến độ riêng
- Đă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.
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
.
- 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
- Trong Cloud Console, hãy nhấp vào Kích hoạt Cloud Shell .
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:
Quá trình cấp phép và kết nối với Cloud Shell chỉ mất vài phút.
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.
- 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`
- 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".
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 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 :
Bạn sẽ thấy trang web ASP.NET Core mặc định trong thẻ mới.
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.
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.
Đố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 GKE và Anthos 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-ingressgateway
và istio-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úpingress 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ổng và VirtualService.
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:
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
- Triển khai ứng dụng ASP.NET Core cho GKE bằng Istio (Phần 2).
- Tìm hiểu thêm về Istio.
- Tìm hiểu thêm về Kubernetes.
- Tìm hiểu thêm về Google Kubernetes Engine.
- Tìm hiểu thêm về .NET trên Google Cloud Platform.
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