使用 Helm 部署应用程序
适用于:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS
Helm 是一种开放源打包工具,有助于安装和管理 Kubernetes 应用程序的生命周期。 与 Linux 包管理器(如 APT 和 Yum)类似,Helm 管理 Kubernetes 图表,这些图表是预配置的 Kubernetes 资源的包。
本文介绍如何在使用 Azure Arc 启用Azure Kubernetes 服务时使用 Helm 在 AKS 上打包和部署应用程序。
开始之前
验证是否已满足以下要求:
- 至少有一个 Windows 或 Linux 工作器节点已启动并正在运行的 Kubernetes 群集。
- 已将本地
kubectl
环境配置为指向群集。 可以使用 Get-AksHciCredential PowerShell 命令通过kubectl
访问群集。 - Helm v3 命令行和已安装的先决条件。
- 可用的容器注册表,例如 DockerHub 或 Azure 容器注册表。
本文使用 ASP.NET Core 应用程序作为示例。 可以从此 GitHub 存储库下载示例应用程序。
由于应用程序部署到 Kubernetes,以下示例是项目的简单 Dockerfile:
FROM mcr.microsoft.com/dotnet/aspnet:5.0-alpine AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:5.0-alpine AS build
WORKDIR /src
COPY ["MyMicroservice.csproj", "./"]
RUN dotnet restore "MyMicroservice.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "MyMicroservice.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "MyMicroservice.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "MyMicroservice.dll"]
生成示例应用程序并将其推送到容器注册表
导航到应用程序文件夹,并使用 Dockerfile 通过以下命令生成和推送映像:
docker build -f Dockerfile -t acr.azurecr.io/mymicroservice:0.1.0 .
注意
命令末尾的句点(.)设置 Dockerfile 的位置(在本例中为当前目录)。
此命令在本地计算机上创建映像 mymicroservice:0.1.0
。 若要验证映像是否已成功创建,请运行 docker images
以确认:
REPOSITORY TAG IMAGE ID CREATED SIZE
acr.azurecr.io/mymicroservice 0.1.0 5be713db571b About a minute ago 107MB
....
接下来,将映像推送到容器注册表,例如 DockerHub 或Azure 容器注册表。 在此示例中,容器映像将推送到Azure 容器注册表。 有关详细信息,请参阅 将映像从 ACR 拉取到 Kubernetes 群集:
docker push acr.azurecr.io/mymicroservice:0.1.0
创建 Helm 图表
现在示例应用程序已准备就绪,下一步是使用 helm create
命令生成 Helm 图表,如下所示:
helm create mymicroserviceapp
更新 mymicroserviceapp/values.yaml,如下所示:
- 将
image.repository
更改为acr.azurecr.io/mymicroservice
。 - 将
service.type
更改为NodePort
。
例如:
# Default values for webfrontend.
# This is a YAML-formatted file.
# Declare variables to be passed into your templates.
replicaCount: 1
image:
repository: acr.azurecr.io/mymicroservice
pullPolicy: IfNotPresent
...
service:
type: NodePort
port: 80
...
导航到 mymicroserviceapp/templates/deployment.yaml 文件以配置运行状况检查。 Kubernetes 使用运行状况检查来管理应用程序部署。 将两者 liveness
的路径和 readiness
探测替换为 path: /weatherforecast
,如以下示例所示:
...
livenessProbe:
httpGet:
path: /weatherforecast
port: http
initialDelaySeconds: 0
periodSeconds: 10
timeoutSeconds: 1
failureThreshold: 3
readinessProbe:
httpGet:
path: /weatherforecast
port: http
successThreshold: 3
...
将 Helm 图表部署到 Kubernetes
从解决方案目录中的 charts\mymicroserviceapp 目录开始,运行以下命令:
helm upgrade --install mymicroserviceapp . --namespace=local --set mymicroserviceapp.image.tag="0.1.0"
此命令使用 Kubernetes 群集中的命名空间中local
的名称mymicroserviceapp
创建现有版本,并生成类似于此示例的输出:
Release "mymicroserviceapp" does not exist. Installing it now.
NAME: mymicroserviceapp
LAST DEPLOYED: Fri Apr 2 08:47:24 2021
NAMESPACE: local
STATUS: deployed
REVISION: 1
NOTES:
1. Get the application URL by running these commands:
export NODE_PORT=$(kubectl get --namespace local -o jsonpath="{.spec.ports[0].nodePort}" services mymicroserviceapp)
export NODE_IP=$(kubectl get nodes --namespace local -o jsonpath="{.items[0].status.addresses[0].address}")
echo http://$NODE_IP:$NODE_PORT
部署 Helm 图表后,可以通过运行 kubectl get all -n local
来检查是否已正确部署资源。
运行命令的输出为:
NAME READY STATUS RESTARTS AGE
pod/mymicroserviceapp-7849f949df-fwgbn 1/1 Running 0 101s
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/mymicroserviceapp NodePort 10.100.149.1 <none> 80:30501/TCP 101s
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/mymicroserviceapp 1/1 1 1 101s
NAME DESIRED CURRENT READY AGE
replicaset.apps/mymicroserviceapp-7849f949df 1 1 1 101s
测试部署
应用程序使用服务和节点端口进行部署,因此可以从群集外部调用 API。 若要进行此调用,请将请求发送到:http://$NODE_IP:$NODE_PORT:
curl http://10.193.2.103:30501/WeatherForeCast/
StatusCode : 200
StatusDescription : OK
Content : [{"date":"2021-04-03T15:51:04.795216+00:00","temperatureC":45,"temperatureF":112,"summary":"Balmy"},{"date":"2021-04-04T15:51:04.
7952176+00:00","temperatureC":23,"temperatureF":73,"summary":"Cool"},{"...
RawContent : HTTP/1.1 200 OK
Transfer-Encoding: chunked
Content-Type: application/json; charset=utf-8
Date: Fri, 02 Apr 2021 15:51:04 GMT
Server: Kestrel
[{"date":"2021-04-03T15:51:04.795216+00:00","tempera...
Forms : {}
Headers : {[Transfer-Encoding, chunked], [Content-Type, application/json; charset=utf-8], [Date, Fri, 02 Apr 2021 15:51:04 GMT], [Server,
Kestrel]}
Images : {}
InputFields : {}
Links : {}
ParsedHtml : mshtml.HTMLDocumentClass
RawContentLength : 494
清理群集
最后一步是清理群集。 若要删除 Kubernetes 部署资源,请运行以下命令:
helm uninstall mymicroserviceapp -n local
应会看到类似于以下示例的输出:
release "mymicroserviceapp" uninstalled