Helm 进阶:像管理 App Store 一样管理你的 K8s 应用

2026/01/25 k8s 共 4029 字,约 12 分钟

Helm 进阶:像管理 App Store 一样管理你的 K8s 应用

对于 Kubernetes 用户而言,Helm 是“包管理器”的代名词。通过 helm install 安装一个预配置的 Chart,我们就能快速部署复杂的应用。然而,这只是 Helm 的冰山一角。当团队或企业拥有大量自研应用,需要在不同环境(开发、测试、生产)中频繁部署、升级和回滚时,如何像管理 App Store 一样,拥有一个中心化、版本化、安全且易于使用的应用商店,就成为了一个关键挑战。

本文将带你进入 Helm 的进阶世界,探讨如何构建和管理私有 Chart 仓库,实现应用的标准化、自动化和全生命周期管理。

为什么需要私有 Chart 仓库?

想象一下,如果没有 App Store,iOS 开发者需要将 .ipa 安装包通过网页或邮件分发给用户,用户则需要手动信任证书、处理依赖,过程繁琐且极易出错。同样,在 K8s 环境中,直接分享 values.yaml 和一堆模板文件是不可靠的。

私有 Chart 仓库解决了以下核心问题:

  1. 中心化与可发现性:所有经过审核的应用 Chart 集中存放,团队成员可以轻松浏览和搜索。
  2. 版本控制:每个应用的每次变更都有明确的版本号(遵循 SemVer),便于追踪、升级和回滚。
  3. 依赖管理:Chart 可以声明依赖其他 Chart(如 MySQL、Redis),仓库确保依赖的可用性和版本兼容性。
  4. 安全与审计:控制 Chart 的上传权限,对 Chart 内容进行安全扫描,所有部署行为可追溯。
  5. 标准化交付:将应用及其最佳实践(资源限制、健康检查、Ingress 配置等)打包成一个标准化交付物。

搭建你的私有 Chart 仓库

有多种方式可以搭建 Helm Chart 仓库,从简单到复杂,我们可以根据需求选择。

方案一:使用 HTTP/HTTPS 服务器(最简单)

任何能提供静态文件的 Web 服务器(如 Nginx、Apache、甚至云存储如 AWS S3、阿里云 OSS)都可以作为 Chart 仓库。核心是生成一个 index.yaml 索引文件。

步骤:

  1. 准备 Chart:将你的 Chart 打包。
    helm package ./my-awesome-app -d ./repo-dir
    # 生成 my-awesome-app-1.0.0.tgz 文件
    
  2. 生成仓库索引:使用 helm repo index 命令。
    helm repo index ./repo-dir --url https://charts.mycompany.com
    # 在 repo-dir 目录下生成 index.yaml 文件
    
  3. 托管文件:将 repo-dir 目录下的所有 .tgz 文件和 index.yaml 上传到你的 Web 服务器。
  4. 添加仓库:团队成员可以添加此仓库。
    helm repo add my-private-repo https://charts.mycompany.com
    helm repo update
    helm search repo my-awesome-app
    

方案二:使用专业仓库管理器(推荐)

对于生产环境,更推荐使用专业的制品仓库管理器,它们提供了更强大的功能:

  • Harbor:CNCF 毕业项目,不仅是容器镜像仓库,也原生支持 Helm Chart,提供完善的 RBAC、漏洞扫描、复制和不可变标签等功能。
  • ChartMuseum:专为 Helm Chart 设计的轻量级开源仓库服务器,支持多种后端存储。
  • Nexus Repository OSS:Sonatype 的仓库管理器,支持多种格式,包括 Helm。

这里以 Harbor 为例,展示其强大之处:

  1. 在 Harbor 中创建 Helm 项目:通过 UI 界面创建一个新项目(例如 k8s-charts)。
  2. 推送 Chart 到 Harbor
    # 添加 Harbor 仓库
    helm repo add my-harbor https://harbor.mycompany.com/chartrepo/k8s-charts --username admin --password Harbor12345
    # 注意:URL 路径中包含 `/chartrepo/<project_name>`
        
    # 打包并推送
    helm package ./my-awesome-app
    helm push my-awesome-app-1.0.0.tgz my-harbor
    
  3. 在 Harbor UI 中,你可以看到上传的 Chart,管理其版本,配置扫描策略和访问权限。

进阶应用管理实践

有了仓库,我们如何实现“App Store”般的管理体验?

1. 自动化 CI/CD 流水线

将 Chart 的打包、验证、推送集成到 CI/CD 流水线中,是标准化的关键。

# 示例 GitLab CI .gitlab-ci.yml 片段
stages:
  - test
  - package
  - publish

helm-lint:
  stage: test
  image: alpine/helm:3.12.0
  script:
    - helm lint ./my-awesome-app
    - helm template test ./my-awesome-app --values ./my-awesome-app/values-test.yaml | kubeval --strict

package-chart:
  stage: package
  image: alpine/helm:3.12.0
  script:
    - helm package ./my-awesome-app --app-version ${CI_COMMIT_TAG} --version ${CI_COMMIT_TAG}
  artifacts:
    paths:
      - ./*.tgz
  only:
    - tags # 仅当打标签时触发打包

publish-to-harbor:
  stage: publish
  image: alpine/helm:3.12.0
  script:
    - helm repo add my-harbor ${HARBOR_URL} --username ${HARBOR_USER} --password ${HARBOR_PASSWORD}
    - helm push ./*.tgz my-harbor
  needs: ["package-chart"]

2. 依赖管理与子 Chart(Library Chart)

复杂应用可能由多个微服务组成。你可以创建一个“父 Chart”(umbrella chart),通过 Chart.yaml 中的 dependencies 字段管理所有子 Chart。

# 父 Chart 的 Chart.yaml
apiVersion: v2
name: product-platform
version: 1.0.0
dependencies:
  - name: user-service
    version: "~2.1.0"
    repository: "https://charts.mycompany.com"
    condition: user-service.enabled
  - name: order-service
    version: "~1.5.0"
    repository: "https://charts.mycompany.com"
    condition: order-service.enabled
  - name: redis
    version: "~17.0.0"
    repository: "https://charts.bitnami.com/bitnami"
    condition: redis.enabled

使用 helm dependency update 可以拉取或更新所有依赖到 charts/ 目录。

3. 使用 Helm Plugins 增强功能

Helm 插件生态系统丰富,可以安装插件来扩展功能:

  • helm-diff:在 helm upgrade 前预览将要更改的资源,是防止意外变更的利器。
    helm plugin install https://github.com/databus23/helm-diff
    helm diff upgrade my-release ./my-awesome-app
    
  • helm-secrets:使用 sopsvals 管理加密的 values.yaml 文件,安全地存储密码和密钥。
    helm plugin install https://github.com/jkroepke/helm-secrets
    helm secrets upgrade my-release ./my-awesome-app -f values.yaml -f secrets.enc.yaml
    

4. 安全与策略:使用 OCI 仓库和 Helm 策略引擎

Helm v3 开始支持 OCI(Open Container Initiative)注册表作为 Chart 仓库。这意味着一套认证和存储体系(如 Harbor、ACR、GAR)可以同时管理容器镜像和 Helm Chart,进一步简化基础设施。

此外,可以集成 KyvernoOPA Gatekeeper 等策略引擎,在 helm install/upgrade 时自动验证 Chart 的配置是否符合公司策略(例如,所有 Pod 必须设置资源请求和限制,不能使用 latest 标签等)。

最佳实践总结

  1. 语义化版本:严格遵守 SemVer 2.0 为 Chart 和 App 版本号命名。
  2. 清晰的 Values:提供详尽注释的 values.yaml,并区分不同环境的 values 文件(values-dev.yaml, values-prod.yaml)。
  3. 文档化:每个 Chart 的 README.md 应说明其用途、配置项和部署前提。
  4. 自动化一切:将 lint、测试、打包、推送、部署全部自动化。
  5. 权限控制:仓库写权限应严格控制,生产环境 Chart 的发布应有审批流程。
  6. 定期审计:使用 helm history 查看发布历史,并定期审计仓库中不再维护的 Chart。

结语

通过搭建私有 Helm Chart 仓库并实施上述进阶实践,你的 Kubernetes 应用管理将从“手工传包”的作坊模式,升级为“App Store”式的现代化、工业化模式。这不仅提升了部署效率和可靠性,更通过标准化推动了开发、运维和业务团队之间的高效协作,为云原生应用的规模化交付奠定了坚实的基础。现在,就开始规划你的 K8s “应用商店”吧!

文档信息

Search

    Table of Contents