使用 Helm 部署應用程式

適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS

Helm 是開放原始碼的封裝工具,可協助您安裝和管理 Kubernetes 應用程式的生命週期。 Helm 類似於 APT 和 Yum 等 Linux 套件管理員,可用於管理 Kubernetes 圖表,即預先設定的 Kubernetes 資源套件。

本文說明當您使用 Azure Arc 啟用 Azure Kubernetes Service 時,如何使用 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 Container Registry。 在此範例中,會將容器映像推送至 Azure Container Registry (ACR)。 如需詳細資訊,請參閱 將映像從 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 會使用健康情況檢查來管理您的應用程式部署。 將 和 readiness 探查path: /weatherforecast的路徑liveness取代為 ,如下列範例所示:

...
 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

下一步