使用 Helm 部署应用程序

适用于:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

Helm 是一种开放源打包工具,有助于安装和管理 Kubernetes 应用程序的生命周期。 与 Linux 包管理器(如 APTYum)类似,Helm 管理 Kubernetes 图表,这些图表是预配置的 Kubernetes 资源的包。

本文介绍如何在使用 Azure Arc 启用Azure Kubernetes 服务时使用 Helm 在 AKS 上打包和部署应用程序。

开始之前

验证是否已满足以下要求:

本文使用 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
....

接下来,将映像推送到容器注册表,例如 DockerHubAzure 容器注册表。 在此示例中,容器映像将推送到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

后续步骤