在ACK中部署一个应用时,通常需要配置包括工作负载、Service、Ingress、ConfigMap在内的多种资源,过程较为繁琐。Helm可对这些资源以应用为单位进行部署与升级,实现更高效的应用管理。ACK在控制台上集成了Helm,提供了WordPress、Dify、ComfyUI等常见的第三方应用。本文介绍在ACK集群中使用Helm部署应用的方法。
Helm介绍
Helm是一个用于在Kubernetes集群中进行应用管理的开源工具,它提供了统一的应用打包方式,同时支持版本控制,降低了应用分发和部署的复杂性。请参照下方的表格,了解Helm的基本概念,更多信息请参见官方文档。
| Helm概念 | 说明 | 
| Chart | 一个Helm包,其中包含了运行一个应用所需要的镜像、依赖和资源定义等,还可能包含Kubernetes集群中的服务定义,类似Homebrew中的formula、APT的dpkg或者Yum的rpm文件。 | 
| Release | 在Kubernetes集群上运行的Chart的一个实例。在同一个集群上,一个Chart可以安装多次。每次安装都会创建一个新的Release。例如,如果一个MySQL Chart想在服务器上运行两个数据库,可以将此Chart安装两次,并在每次安装中生成自己的Release以及Release名称。 | 
| Helm CLI | Helm的客户端,在本地执行。可用于在ACK集群中部署第三方Chart。 | 
| Repository | Chart存储库,Helm CLI通过HTTP协议来访问存储库中Chart的索引文件和压缩包。 | 
前提条件
- 已创建ACK集群。具体操作,请参见创建ACK托管集群。 
- 已使用kubectl连接集群并安装Helm CLI。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群、Installing Helm。 
通过控制台部署应用
ACK提供了一些常见应用的Chart,下面的步骤展示了通过Helm安装WordPress的示例。
WordPress Chart中的部分镜像来自海外源,某些情况下可能会出现无法拉取的情况。拉取海外源镜像的解决方案请参见【产品公告】关于ACK集群无法拉取海外源镜像的公告。
- 登录容器服务管理控制台,在左侧导航栏单击集群列表。 
- 在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。 
- 在Helm页面,单击创建。参考如下信息完成基本信息配置。 - 参数 - 说明 - 示例值 - 应用名 - Release在集群内的名称。 - wordpress - 命名空间 - Release部署的命名空间。 - default - 来源 - Chart的来源:应用市场或ACR EE。 - 应用市场 - Chart - 安装应用所使用的Chart。 - ack-wordpress-sample 
- 单击面板左下方的下一步,然后选择最新的Chart 版本。确认Chart内容后,单击面板下方的确定。 
- 安装WordPress成功后,获取外部IP访问地址,即 - EXTERNAL-IP。- kubectl get svc --namespace default- 预期输出如下, - EXTERNAL-IP为- 118.xx.xx.10。- NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE wordpressabc-ack-wordpress-sample LoadBalancer 172.16.86.22 118.190.xx.xx 80:30837/TCP,443:32433/TCP 33m wordpressabc-mariadb ClusterIP 172.16.70.108 <none> 3306/TCP 33m
- 使用 - kubectl get pod命令找到WordPress Pod的名称,然后执行以下命令获取访问用户。- kubectl get pod <wordpress-ack-wordpress-sample-name> -o=jsonpath='{.spec.containers[*].env[?(@.name=="WORDPRESS_USERNAME")].value}'- 预期输出: - user
- 获取访问密码。 - kubectl get secret --namespace default wordpress-ack-wordpress-sample -o jsonpath="{.data.wordpress-password}" | base64 --decode- 预期输出: - ps**jRx**V
- 在浏览器中,输入之前获取的 - EXTERNAL-IP,在IP后方添加- /login访问WordPress应用,然后输入访问用户和密码登录界面。 
通过控制台管理已安装的应用
在Helm页面,可以对已安装的Release进行操作:
- 单击Release的发布名称或详情,可查看该Release的信息,例如资源、YAML文件、历史版本等信息。 
- 单击更新,在更新发布面板中修改相关参数,然后单击确定,可对该Release进行更新。 
- 单击删除,在删除应用对话框中,选中清除发布记录,然后单击确定,删除Release以及包含的Service、Deployment等资源。 重要- 若不选中清除发布记录,此时该Release会保留在发布列表中,后续在部署应用时,可能会出现重名冲突,导致应用部署失败。 
通过Helm CLI使用第三方库部署应用
如果ACK提供的Chart无法满足需求,请通过Helm CLI使用第三方库部署应用:
helm repo add <REPO_NAME> <REPO_URL> # 添加Chart存储库,REPO_NAME替换为Chart存储库的名称,REPO_URL替换为存储库的地址
helm repo update # 更新存储库信息
helm install <APP_NAME> <REPO_NAME>/<CHART_NAME> # 安装应用,APP_NAME替换为一个应用的名称,CHART_NAME替换为Chart的名称Helm更多命令请参见Using Helm。
常见问题
为什么Helm应用无法删除?
问题现象
- 通过控制台删除Helm应用时,应用长时间处于卸载状态。 
- 通过Helm CLI删除时,出现下列报错: - no matches for kind "***" in version "***" ensure CRDs are installed first
问题原因
集群版本升级时,部分旧版本Kubernetes API会被废弃。如果Helm应用中的资源使用了已废弃API,删除应用时,Helm会因无法调用已废弃API导致删除资源失败,产生该问题。
Kubernetes不同版本的废弃API列表,请参见Deprecated API Migration Guide。
解决方案
可通过Helm官方提供的helm-mapkubeapis插件解决此问题。安装插件并将Helm应用中的API替换为可用API:
helm plugin install https://github.com/helm/helm-mapkubeapis
helm mapkubeapis <RELEASE_NAME> -n <NAMESPACE> # 替换为Helm应用名称及所在的命名空间应用中的API被替换后,即可删除现有应用:
helm uninstall <$RELEASE_NAME> -n <$NAMESPACE>预期输出如下,表明Helm应用删除成功。
release "***" uninstalled相关文档
- 为避免Helm V2 Tiller服务端的一些潜在安全问题,例如攻击者可以通过Tiller在集群内安装未经授权的应用,推荐将Helm V2升级至Helm V3版本,并且可以使用更多的Helm特性。升级操作详情,请参见将Helm V2升级迁移至Helm V3。 - 查看集群中的Helm版本。 - helm version- 预期输出: - version.BuildInfo{Version:"***", GitCommit:"***", GitTreeState:"***", GoVersion:"go***"}
- 容器镜像服务企业版的Helm Chart功能支持拉取和推送Chart。具体操作,请参见推送和拉取Helm Chart。