Azure Kubernetes Service (AKS) に C# ASP.NET Core Webサービスをデプロイする (Docker Hub カスタムコンテナイメージ)
使用 Azure Kubernetes Service (AKS) 部署 C# ASP.NET Core Web服务(基于 Docker Hub 的自定义容器镜像)。
达到的原因
达成的目标
实现的目标
为了什么?
所追求的结果
所追求的目标
我会在Windows 11上使用Linux进行云开发。
您可以在这里查看文章的目录。
实现的事情
在Microsoft Azure Kubernetes Service (AKS)上部署一个自定义的C# ASP.NET Core Web应用程序容器镜像。
技术话题
微软 Azure Kubernetes 服务 (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 –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
创建Web应用程序的规格
展示”Hello World”的步骤。
创建ASP.NET Core Web服务
您可以在本相关文章中确认步骤。
请进入项目文件夹
我会切换到项目文件夹。
※ 以~/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
创建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
$ 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
操作 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的清单配置。
$ 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!”}
连接到容器
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春季引导