在 Azure Kubernetes Service (AKS) 中使用 Helm 安裝現有的應用程式

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

本文示範如何在 Azure Kubernetes Service (AKS) 上的 Kubernetes 叢集中設定及使用 Helm。

開始之前

  • 本文假設您目前擁有 AKS 叢集。 如果您需要 AKS 叢集,請使用 Azure CLI (部分機器翻譯)、Azure PowerShell (部分機器翻譯) 或 Azure 入口網站來建立。
  • 您的 AKS 叢集必須具有整合式 ACR。 如需搭配整合式 ACR 建立 AKS 叢集的詳細資料,請參閱從 Azure Kubernetes Service 對 Azure Container Registry 進行驗證 (部分機器翻譯)。
  • 您也必須安裝 Helm CLI,這是在開發系統上執行的用戶端。 其可讓您透過 Helm 來啟動、停止和管理應用程式。 如果您使用 Azure Cloud Shell,則已安裝 Helm CLI。 如需本機平台的安裝指示,請參閱安裝 Helm

重要

Helm 的目的是要在 Linux 節點上執行。 如果您的叢集中有 Windows Server 節點,您必須確定 Helm Pod 只排程在 Linux 節點上執行。 您也必須確定您安裝的任何 Helm 圖表也都已排程在正確的節點上執行。 本文中的命令會使用節點選取器,以確定 Pod 已排程至正確的節點,但並非所有的 Helm 圖表都可能會公開節點選取器。 您也可以考慮在叢集上使用其他選項,例如污點

確認您的 Helm 版本

  • 使用 helm version 命令,以確認您已安裝 Helm 3。

    helm version
    

    下列範例輸出顯示已安裝 Helm 3.0.0 版:

    version.BuildInfo{Version:"v3.0.0", GitCommit:"e29ce2a54e96cd02ccfce88bee4f58bb6e2a28b6", GitTreeState:"clean", GoVersion:"go1.13.4"}
    

使用 Helm v3 安裝應用程式

新增 Helm 存放庫

  • 使用 helm repo (英文) 命令來新增 ingress-nginx 存放庫。

    helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
    

尋找 Helm 圖表

  1. 使用 helm search (英文) 命令來搜尋預先建立的 Helm 圖表。

    helm search repo ingress-nginx
    

    下列扼要範例輸出顯示一些可供使用的 Helm 圖表:

    NAME                            CHART VERSION   APP VERSION     DESCRIPTION                                       
    ingress-nginx/ingress-nginx     4.7.0           1.8.0           Ingress controller for Kubernetes using NGINX a...
    
  2. 使用 helm repo update (英文) 命令來更新圖表清單。

    helm repo update
    

    下列範例輸出顯示成功的存放庫更新:

    Hang tight while we grab the latest from your chart repositories...
    ...Successfully got an update from the "ingress-nginx" chart repository
    Update Complete. ⎈ Happy Helming!⎈
    

將 Helm 圖表映像匯入您的 ACR

本文使用依賴三個容器映像的 NGINX 輸入控制器 Helm 圖表

  • 使用 az acr import,將 NGINX 輸入控制器映像匯入您的 ACR。

    REGISTRY_NAME=<REGISTRY_NAME>
    CONTROLLER_REGISTRY=registry.k8s.io
    CONTROLLER_IMAGE=ingress-nginx/controller
    CONTROLLER_TAG=v1.8.0
    PATCH_REGISTRY=registry.k8s.io
    PATCH_IMAGE=ingress-nginx/kube-webhook-certgen
    PATCH_TAG=v20230407
    DEFAULTBACKEND_REGISTRY=registry.k8s.io
    DEFAULTBACKEND_IMAGE=defaultbackend-amd64
    DEFAULTBACKEND_TAG=1.5
    
    az acr import --name $REGISTRY_NAME --source $CONTROLLER_REGISTRY/$CONTROLLER_IMAGE:$CONTROLLER_TAG --image $CONTROLLER_IMAGE:$CONTROLLER_TAG
    az acr import --name $REGISTRY_NAME --source $PATCH_REGISTRY/$PATCH_IMAGE:$PATCH_TAG --image $PATCH_IMAGE:$PATCH_TAG
    az acr import --name $REGISTRY_NAME --source $DEFAULTBACKEND_REGISTRY/$DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG --image $DEFAULTBACKEND_IMAGE:$DEFAULTBACKEND_TAG
    

    注意

    除了將容器映像匯入至您的 ACR 外,您也可以將 Helm 圖表匯入至其中。 如需詳細資訊,請參閱將 Helm 圖表推送至 Azure 容器登錄

執行 Helm 圖表

  1. 使用 helm install (英文) 命令來安裝 Helm 圖表,並指定要安裝的版本名稱和圖表名稱。

    提示

    下列範例會對名為 ingress-basic 的輸入資源建立 Kubernetes 命名空間,並打算在該命名空間內運作。 視需要為您自己的環境指定命名空間。

    ACR_URL=<REGISTRY_URL>
    
    # Create a namespace for your ingress resources
    kubectl create namespace ingress-basic
    
    # Use Helm to deploy an NGINX ingress controller
    helm install ingress-nginx ingress-nginx/ingress-nginx \
        --version 4.0.13 \
        --namespace ingress-basic \
        --set controller.replicaCount=2 \
        --set controller.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.image.registry=$ACR_URL \
        --set controller.image.image=$CONTROLLER_IMAGE \
        --set controller.image.tag=$CONTROLLER_TAG \
        --set controller.image.digest="" \
        --set controller.admissionWebhooks.patch.nodeSelector."kubernetes\.io/os"=linux \
        --set controller.service.annotations."service\.beta\.kubernetes\.io/azure-load-balancer-health-probe-request-path"=/healthz \
        --set controller.admissionWebhooks.patch.image.registry=$ACR_URL \
        --set controller.admissionWebhooks.patch.image.image=$PATCH_IMAGE \
        --set controller.admissionWebhooks.patch.image.tag=$PATCH_TAG \
        --set defaultBackend.nodeSelector."kubernetes\.io/os"=linux \
        --set defaultBackend.image.registry=$ACR_URL \
        --set defaultBackend.image.image=$DEFAULTBACKEND_IMAGE \
        --set defaultBackend.image.tag=$DEFAULTBACKEND_TAG \
        --set defaultBackend.image.digest=""
    

    下列扼要範例輸出顯示 Helm 圖表所建立的 Kubernetes 資源部署狀態:

    NAME: nginx-ingress
    LAST DEPLOYED: Wed Jul 28 11:35:29 2021
    NAMESPACE: ingress-basic
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
    NOTES:
    The ingress-nginx controller has been installed.
    It may take a few minutes for the LoadBalancer IP to be available.
    You can watch the status by running 'kubectl --namespace ingress-basic get services -o wide -w nginx-ingress-ingress-nginx-controller'
    ...
    
  2. 使用 kubectl get services 命令來取得服務的 EXTERNAL-IP

    kubectl --namespace ingress-basic get services -o wide -w ingress-nginx-ingress-nginx-controller
    

    下列範例輸出顯示 ingress-nginx-ingress-nginx-controller 服務的 EXTERNAL-IP

    NAME                                     TYPE           CLUSTER-IP    EXTERNAL-IP     PORT(S)                      AGE   SELECTOR
    nginx-ingress-ingress-nginx-controller   LoadBalancer   10.0.254.93   <EXTERNAL_IP>   80:30004/TCP,443:30348/TCP   61s   app.kubernetes.io/component=controller,app.kubernetes.io/instance=nginx-ingress,app.kubernetes.io/name=ingress-nginx
    

列出版本

  • 使用 helm list 命令來取得安裝於叢集上的版本清單。

    helm list --namespace ingress-basic
    

    下列範例輸出顯示在上一個步驟中部署的 ingress-nginx 版本:

    NAME            NAMESPACE       REVISION        UPDATED                                 STATUS          CHART                   APP VERSION
    ingress-nginx   ingress-basic   1               2021-07-28 11:35:29.9623734 -0500 CDT   deployed        ingress-nginx-3.34.0    0.47.0
    

清除資源

部署 Helm 圖表會建立 Kubernetes 資源,例如 Pod、部署和服務。

  • 使用 helm uninstall (英文) 命令來清除資源,並指定您的版本名稱。

    helm uninstall --namespace ingress-basic ingress-nginx
    

    下列範例輸出顯示已解除安裝名為 ingress-nginx 的版本:

    release "nginx-ingress" uninstalled
    
  • 使用 kubectl delete 命令並指定您的命名空間名稱,來刪除整個範例命名空間以及資源。

    kubectl delete namespace ingress-basic
    

下一步

如需使用 Helm 管理 Kubernetes 應用程式部署的詳細資訊,請參閱 Helm 文件。