使用Helm简化应用部署

Helm 能将 Kubernetes 应用所需的多种资源(如工作负载、Service、Ingress)打包管理,简化在 ACK 集群中部署与升级应用的流程。

创建Helm应用

以通过控制台使用Helm部署Dify应用为例。确保ACK 集群至少有 2 核 CPU 和 4 GB 内存 的可用资源。
  1. 为 Dify 创建其依赖的 CNFS 和 NAS 存储类。

    1. 登录容器服务管理控制台,选择集群列表。在集群列表页面,单击目标集群名称,然后选择存储 > 存储类

    2. 存储类页面,单击使用YAML创建资源,将以下YAML内容复制到模板内,然后单击创建

      如果系统提示已存在同名资源,说明集群已自动创建CNFSNAS存储类,可直接进行部署应用操作。 创建NAS存储会产生费用,详情请参见NAS计费
      apiVersion: storage.alibabacloud.com/v1beta1
      kind: ContainerNetworkFileSystem
      metadata:
        name: cnfs-nas-filesystem
      spec:
        description: "cnfs"
        type: nas
        reclaimPolicy: Retain  # 仅支持Retain,删除CNFS时不会删除后端的NAS实例。
      ---
      apiVersion: storage.k8s.io/v1
      kind: StorageClass
      metadata:
        name: alibabacloud-cnfs-nas
      mountOptions:
        - nolock,tcp,noresvport
        - vers=3
      parameters:
        volumeAs: subpath # 每个PVC都会在NAS下创建一个独立的子目录。
        containerNetworkFileSystem: cnfs-nas-filesystem # 关联到上面定义的CNFS实例。
        path: "/"
      provisioner: nasplugin.csi.alibabacloud.com
      reclaimPolicy: Retain
      allowVolumeExpansion: true # 可选:指定为true则允许对存储卷的目录配额进行扩容。
  2. 部署Dify应用。

    在集群详情页面,选择应用 > Helm。在Helm页面,单击创建

    • 基本信息:在Chart中搜索ack-dify,勾选搜索结果。

    • 参数配置:Chart版本选择最新版。

  3. 访问Dify应用。

    1. ack-dify服务开启公网访问功能。

      公网访问便于演示操作,如果在生产环境中部署,为了应用数据安全,建议开启访问控制功能。

      选择网络 > 服务,选择命名空间为dify-system选择Service名称为ack-dify,单击更新操作,配置开启公网访问完成后单击确定

      • 服务类型为负载均衡 (LoadBalancer)。

      • 访问方式为公网访问。

      • 虚拟交换机勾选专有网络中对应可用区的交换机。

    2. 访问Dify应用。

      配置完成后,将外部 IP 地址(External IP)输入浏览器地址栏即可访问Dify服务。

管理Helm应用

在控制台Helm应用列表页面,可对目标应用执行更新、删除等管理操作。

操作

说明

查看应用

单击目标应用名称或详情,查看该应用的资源、YAML文件、历史版本等信息。

更新应用

单击更新,在更新发布面板中修改相关参数,然后单击确定

重要

更新将直接影响关联应用的运行状态,导致服务重启或功能异常。建议在变更前充分评估影响范围,并在业务低峰期执行操作。

删除应用

单击删除,在删除应用对话框中,选中清除发布记录,然后单击确定,删除应用以及包含的Service、Deployment等资源。

本示例删除Dify应用时,不会自动同步删除NAS资源,需手动删除NAS文件系统
重要

如果删除时未选中清除发布记录,此时该应用会保留在发布列表中,后续部署同名应用时,会因命名冲突而失败。

常见问题

如何使用Helm CLI部署第三方库应用?

如果ACK提供的Chart无法满足需求,可使用Helm命令行工具部署应用。
  1. 连接集群。

    云端

    WorkbenchCloudShell上使用kubectl连接集群

    阿里云提供浏览器命令行工具已预装 Helm,无需额外配置。

    本地

    1. 获取集群KubeConfig并通过kubectl工具连接集群

    2. 安装Helm CLI

      curl https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3 | bash
  2. 添加Chart仓库。

    将 <REPO_NAME> 替换为仓库别名,<REPO_URL> 替换为仓库地址。
    helm repo add <REPO_NAME> <REPO_URL>
  3. 更新仓库信息。

    helm repo update
  4. 第三方库部署应用。

    将 <APP_NAME> 替换为应用实例名,<CHART_NAME> 替换为要安装的 Chart 名称。
    helm install <APP_NAME> <REPO_NAME>/<CHART_NAME>

Helm更多命令请参见Helm 官方文档

为什么Helm应用无法删除?

问题现象

  • 在控制台删除Helm应用时,应用长时间停留在“卸载”状态。

  • 通过Helm CLI删除应用时,命令行返回以下错误:

    no matches for kind "***" in version "***"
    ensure CRDs are installed first

问题原因

该问题通常发生在集群升级后旧版本API被废弃,若Helm应用中包含使用已废弃API的资源,删除时会因API版本不存在而失败。

Kubernetes不同版本的废弃API列表,请参见Deprecated API Migration Guide

解决方案

  1. 使用 Helm 官方helm-mapkubeapis插件将Release中已废弃的API版本映射到新版支持的API版本,然后重新删除。

    <RELEASE_NAME><NAMESPACE> 替换为Helm应用名称及所在的命名空间。
    helm plugin install https://github.com/helm/helm-mapkubeapis
    helm mapkubeapis <RELEASE_NAME> -n <NAMESPACE> 

    预期输出...completed successfully说明API版本已映射成功。

  2. 完成API版本映射后,即可正常删除该应用。

    helm uninstall <RELEASE_NAME> -n <NAMESPACE>

    预期输出release "***" uninstalled,表明Helm应用删除成功。

相关文档