在 Azure Kubernetes 服务(AKS)中使用 Helm 安装现有应用程序

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

本文介绍如何在 Azure Kubernetes 服务(AKS)上的 Kubernetes 群集中配置和使用 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 存储库命令添加 ingress-nginx 存储库。

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

查找 Helm 图表

  1. 使用 helm 搜索 命令搜索预创建的 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=k8sgcr.azk8s.cn
    CONTROLLER_IMAGE=ingress-nginx/controller
    CONTROLLER_TAG=v1.8.0
    PATCH_REGISTRY=dockerhub.azk8s.cn
    PATCH_IMAGE=ingress-nginx/kube-webhook-certgen
    PATCH_TAG=v20230407
    DEFAULTBACKEND_REGISTRY=k8sgcr.azk8s.cn
    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 图表导入 ACR。 有关详细信息,请参阅将 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
    

    以下示例输出显示 EXTERNAL-IP,用于 ingress-nginx-ingress-nginx-controller 服务:

    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
    

    以下示例输出显示了在上一步中部署的 入口-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 卸载 命令清理资源并指定发布名称。

    helm uninstall --namespace ingress-basic ingress-nginx
    

    以下示例输出显示已卸载名为 ingress-nginx 的版本:

    release "nginx-ingress" uninstalled
    
  • 使用 kubectl delete 命令删除整个示例命名空间以及资源并指定命名空间名称。

    kubectl delete namespace ingress-basic
    

后续步骤

有关使用 Helm 管理 Kubernetes 应用程序部署的详细信息,请参阅 Helm 文档。