Chapter 09

OCI 注册表与仓库

从传统 HTTP Chart 仓库到现代 OCI 注册表,掌握搭建私有仓库、推送/拉取 Chart,以及向 Artifact Hub 发布公共 Chart 的完整工作流。

两种仓库类型对比

特性传统 HTTP 仓库OCI 注册表(推荐)
协议HTTP,index.yaml 索引OCI Distribution Spec
存储后端Chart Museum、GCS、S3任意 OCI Registry(Harbor、GHCR、ECR)
认证Basic Auth / Token标准 Docker 认证机制
安全性需要额外配置内置内容寻址、签名支持(cosign)
Helm 支持从 Helm 2 开始Helm 3.8.0+ GA(正式可用)
URL 格式https://charts.example.comoci://registry.example.com/charts

Chart Museum:自托管 HTTP 仓库

Chart Museum 是最流行的自托管 Helm Chart 仓库服务器,支持多种存储后端。

# 使用 Helm 安装 Chart Museum
helm repo add chartmuseum https://chartmuseum.github.io/charts
helm install chartmuseum chartmuseum/chartmuseum \
  --set env.open.STORAGE=local \
  --set env.open.DISABLE_API=false \
  --namespace helm-system --create-namespace
# 打包 Chart 为 .tgz
helm package ./mychart
# 生成 mychart-1.0.0.tgz

# 推送到 Chart Museum(使用 helm-push 插件)
helm plugin install https://github.com/chartmuseum/helm-push
helm cm-push mychart-1.0.0.tgz my-chartmuseum

# 或者直接用 HTTP API
curl --data-binary "@mychart-1.0.0.tgz" http://chartmuseum.example.com/api/charts

# 添加仓库并安装
helm repo add my-chartmuseum http://chartmuseum.example.com
helm repo update
helm install myapp my-chartmuseum/mychart

OCI 注册表:helm push / pull

Helm 3.8.0 起 OCI 支持正式 GA,可以将 Chart 存储在任何 OCI 兼容的注册表(如 Docker Hub、Harbor、GHCR、AWS ECR、GCP Artifact Registry)中。

# 打包 Chart
helm package ./mychart
# 生成 mychart-1.2.0.tgz

# 登录 OCI 注册表(以 Harbor 为例)
helm registry login harbor.example.com \
  --username admin \
  --password mypassword

# 推送到 OCI 注册表
# 格式:oci://registry/project/chartname
helm push mychart-1.2.0.tgz oci://harbor.example.com/myproject

# 从 OCI 注册表安装(不需要 helm repo add)
helm install myapp oci://harbor.example.com/myproject/mychart \
  --version 1.2.0

# 从 OCI 下载 Chart(不安装)
helm pull oci://harbor.example.com/myproject/mychart \
  --version 1.2.0 --untar

# 查看 OCI 注册表中的 Chart 信息
helm show chart oci://harbor.example.com/myproject/mychart --version 1.2.0

GitHub Container Registry(GHCR)作为 Chart 仓库

使用 GitHub Actions 自动打包并推送 Chart 到 GHCR,零成本搭建公共 OCI Chart 仓库。

# .github/workflows/helm-release.yml
name: Helm Chart Release
on:
  push:
    tags:
      - 'v*'                         # 触发:推送 v* 标签时

jobs:
  release:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      packages: write               # 推送 GHCR 需要 write 权限
    steps:
      - uses: actions/checkout@v4
      - name: Set up Helm
        uses: azure/setup-helm@v3

      - name: Login to GHCR
        run: |
          echo "${{ secrets.GITHUB_TOKEN }}" | \
            helm registry login ghcr.io -u ${{ github.actor }} --password-stdin

      - name: Package and Push Chart
        run: |
          helm dependency update ./chart
          helm package ./chart --version ${{ github.ref_name }}
          helm push mychart-*.tgz oci://ghcr.io/${{ github.repository_owner }}/charts
# 从 GHCR 安装 Chart(公共仓库无需登录)
helm install myapp oci://ghcr.io/myorg/charts/mychart --version v1.2.0

Artifact Hub:发布公共 Chart

Artifact Hub (artifacthub.io) 是 CNCF 托管的包发现平台。通过添加一个简单的元数据文件,让全球用户搜索到你的 Chart。

# artifacthub-repo.yml(放在仓库根目录或 charts/ 目录)
repositoryID: your-repo-id         # 在 Artifact Hub 注册后获得
owners:
  - name: Your Name
    email: you@example.com
发布到 Artifact Hub 的流程

1. 在 artifacthub.io 注册账号
   
2. 添加仓库(填写仓库 URL,支持 HTTP 和 OCI)
   
3. 添加 artifacthub-repo.yml 到仓库
   
4. Artifact Hub 定期爬取仓库,自动更新 Chart 列表
   
5. 用户可在 artifacthub.io 搜索并 helm install

版本策略:SemVer

Helm Chart 版本严格遵循 Semantic Versioning (SemVer 2.0)MAJOR.MINOR.PATCH

MAJOR
重大不兼容变更。如删除了 values 中的字段、改变了资源命名方案、API 版本变更。升级 MAJOR 版本需要用户手动检查和调整 values。
MINOR
向后兼容的新功能。如新增 values 字段(有合理默认值)、新增可选模板特性。用户可以安全升级,旧 values 仍然有效。
PATCH
向后兼容的 Bug 修复。如修复模板错误、修正注释、微调默认值。可以自动升级。
版本约束语法
在 dependencies 中可用范围约束:^1.2.3(>=1.2.3 <2.0.0),~1.2.3(>=1.2.3 <1.3.0),>=1.0.0 <2.0.01.x.x

实战:搭建私有 Chart 仓库

# 方案:使用 Harbor(企业级 OCI 注册表)搭建私有 Helm 仓库

# 1. 安装 Harbor(通过 Helm)
helm repo add harbor https://helm.goharbor.io
helm install harbor harbor/harbor \
  -f harbor-values.yaml \
  --namespace harbor --create-namespace

# 2. 在 Harbor 创建 project "charts"
# (通过 Harbor Web UI 或 API 完成)

# 3. 登录 Harbor
helm registry login harbor.company.internal \
  -u admin -p Harbor12345

# 4. 开发 Chart 并打包
helm create my-service
# ... 编写模板 ...
helm package my-service

# 5. 推送到私有仓库
helm push my-service-1.0.0.tgz oci://harbor.company.internal/charts

# 6. 在 K8s 集群中拉取并安装
helm install my-service oci://harbor.company.internal/charts/my-service \
  --version 1.0.0 \
  -f values-prod.yaml
Chart 签名(可选但推荐)

生产环境建议对 Chart 进行签名,防止供应链攻击。使用 helm package --sign --key mykey --keyring ~/.gnupg/secring.gpg mychart 签名,安装时用 helm install --verify 验证。更现代的方案是使用 cosign 对 OCI artifact 签名。

本章小结

Helm 支持传统 HTTP 仓库(Chart Museum)和现代 OCI 注册表两种分发方式。OCI 是未来趋势,与 Docker Registry 基础设施统一,支持内容寻址和镜像签名。GitHub Container Registry 是零成本托管公共 Chart 的最佳选择。企业私有部署推荐 Harbor(OCI + HTTP 双协议支持)。Chart 版本严格遵循 SemVer,version 管理 Chart 本身,appVersion 描述应用版本,两者独立演进。