Helm 是一种开放源打包工具,有助于安装和管理 Kubernetes 应用程序的生命周期。 与 Linux 包管理器(如 APT 和 Yum)类似,可以使用 Helm 管理 Kubernetes 图表,这些图表是预配置的 Kubernetes 资源的包。
本文介绍如何在 Azure Kubernetes 服务(AKS)上的 Kubernetes 群集中配置和使用 Helm。
本文假设你有现有 AKS 群集。 如果需要 AKS 群集,请使用 Azure CLI、 Azure PowerShell 或 Azure 门户创建一个群集。
AKS 群集需要 具有集成的 ACR。 有关使用集成 ACR 创建 AKS 群集的详细信息,请参阅 从 Azure Kubernetes 服务使用 Azure 容器注册表进行身份验证。
还需要安装 Helm CLI,这是在开发系统上运行的客户端。 它允许使用 Helm 启动、停止和管理应用程序。 有关本地平台上的安装说明,请参阅 “安装 Helm”。
重要
Helm 要在 Linux 节点上运行。 如果群集中有 Windows Server 节点,则必须确保 Helm Pod 仅计划在 Linux 节点上运行。 还需要确保安装的任何 Helm 模板也配置运行在正确的节点上。 本文中的命令使用 节点选择器 来确保 Pod 计划到正确的节点,但并非所有 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 存储库命令添加 ingress-nginx 存储库。
helm repo add ingress-nginx https://kubernetes.github.io/ingress-nginx
使用 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...
使用 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!⎈
本文使用依赖于三个容器映像的 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 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' ...
使用
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 文档。