Azure Kubernetes Service (AKS) に C# ASP.NET Core Webサービスをデプロイする (Docker Hub カスタムコンテナイメージ)

使用 Azure Kubernetes Service (AKS) 部署 C# ASP.NET Core Web服务(基于 Docker Hub 的自定义容器镜像)。

aspnet-core_on_azure-kubernetes-service.png

达到的原因

达成的目标

实现的目标

为了什么?

所追求的结果

所追求的目标

我会在Windows 11上使用Linux进行云开发。

您可以在这里查看文章的目录。

 

实现的事情

在Microsoft Azure Kubernetes Service (AKS)上部署一个自定义的C# ASP.NET Core Web应用程序容器镜像。

本文使用了在Docker Hub上发布的可公开访问的自定义容器镜像。实际的系统开发中,获取容器镜像可能会根据不同的注册表而异,请据此进行适当的确认。

技术话题

微软 Azure Kubernetes 服务 (AKS) 是什么?

以下是您展開的找法展示:Microsoft Azure Kubernetes Service (AKS)

这是在Azure上运行的托管 Kubernetes 服务。AKS能够轻松地展开、管理和扩展 Kubernetes 集群,从而简化了 Kubernetes 的运维。

关键字
内容

可扩展性
AKS能够根据需求的变化对应用程序进行扩展/缩减。通过使用 Kubernetes 的标准功能来调整Pod的数量,可以优化整个集群的资源利用率。

自动化
AKS自动化了与集群的部署、升级、监控、扩展和管理相关的任务。这使得用户可以简化与Kubernetes相关的复杂任务。

安全性
AKS帮助用户安全地配置 Kubernetes 集群。AKS支持可配置的网络策略、预先配置的登录、基于角色的访问控制(RBAC)等功能。

可移植性
AKS使用开源的 Kubernetes,使得可以在任何地方运行云原生应用程序。AKS可以部署到Azure的其他服务、本地环境和其他云服务提供商。

生产就绪
AKS专注于高可用性、监控、可扩展性和安全性,提供了生产就绪的 Kubernetes 集群。AKS提供99.95%的可用性SLA。

开发环境

    Windows 11 Home 22H2 を使用しています。
由于要操作WSL上的Ubuntu,您也可以参考macOS的方法。
WSL(Microsoft Store应用程序版)※ 您可以从相关文章中查看安装方法
> wsl –version
WSL版本:1.0.3.0
内核版本:5.15.79.1
WSLg版本:1.0.47Ubuntu ※ 您可以从相关文章中查看安装方法
$ lsb_release -a
没有可用的LSB模块。
发行商ID:Ubuntu
描述:Ubuntu 22.04.1 LTS
发布:22.04

.NET SDK ※ 您可以从相关文章中查看安装方法
$ dotnet –list-sdks
7.0.202 [/usr/share/dotnet/sdk]
$ dotnet –version
7.0.202

Docker ※ 您可以从相关文章中查看安装方法
$ docker –version
Docker版本23.0.1,构建版本 a5ee5b1

Azure CLI ※ 您可以从相关文章中查看安装方法
$ az –version
azure-cli 2.45.0
core 2.45.0
telemetry 1.0.8

本文章主要介绍在Ubuntu终端上操作。对于初次学习使用Vim的人来说,下面的文章介绍了复制粘贴的步骤。请务必尝试一下。

 

创建Web应用程序的规格

NoエンドポイントHTTPメソッドMIME タイプ1/api/dataGETapplication/json

展示”Hello World”的步骤。

创建ASP.NET Core Web服务

您可以在本相关文章中确认步骤。

 

在这些步骤中,我们成功地在本地环境的Ubuntu上构建了一个自定义的应用容器镜像。

请进入项目文件夹

我会切换到项目文件夹。
※ 以~/tmp/WebApp为项目文件夹。

$ cd ~/tmp/WebApp

コンテナイメージの確認

启动Docker守护程序。

$ sudo service docker start
 * Starting Docker: docker      [ OK ]

Docker 環境をお持ちでない場合は、以下の関連記事から Docker Engine のインストール手順をご確認いただけます。

 

我会查看容器镜像。

$ docker images | grep app-hello-aspnet-core
REPOSITORY              TAG       IMAGE ID       CREATED          SIZE
app-hello-aspnet-core   latest    63ec70def9d5   45 seconds ago   208MB

Docker Hub にコンテナイメージを登録

创建Docker Hub账户。

 

登录到Docker Hub。

$ docker login
Login Succeeded

コンテナイメージにタグを付けます。

ここで $USER という埋め込み変数は、Ubuntu のシェル変数 USER のことです。つまり、カスタムコンテナイメージを Docker Hub にプッシュする際に指定するアカウント名と、Ubuntu のユーザー名を同じにすると、イメージの取り扱いが簡単になります。ただし、この方法は検証用途に限定されます。

$ docker tag app-hello-aspnet-core:latest $USER/app-hello-aspnet-core:latest

将容器镜像推送到Docker Hub。

$ docker push $USER/app-hello-aspnet-core:latest
通过完成以上步骤,您可以将自定义容器镜像作为 $USER/app-hello-aspnet-core:latest 发布到 Docker Hub。

创建Shell变量

在Ubuntu中,创建以下值作为Shell变量。
$ location_name=japaneast
$ resource_group_name=rg-hello
$ aks_name=aks-hello

登入Azure环境。

こちらの関連記事で手順がご確認いただけます。

 

用 Azure CLI 进行登录。

$ az login

請只提供一種中文本地語句選擇。

Azure 環境 → 藍天環境

资源组

创建资源组。

$ az group create \
    --name $resource_group_name \
    --location $location_name

环境AKS

创建 AKS 时,将自动创建多个资源以供 Kubernetes 集群使用。您可以在 Azure 门户上查看这些资源。但是,请注意,当删除 AKS 资源时,相关联的资源也将自动删除,因此请谨慎考虑共享 Azure 订阅中的验证情况等。
aks.png
$ az aks create \
    --resource-group $resource_group_name \
    --name $aks_name \
    --node-count 1 \
    --generate-ssh-keys

我将尝试显示AKS集群的列表。

$ az aks list

修正设置文件的权限。
※ 仅需初始时进行。

$ chmod 600 /home/$USER/.kube/config

连接到AKS集群。
* 选择”是”来允许覆盖现有配置。

$ az aks get-credentials \
    --resource-group $resource_group_name \
    --name $aks_name

如果连接设置成功,输出将如下所示。

Merged "aks-hello" as current context in /home/$USER/.kube/config
我已成功连接到在 Azure 上构建的 Kubernetes 集群。接下来我将远程操作该 Kubernetes 集群。

操作 AKS 上的 Kubernetes 集群。

AKS にデプロイするために、Minikube を経由して kubectl を使用する代わりに、Azure CLI で kubectl を直接インストールする手順を紹介しています。

安装Kubernetes命令行工具kubectl。

$ sudo az aks install-cli

删除在Minikube中使用过的符号链接。

$ unalias kubectl

检查 kubectl 的版本。

$ kubectl version --short
Client Version: v1.26.2
Kustomize Version: v4.5.7
Server Version: v1.24.9

我会检查当前的连接目标。

$ kubectl config current-context
aks-hello

Kubernetes クラスターに接続していることを確認することは、誤ったクラスターに対してコマンド操作を実行することを防ぐために重要です。例えば、誤ったクラスターに対してデプロイメントを適用したり、Pod を削除したりすると、誤操作が原因でサービスの停止やデータの消失などの致命的な問題を引き起こす可能性があります。

创建 Kubernetes 清单文件

我将创建Kubernetes的清单配置。

请将”USER”部分改为您自己的容器存储库。
$ vim kube-all-in-one.yaml
apiVersion: v1
kind: Service
metadata:
  name: app-service
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: app
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: app
spec:
  replicas: 1
  selector:
    matchLabels:
      app: app
  template:
    metadata:
      labels:
        app: app
    spec:
      containers:
      - name: app
        image: $USER/app-hello-aspnet-core:latest
        ports:
        - containerPort: 80

将部署到Kubernetes集群中。

$ kubectl apply -f kube-all-in-one.yaml
service/app-service created
deployment.apps/app-deployment created

检查Kubernetes集群的状态。

$ kubectl get pods,services,deployments
NAME                      READY   STATUS    RESTARTS   AGE
pod/app-b69b5685c-wltz8   1/1     Running   0          14s

NAME                  TYPE           CLUSTER-IP   EXTERNAL-IP     PORT(S)        AGE
service/app-service   LoadBalancer   10.0.251.6   xx.xx.xx.xx     80:32300/TCP   14s
service/kubernetes    ClusterIP      10.0.0.1     <none>          443/TCP        5m3s

NAME                  READY   UP-TO-DATE   AVAILABLE   AGE
deployment.apps/app   1/1     1            1           14s

确认容器操作

在Ubuntu的shell变量aks_external_ip中获取app-service服务的EXTERNAL-IP。

$ aks_external_ip=$(kubectl get svc app-service \
    -o jsonpath='{.status.loadBalancer.ingress[0].ip}')

从另一个终端使用curl命令进行确认。

$ curl http://$aks_external_ip/api/data -w "\n"
{"message":"Hello Blue!"}
显示详细信息。
$ curl -v http://$aks_external_ip/api/data -w “\n”
* 正在尝试连接 xx.xx.xx.xx:80…
* 已连接到 xx.xx.xx.xx (xx.xx.xx.xx) 的 80 端口 (#0)
> GET /api/data HTTP/1.1
> 主机: xx.xx.xx.xx
> 用户代理: curl/7.81.0
> 接受: */*
>
* 将捆绑包标记为不支持多用途
< HTTP/1.1 200 OK
< 内容类型: application/json
< 日期: 2023年3月25日星期六01:07:30 GMT
< 服务器: Kestrel
< 传输编码: 分块
<
* 与主机 xx.xx.xx.xx 的连接 #0 保持完好
{“message”:”Hello World!”}
在终端上显示了 {“message”:”你好,世界!”},并成功获取了JSON数据。

连接到容器

POD の名前を Ubuntu のシェル変数 aks_pod_name に取得します。

$ aks_pod_name=$(kubectl get pods -o=name)

コンテナに接続します。

$ kubectl exec -it $aks_pod_name -- /bin/bash

连接到容器后,请确认目录。
※ 当离开容器时,请按 ctrl + D。

# pwd
/App
# ls -lah
total 200K
drwxr-xr-x 1 root root 4.0K Mar 24 14:34 .
drwxr-xr-x 1 root root 4.0K Mar 24 23:00 ..
-rwxr-xr-x 1 root root 140K Mar 24 14:34 WebApp
-rw-r--r-- 1 root root  388 Mar 24 14:34 WebApp.deps.json
-rw-r--r-- 1 root root 8.5K Mar 24 14:34 WebApp.dll
-rw-r--r-- 1 root root  20K Mar 24 14:34 WebApp.pdb
-rw-r--r-- 1 root root  469 Mar 24 14:34 WebApp.runtimeconfig.json
-rw-r--r-- 1 root root  119 Mar 24 12:59 appsettings.Development.json
-rw-r--r-- 1 root root  142 Mar 24 12:59 appsettings.json
-rw-r--r-- 1 root root  482 Mar 24 14:34 web.config

使用top命令检查状态。

# apt update
# apt install procps
# top
top - 01:05:25 up 14 min,  0 users,  load average: 0.28, 0.29, 0.37
Tasks:   3 total,   1 running,   2 sleeping,   0 stopped,   0 zombie
%Cpu0  :  2.3 us,  1.0 sy,  0.0 ni, 96.7 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  1.7 us,  2.0 sy,  0.0 ni, 96.0 id,  0.0 wa,  0.0 hi,  0.3 si,  0.0 st
MiB Mem :   6949.5 total,   3818.9 free,    819.8 used,   2310.7 buff/cache
MiB Swap:      0.0 total,      0.0 free,      0.0 used.   5859.8 avail Mem

    PID USER      PR  NI    VIRT    RES    SHR S  %CPU  %MEM     TIME+ COMMAND
      1 root      20   0   12.0g  69424  40820 S   0.0   1.0   0:00.84 dotnet
     69 root      20   0    4028   3472   2984 S   0.0   0.0   0:00.01 bash
    401 root      20   0    6996   3236   2752 R   0.0   0.0   0:00.00 top

我来尝试显示容器的信息。

# cat /etc/*-release
PRETTY_NAME="Debian GNU/Linux 11 (bullseye)"
NAME="Debian GNU/Linux"
VERSION_ID="11"
VERSION="11 (bullseye)"
VERSION_CODENAME=bullseye
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

このコンテナは Debian Linux をベースに作成されています。つまり、Debian Linux と同じように扱うことができます。

总结

在Azure Kubernetes Service (AKS) 环境中,可以启动以Dockerfile构建的C# ASP.NET Core Web服务的自定义容器镜像。

.NET SDK、Docker、Azure CLI、kubectl を使って、ASP.NET Core アプリの開発からコンテナイメージの作成、Azure 環境へのデプロイまで、すべてをターミナルから行うことができます。このように、クラウドでのシステム開発に必要なスキルや理解を深めることができます。初めての人でも簡単に手順を追うことができるので、ぜひ挑戦してみてください。

どうでしたか? 検証目的として、WSL Ubuntu で、C# ASP.NET Core Web アプリケーションを Azure Kubernetes Service (AKS) 環境でコンテナとして手軽に起動することができます。ぜひお試しください。今後も Azure の開発環境などを紹介していきますので、ぜひお楽しみにしてください。

相关文章

Java Spring Boot:

Java春季引导