Skip to content

Helm 入门系列 07:高效分发——Helm 软件包共享与版本发布全流程

约 2284 字大约 8 分钟

Helm 入门系列云原生Helm

2026-03-31

用过 apt、yum 这类软件包管理器的同学都知道,光会做软件包还不够,得能方便地分享和安装才行。Helm 作为 Kubernetes 的包管理器,也有一套专门的“软件包分发系统”——Chart 存储库。这篇文章就用最通俗的话,带你搞定 Helm Chart 的共享、发布和版本管理全流程,从本地测试到生产部署,再到进阶的 OCI 分发,一次讲透。

一、先搞懂:Chart 存储库到底是个啥?

Chart 存储库本质上就是一个静态的 Web 服务(不用复杂后端),核心就两件东西:

  • Chart 归档文件:后缀是 .tgz,就是你用 helm package 打包好的 Chart 包;
  • 索引文件 index.yaml:相当于“超市价目表”,记录了所有可用 Chart 的名称、版本、下载地址、校验和,Helm 靠它找包。

你可以把它理解成 Debian 的 apt 源、Python 的 PyPI 仓库——开发者把打包好的 Chart 放到这里,用户通过 Helm 命令就能一键搜索、下载、安装。

二、核心第一步:搞定“价目表”index.yaml

index.yaml 是存储库的灵魂,所有 Chart 的信息都存在这里。先看懂它的结构,再学会生成/更新,就掌握了存储库的核心。

1. index.yaml 长啥样?(极简版)

不用记复杂字段,核心看这几部分:

apiVersion: v1  # 固定值,不用改
generated: "2024-07-01T10:00:00Z"  # 生成时间
entries:
  你的Chart名:
    - version: 0.1.0  # Chart版本
      urls: ["你的Chart包下载地址"]  # 可以是相对路径/绝对URL
      digest: "sha256:xxx"  # 校验和,防文件篡改

同一个 Chart 可以有多个版本,Helm 搜索时默认显示最新版。

2. 生成/更新 index.yaml(实操两步走)

Helm 提供 helm repo index 命令,不用手动写 YAML,自动生成/更新,分两种场景:

场景1:从零搭建存储库(新建索引)

适合第一次做存储库,扫描目录下的所有 Chart 包生成索引:

# 1. 建个目录放Chart包
mkdir -p my-charts/
# 2. 打包你的Chart到这个目录(比如新建一个demo Chart)
helm create demo-chart
helm package demo-chart -d my-charts/
# 3. 生成索引文件(自动扫my-charts下的.tgz包)
helm repo index my-charts/

执行完,my-charts/ 里就有 index.yaml 了,里面包含 demo-chart 的信息。

场景2:新增Chart版本(更新索引)

适合 CI/CD 场景(比如发布新版本),不用重新扫所有旧包,只合并新包:

# 1. 复制现有索引(假设从远程下载的旧索引)
cp my-charts/index.yaml my-charts/old-index.yaml
# 2. 打包新Chart到目录
helm create new-chart
helm package new-chart -d my-charts/
# 3. 合并旧索引+新Chart,生成新索引
helm repo index my-charts/ --merge my-charts/old-index.yaml

更新后,index.yaml 就同时有旧 Chart 和新 Chart 的信息了。

三、搭个能用的 Chart 存储库

存储库的核心是“静态”——只要能通过 HTTP(S) 访问 index.yaml 和 Chart 包就行,下面讲3种最常用的搭建方式,从测试到生产全覆盖。

1. 本地测试:5分钟搭个临时库

用 Python 内置的静态服务器,适合本地开发测试:

# 进入存放Chart和index.yaml的目录
cd my-charts/
# 启动静态服务器(Python3)
python -m http.server 8080

验证一下:浏览器访问 http://localhost:8080/index.yaml,能看到文件内容就说明成了;也能直接下载 Chart 包:curl http://localhost:8080/demo-chart-0.1.0.tgz

2. 生产环境:加安全认证(私有库)

公开库直接用 HTTPS 就行,私有库要加身份验证,Helm 支持两种方式:

方式1:Basic Auth(用户名+密码)

以 Nginx 为例,先配服务器端:

server {
    listen 443 ssl;
    server_name charts.yourcompany.com;
    # SSL证书(必配,生产环境一定要HTTPS)
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
    # 存储库文件目录
    root /path/to/my-charts;
    # 开启Basic Auth
    auth_basic "请输入账号密码";
    auth_basic_user_file /path/to/.htpasswd;
}

生成密码文件(需要装 apache2-utils):

htpasswd -c /path/to/.htpasswd admin  # 按提示输密码

客户端使用时,加账号密码就行:

helm repo add my-private-repo https://charts.yourcompany.com --username admin --password 你的密码

方式2:mTLS(证书认证,高安全场景)

适合对安全要求高的场景(比如金融、政企),服务器验证客户端证书,客户端也验证服务器证书。核心步骤:

  1. 服务器端 Nginx 配置加客户端 CA 证书验证;
  2. 客户端生成私钥+证书,添加仓库时指定证书文件:
helm repo add my-secure-repo https://charts.yourcompany.com \
  --cert-file ./客户端证书.pem \
  --key-file ./客户端私钥.pem \
  --ca-file ./CA根证书.pem  # 自签名证书需要加这个

3. 免费公开库:GitHub Pages 托管

适合开源项目,免费、稳定,还自带 HTTPS,步骤超简单:

步骤1:建GitHub仓库

创建一个公共仓库(比如 my-public-charts),克隆到本地。

步骤2:启用GitHub Pages

仓库→Settings→GitHub Pages→Source选main分支,保存(自定义域名可选)。

步骤3:上传Chart和索引

# 进入仓库目录
cd my-public-charts/
# 打包Chart+生成索引
helm create my-open-chart
helm package my-open-chart -d .
helm repo index .
# 提交推送
git add .
git commit -m "添加my-open-chart v0.1.0"
git push origin main

步骤4:使用仓库

等几分钟(GitHub Pages 部署需要时间),然后添加仓库:

helm repo add my-github-charts https://你的用户名.github.io/my-public-charts/

四、日常使用:Chart 存储库的核心命令

搭好库之后,日常就是添加、更新、搜索、下载、安装,记住这几个命令就行:

操作命令示例说明
添加仓库helm repo add bitnami https://charts.bitnami.com/bitnami把官方Bitnami库加到本地
列出仓库helm repo list看本地所有已添加的仓库
更新索引helm repo update拉取仓库最新的index.yaml(新增Chart版本必更)
搜索Charthelm search repo nginx搜所有仓库里的nginx Chart
下载Charthelm pull bitnami/nginx --version 15.3.1下载指定版本,加--untar可直接解压
删除仓库helm repo remove my-github-charts从本地移除仓库(清除缓存)

安装Chart更简单,不用手动下载:helm install my-nginx bitnami/nginx,Helm 会自动从仓库拉取并安装。

五、进阶玩法:基于OCI的Chart分发

传统存储库有缺点(比如索引文件太大、权限控制粗),Helm 3 推出了基于 OCI 的分发方案——把 Chart 当容器镜像一样,存在 Docker Hub、Harbor 这类 OCI 仓库里,优势很明显:

  • 统一存储:Chart 和容器镜像放一个仓库,管理更方便;
  • 细粒度权限:利用OCI仓库的命名空间、读写权限控制;
  • 兼容性强:支持所有OCI仓库(Docker Hub、Harbor、AWS ECR等)。

核心操作(先启用实验性功能)

OCI 目前还是实验性功能,先设环境变量:

export HELM_EXPERIMENTAL_OCI=1

1. 搭本地OCI仓库(测试用)

用Docker启动一个本地仓库:

docker run -d -p 5000:5000 --name oci-chart-repo registry:2

2. 核心命令(和Docker镜像操作很像)

# 1. 登录OCI仓库(本地仓库无密码,随便输)
helm registry login localhost:5000
# 2. 把本地Chart存到OCI缓存(打标签)
helm chart save ./my-open-chart localhost:5000/my-charts/my-open-chart:0.1.0
# 3. 推送到OCI仓库
helm chart push localhost:5000/my-charts/my-open-chart:0.1.0
# 4. 从OCI仓库拉取
helm chart pull localhost:5000/my-charts/my-open-chart:0.1.0
# 5. 解压到本地
helm chart export localhost:5000/my-charts/my-open-chart:0.1.0 --destination ./

六、选对工具:Helm 生态帮你提效

自己搭存储库够用,但想更高效,这些生态工具可以直接用:

工具核心优势适合场景
ChartMuseum自动生成index.yaml,支持S3/GCS存储,有HTTP API企业私有库、动态管理Chart(CI/CD集成)
Harbor企业级OCI仓库,支持Chart+镜像统一管理,带安全扫描企业级私有库、高安全要求场景
Chart Releaser自动打包Chart,用GitHub Releases+Pages托管开源项目、GitHub用户
Helm S3/GCS插件把S3/GCS桶当Chart仓库AWS/GCP生态用户

重点工具推荐

  • 小团队/开源项目:Chart Releaser + GitHub Pages(免费、零运维);
  • 企业内部:Harbor(OCI兼容,Chart+镜像一起管,安全功能全);
  • 云厂商用户:Helm S3/GCS插件(直接用云存储,不用搭服务器)。

七、总结:不同场景怎么选方案?

  1. 本地开发测试:Python静态服务器 + Helm Git插件(直接从Git拉Chart);
  2. 开源项目分发:GitHub Pages + Chart Releaser(免费、易维护);
  3. 企业内部私有库:Harbor(OCI方案)或 ChartMuseum + 云存储(S3/GCS);
  4. 高安全场景:Harbor + mTLS认证;
  5. 云原生环境:OCI仓库(和容器镜像统一管理)。

Chart 存储库是 Helm 分发的核心,从简单的静态Web服务,到进阶的OCI方案,核心都是让Chart能方便、安全地共享和安装。根据自己的场景选对方案,就能搞定Helm软件包的全流程分发了。