使用 Helm 部署應用程式
適用於:Azure Stack HCI 22H2 上的 AKS、Windows Server 上的 AKS
Helm 是開放原始碼的封裝工具,可協助您安裝和管理 Kubernetes 應用程式的生命週期。 類似於Linux套件管理員,例如 APT 和 Yum,Helm會管理 Kubernetes 圖表,這些圖表是預先設定 Kubernetes 資源的套件。
本文說明當您使用由 Azure Arc 啟用的 Azure Kubernetes Service 時,如何使用 Helm 在 AKS 上封裝和部署應用程式。
開始之前
確認您已設定下列需求:
- 至少有一個 Windows 或 Linux 背景工作節點已啟動並執行的 Kubernetes 叢集 。
- 您已將本機
kubectl
環境設定為指向叢集。 您可以使用 Get-AksHciCredential PowerShell 命令,使用kubectl
存取叢集。 - Helm v3 命令行和必要條件已安裝。
- 可用的容器登錄,例如 DockerHub 或 Azure Container Registry。
本文使用 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 .
注意
命令結尾的 period (.) 會設定 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 Container Registry。 在此範例中,容器映像會推送至 Azure Container Registry。 如需詳細資訊,請參閱 將映像從 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
探查的路徑liveness
取代為 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