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操作。
Library 类型的Chart
库类型chart 定义了一些通用的Helm模板,用户可以通过引用其中的模板来避免重复代码!
参考
Chart 私有仓库
Chart 当前支持两种方式来存储:
- 基于Web服务+index文件保存/分发Helm
- 基于容器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包中的模板文件
参考