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

Helm 是一种开放源打包工具,有助于安装和管理 Kubernetes 应用程序的生命周期。 与诸如 APTYum 的 Linux 包管理器类似,可以使用 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 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=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
    

    以下示例输出显示了 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 文档。