使用 Helm 在 Azure Kubernetes 服务 (AKS) 中安装现有应用程序
Helm 是一种开放源打包工具,有助于安装和管理 Kubernetes 应用程序的生命周期。 与诸如 APT 和 Yum 的 Linux 包管理器类似,可以使用 Helm 管理 Kubernetes 图表,它们是预配置的 Kubernetes 资源包。
本文介绍如何在 Azure Kubernetes 服务 (AKS) 上的 Kubernetes 群集中配置和使用 Helm
开始之前
本文假设你有现有 AKS 群集。 如果需要 AKS 群集,请使用 Azure CLI、Azure PowerShell 或 Azure 门户创建一个。
AKS 群集需要具有集成的 ACR。 有关创建包含集成 ACR 的 AKS 群集的详细信息,请参阅使用 Azure 容器注册表从 Azure Kubernetes 服务进行身份验证。
还需要安装 Helm CLI,这是在开发系统上运行的客户端。 它允许你使用 Helm 启动、停止和管理应用程序。 有关本地平台上的安装说明,请参阅安装 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 图表
使用 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...
使用 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 图表
使用 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
以下示例输出显示了 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 文档。