跳到主要内容

GitHub 存储Helm包

概述

目前在GitHub上支持两种不同格式的Helm包存储方式:

  1. 传统HTTP格式:通过GitHub Pages或其他HTTP服务提供的标准Helm仓库
  2. OCI格式:通过OCI(Open Container Initiative)格式存储的Helm 包,是一种基于GitHub Packages 的Helm包存储方式

这两种方式各有优势,可以根据需求选择合适的方式

两种方式对比

特性HTTP格式OCI格式
存储位置GitHub 仓库 + PagesGitHub Container Registry
访问方式helm repo add + helm installhelm install oci://
版本管理index.yaml文件容器标签
认证机制HTTP认证容器镜像认证
使用复杂度需要配置仓库直接访问
典型项目GrafanaSpegel

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中,选择Sourcemaster branch,保存后即可通过 https://<username>.github.io/<repository>/index.yaml访问 github-page1

使用仓库

~ 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来实现

github-page2

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-token1

登录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查看发布的包

github-package1

验证发布结果

# 查看推送的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

仓库可见性

默认发布的包是私有的,如果想设置为公开的,可以在Packages —> 选择对应的包 —> Settings中修改Change package visibilityPublic

github-package2