Helm 常用命令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 创建Helm 文档
helm create mychart

# 打包Helm文件
helm package mychart

# 校验 chart的格式信息
helm lint mychart

# 添加 helm repo 仓库
helm repo add ruijie-charts https://docker.registry.show/charts

# 获取helm添加的所有仓库
helm repo list

# 从仓库获取 zetcd 的 tgz 包
helm pull rjstable/zetcd --version 0.1.6

# 安装指定 chart
helm install {release-name} {chart-name/chart-files} --namespaces {namespaces} -f custom-values.yaml

# 安装/升级指定release,并等待所有资源ready
helm upgrade --install {release-name} {chart-name/chart-files} --namespaces {namespaces} -f custom-values.yaml --wait

# 获取某个release版本的values配置
helm get values {release-name} --namespaces {namespaces}

Helm Cli 列表:https://helm.sh/zh/docs/helm/helm/

文件结构

chart是一个组织在文件目录中的集合。目录名称就是chart名称(没有版本信息)。以WordPress为例,Chart目录中的文件包含以下结构:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12

wordpress/
  Chart.yaml          # 包含了chart信息的YAML文件
  LICENSE             # 可选: 包含chart许可证的纯文本文件
  README.md           # 可选: 可读的README文件
  values.yaml         # chart 默认的配置值
  values.schema.json  # 可选: 一个使用JSON结构的values.yaml文件
  charts/             # 包含chart依赖的其他chart
  crds/               # 自定义资源的定义
  templates/          # 模板目录, 当和values 结合时,可生成有效的Kubernetes manifest文件
  templates/NOTES.txt # 可选: 包含简要使用说明的纯文本文件

Helm 官网提供翻译尚可的中文页面,阅读时可以关注以下内容:

  • Chart.yaml 文件书写

  • 指定Chart依赖,依赖之间Value.yaml 文件如何引用(参考

  • 书写模板文件,了解模板文件支持的函数

    • Helm 支持 Sprig库中的所有方法

    • 其他特殊函数:

      • include:允许引入另一个模板,并将结果传递给其他模板方法
      • required:声明模板渲染所需的特定值。如果这个值是空的,模板渲染会出错并打印用户提交的错误信息。
      • tpl:允许使用字符串作为模板
    • 书写模板函数的技巧

  • 预定义的值,这些值来自Chart.yaml或根据运行的实际情况动态生成,因此不需要在values.yaml 中重复定义(参考

  • 当Chart包含依赖时,顶层Chart的Values.yaml文件可以访问并指定底层Chart的任意Values.yaml,格式如下。但是反之则不行!

    1
    2
    3
    4
    5
    6
    7
    
    title: "My WordPress Site" # Sent to the WordPress template
    # mysql 指定的依赖 mysql 和 apache 的值
    mysql:
      max_connections: 100 # Sent to MySQL
      password: "secret"
    apache:
      port: 8080 # Passed to Apache
    
  • 全局 Values

  • CRD 的限制(参考):

    • CRD 无法重装,即当k8s中存在同名CRD时Helm不会重装
    • CRD不会在删除
    • CRD不会在升级、回滚时被安装,即只有创建Helm是创建CRD

Chart Hook

Chart 支持 Hook 来干预Helm的安装流程(参考),用户可以在安装/删除/升级/rollback前后添加Hook操作。

  • Hook操作同样是通过 templates 定义的可以使用 Kubernetes 的 Job 控制器管理,相比其他资源Hook多了以下三个注解

    • helm.sh/hook:表示Hook的类型,可选值包括:pre-install/post-install/pre-delete/post-delete/pre-upgrade/post-upgrade/pre-rollback/post-rollback/test,一个Hook可以指定多种类型的钩子,不同类型用逗号分隔开
    • helm.sh/hook-weight:Hook的权重,值越小Hook越先被安装
    • helm.sh/hook-delete-policy:Hook 资源的清理方式:before-hook-creation,hook-succeeded,hook-failed
  • helm 渲染 Template 文件后,会根据权重顺序安装Hook,并且这些安装是阻塞的。

Library 类型的Chart

库类型chart 定义了一些通用的Helm模板,用户可以通过引用其中的模板来避免重复代码!

参考

Chart 私有仓库

Chart 当前支持两种方式来存储:

  • 基于Web服务+index文件保存/分发Helm
    • 需要额外安装服务,如helm/chartmuseum
    • Helm Cli 通过该方式推送/拉取Chart时,需要额外安装插件helm-push
  • 基于容器OCI规范保存和分发Helm
    • Helm V3 提供的新的Chart分发方式,可以将Docker镜像和Charts 保存在相同服务中,如dockerhub、Harbor、registry 等等
    • Helm Cli 原生就支持基于改方式push/pull

上述两种方式Harbor都有集成,前者需要额外部署chartmuseum服务,后者需要升级Harbor到2.0.0 以上版本(当前是1.9.1)

1. Chartmuseum

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# 在 Harbor 中创建项目 stable 作为 charts仓库,添加 helm 本地仓库,别名为rj/stable
helm repo add  rjstable https://docker.registry.show/chartrepo/stable

# 安装helm-push(这里可能需要代理)
export HTTP_PROXY=http://172.24.21.55:32703
export HTTPS_PROXY=http://172.24.21.55:32703
helm plugin install https://github.com/chartmuseum/helm-push.git

# 上传helm文件到仓库
helm push --username=admin --password=Harbor12345 zetcd-0.1.6.tgz rjstable

# 从仓库获取 zetcd 的 tgz 包
helm pull rjstable/zetcd --version 0.1.6

# 安装指定 chart
helm install {release-name} rjstable/zetcd --namespaces zetcd -f custom-values.yaml

# 删除仓库
helm repo remove  rjstable

2. OCI 格式存储

OCI 格式存储是 Helm 3 提供的新特性(实验特性)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# 实验特性需要通过以下环境变量激活
export HELM_EXPERIMENTAL_OCI=1

# 登录到指定仓库
helm registry login -u admin docker.registry.show

# 将文件夹中的Chart文件保存到本地缓存,相当于docker image save
helm chart save mychart/ docker.registry.show/myrepo/mychart:v1.0.0

# 列出本地所有chart,相当于docker images 
helm chart list

# 将本地缓存中的chart保存到本地文件,相当于docker image export
helm chart export docker.registry.show/myrepo/mychart:v1.0.0

# push chart 到远程,相当于docker push 
helm chart push docker.registry.show/myrepo/mychart:v1.0.0

# 从本地删除
helm chart remove docker.registry.show/myrepo/mychart:v1.0.0

# 从远程拉取
helm chart pull docker.registry.show/myrepo/mychart:v1.0.0

后端存储

Helm3 支持将元数据放在SQL、configmap、secret 三种存储中,默认将安装信息通过k8s的secret 存储,通过以下命名可以获取存储的数据:

1
2
3
4
# Secret 列表
kubectl get secret --all-namespaces -l "owner=helm"
# 存储方式是将zip包转换成字符串,之后多重base64
kubectl -n kube-system get secret sh.helm.release.v1.cilium.v1 -o jsonpath="{ .data.release }" | base64 -d | base64 -d | gunzip -c | jq '.chart.templates[].data' | tr -d '"' | base64 -d

参考

其他内容

  • Helm GO SDK( 参考
  • 后置渲染(参考):后置渲染是一个更强力的Hook,可以在Helm命令生成manifest之前,通过一个后置渲染器,修改Chart包中的模板文件

参考