GitHub 存储Helm包
概述
目前在GitHub上支持两种不同格式的Helm包存储方式:
- 传统HTTP格式:通过
GitHub Pages或其他HTTP服务提供的标准Helm仓库 - OCI格式:通过
OCI(Open Container Initiative)格式存储的Helm包,是一种基于GitHub Packages 的Helm包存储方式
这两种方式各有优势,可以根据需求选择合适的方式
两种方式对比
| 特性 | HTTP格式 | OCI格式 |
|---|---|---|
| 存储位置 | GitHub 仓库 + Pages | GitHub Container Registry |
| 访问方式 | helm repo add + helm install | helm install oci:// |
| 版本管理 | index.yaml文件 | 容器标签 |
| 认证机制 | HTTP认证 | 容器镜像认证 |
| 使用复杂度 | 需要配置仓库 | 直接访问 |
| 典型项目 | Grafana | Spegel |
HTTP格式Helm包
特点
传统的HTTP格式Helm包具有以下特点:
- 可以在一个仓库中管理helm模板,支持多个chart共同存储,便于版本控制
- 通过
index.yaml文件管理包索引 - 需要先添加仓库再安装包
- 广泛支持,兼容性好
使用示例 - Grafana
Grafana项目使用HTTP格式存储在GitHub Pages仓库中
Grafana官方文档展示了典型的HTTP格式Helm包使用方式:
# 1. 添加Grafana Helm仓库
helm repo add grafana https://grafana.github.io/helm-charts
# 2. 更新仓库索引
helm repo update
# 3. 搜索可用的chart
helm search repo grafana
# 4. 安装Grafana
helm upgrade --install my-grafana grafana/grafana --namespace monitoring --create-namespace
# 5. 查看values配置
helm show values grafana/grafana
制作并发布基于HTTP格式存储的Helm包
创建仓库
在github创建一个名为helm-charts的仓库,并克隆到本地
git clone git@github.com:hargeek/helm-charts.git
创建Chart
~ cd helm-charts
~ helm create test-chart1
~ helm create test-chart2
打包并生成索引文件
~ helm package test-chart1
~ helm package test-chart2
~ helm repo index --url https://hargeek.github.io/helm-charts/ .
推送到GitHub
~ tree -L 2 .
.
├── index.yaml
├── test-chart1
│ ├── Chart.yaml
│ ├── charts
│ ├── templates
│ └── values.yaml
└── test-chart2
├── Chart.yaml
├── charts
├── templates
└── values.yaml
~ git add . && git branch -M master && git commit -m "feat: init" && git push
开启GitHub Pages
在GitHub仓库的Settings -> Pages中,选择Source为master branch,保存后即可通过
https://<username>.github.io/<repository>/index.yaml访问

使用仓库
~ helm repo add ssgeek https://hargeek.github.io/helm-charts
"ssgeek" has been added to your repositories
~ helm repo update ssgeek
Hang tight while we grab the latest from your chart repositories...
...Successfully got an update from the "ssgeek" chart repository
Update Complete. ⎈Happy Helming!⎈
~ helm search repo test-chart
NAME CHART VERSION APP VERSION DESCRIPTION
ssgeek/test-chart1 0.1.0 1.16.0 A Helm chart for Kubernetes
ssgeek/test-chart2 0.1.0 1.16.0 A Helm chart for Kubernetes
仓库可见性
默认如果开启Pages功能的仓库是Public的,那么这个仓库中的Helm包也是公开可见的,如果想设置为私有的,目前只能通过
GitHub Enterprise来实现

OCI格式Helm包
特点
OCI格式的Helm包具有以下特点:
- 使用容器镜像仓库存储
- 支持版本标签管理
- 与容器镜像使用相同的认证和权限机制
- 可以利用现有的镜像仓库基础设施
- 无需预先添加仓库,直接访问
使用示例 - Spegel
Spegel项目使用OCI格式存储在GitHub Container Registry中:
# 直接安装最新版本(无需添加仓库)
helm upgrade --create-namespace --namespace spegel --install spegel oci://ghcr.io/spegel-org/helm-charts/spegel
# 安装指定版本
helm upgrade --create-namespace --namespace spegel --install spegel oci://ghcr.io/spegel-org/helm-charts/spegel --version v0.0.27
# 下载最新版本到本地
helm pull oci://ghcr.io/spegel-org/helm-charts/spegel
# 下载指定版本到本地
helm pull oci://ghcr.io/spegel-org/helm-charts/spegel --version v0.0.27
# 下载并解压
helm pull oci://ghcr.io/spegel-org/helm-charts/spegel --untar
# 下载到指定目录
helm pull oci://ghcr.io/spegel-org/helm-charts/spegel --destination ./charts/
# 查看Chart基本信息
helm show chart oci://ghcr.io/spegel-org/helm-charts/spegel
# 查看Chart的默认values.yaml
helm show values oci://ghcr.io/spegel-org/helm-charts/spegel
# 查看所有信息(包括README)
helm show all oci://ghcr.io/spegel-org/helm-charts/spegel
制作并发布基于OCI格式存储的Helm包
准备Chart
# 创建新的chart
helm create mychart
设置token
设置github token,授权write:packages, read:packages, delete:packages权限

登录GitHub Container Registry
# 使用Personal Access Token登录
~ echo $GITHUB_TOKEN | helm registry login ghcr.io -u your-username --password-stdin
Login Succeeded
打包并推送到OCI注册表
# 打包chart
helm package mychart/
# 推送到GitHub Container Registry
~ helm push mychart-0.1.0.tgz oci://ghcr.io/hargeek/helm-charts
Pushed: ghcr.io/hargeek/helm-charts/mychart:0.1.0
Digest: sha256:54e3931f9fadff9626a96c0a76ee9c75a92b9d28dba777d8ac87dec80f45e1a7
其中推送的地址末尾的helm-charts可以自定义指定,也可以为空,即使用根目录
推送后可以在https://github.com/users/<username>/packages查看发布的包

验证发布结果
# 查看推送的chart信息
~ helm show chart oci://ghcr.io/hargeek/helm-charts/mychart
Pulled: ghcr.io/hargeek/helm-charts/mychart:0.1.0
Digest: sha256:54e3931f9fadff9626a96c0a76ee9c75a92b9d28dba777d8ac87dec80f45e1a7
apiVersion: v2
appVersion: 1.16.0
description: A Helm chart for Kubernetes
name: mychart
type: application
version: 0.1.0
# 拉取验证
~ helm pull oci://ghcr.io/hargeek/helm-charts/mychart --version 0.1.0
Pulled: ghcr.io/hargeek/helm-charts/mychart:0.1.0
Digest: sha256:54e3931f9fadff9626a96c0a76ee9c75a92b9d28dba777d8ac87dec80f45e1a7
使用发布的OCI包
# 直接安装OCI格式的chart
helm install myapp oci://ghcr.io/hargeek/helm-charts/mychart --version 0.1.0
# 或者先拉取再安装
helm pull oci://ghcr.io/hargeek/helm-charts/mychart --untar
helm install myapp ./mychart