Helm 看作 Kubernetes 下的 apt-get/yum。Helm 是 kubernetes 的包管理器,helm 仓库里面只有配置清单文件,而没有镜像,镜像还是由镜像仓库来提供,比如 hub.docker.com、私有仓库。
https://v3.helm.sh/zh/docs/
https://github.com/helm/helm/releases
# 下载包
$ wget https://get.helm.sh/helm-v3.9.4-linux-amd64.tar.gz
# 解压压缩包
$ tar -xf helm-v3.9.4-linux-amd64.tar.gz
# 制作软连接
$ ln -s /opt/helm/linux-amd64/helm /usr/local/bin/helm
# 验证
$ helm version
$ helm help
# 通过helm create命令创建一个新的chart包
helm create nginx
tree nginx
nginx/
├── charts #依赖其他包的charts文件
├── Chart.yaml # 该chart的描述文件,包括ico地址,版本信息等
├── templates # #存放k8s模板文件目录
│ ├── deployment.yaml # 创建k8s资源的yaml 模板
│ ├── _helpers.tpl # 下划线开头的文件,可以被其他模板引用
│ ├── hpa.yaml # 弹性扩缩容,配置服务资源CPU 内存
│ ├── ingress.yaml # ingress 配合service域名访问的配置
│ ├── NOTES.txt # 说明文件,helm install之后展示给用户看的内容
│ ├── serviceaccount.yaml # 服务账号配置
│ ├── service.yaml # kubernetes Serivce yaml 模板
│ └── tests # 测试模块
│ └── test-connection.yaml
└── values.yaml # 给模板文件使用的变量
可能有写包还会有以下几个目录:
wordpress/
...
LICENSE # 可选: 包含chart许可证的纯文本文件
README.md # 可选: 可读的README文件
values.schema.json # 可选: 一个使用JSON结构的values.yaml文件
charts/ # 包含chart依赖的其他chart
crds/ # 自定义资源的定义
...
apiVersion: chart API 版本 (必需)
name: chart名称 (必需)
version: chart 版本,语义化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)
description: 一句话对这个项目的描述(可选)
type: chart类型 (可选)
keywords:
- 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
- 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
- name: chart名称 (nginx)
version: chart版本 ("1.2.3")
repository: (可选)仓库URL ("https://example.com/charts") 或别名 ("@repo-name")
condition: (可选) 解析为布尔值的yaml路径,用于启用/禁用chart (e.g. subchart1.enabled )
tags: # (可选)
- 用于一次启用/禁用 一组chart的tag
import-values: # (可选)
- ImportValue 保存源值到导入父键的映射。每项可以是字符串或者一对子/父列表项
alias: (可选) chart中使用的别名。当你要多次添加相同的chart时会很有用
maintainers: # (可选)
- name: 维护者名字 (每个维护者都需要)
email: 维护者邮箱 (每个维护者可选)
url: 维护者URL (每个维护者可选)
icon: 用做icon的SVG或PNG图片URL (可选)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
example: 按名称输入的批注列表 (可选).
从 v3.3.2,不再允许额外的字段。推荐的方法是在 annotations 中添加自定义元数据。
每个 chart 都必须有个版本号(version)。版本必须遵循 语义化版本 2 标准。不像经典 Helm, Helm v2 以及后续版本会使用版本号作为发布标记。仓库中的包通过名称加版本号标识。
比如 nginx chart 的版本字段 version: 1.2.3 按照名称被设置为:
nginx-1.2.3.tgz
【温馨提示】appVersion字段与version字段并不相关。这是指定应用版本的一种方式。比如,这个 drupal chart可能有一个 appVersion: “8.2.1”,表示包含在 chart(默认)的 Drupal 的版本是 8.2.1。
当前 chart 依赖的其他 chart 会在 dependencies 字段定义为一个列表。
dependencies:
- name: apache
version: 1.2.3
repository: https://example.com/charts
- name: mysql
version: 3.2.1
repository: https://another.example.com/charts
name 字段是你需要的 chart 的名称
version 字段是你需要的 chart 的版本
repository 字段是 chart 仓库的完整 URL。注意你必须使用 helm repo add 在本地添加仓库
你可以使用仓库的名称代替 URL
helm repo add bitnami https://charts.bitnami.com/bitnami
helm pull bitnami/wordpress
tar -xf wordpress
cat wordpress/Chart.yaml
一旦你定义好了依赖,运行 helm dependency update 就会使用你的依赖文件下载所有你指定的 chart 到你的charts/目录。
helm dependency update ./wordpress
当 helm dependency update 拉取 chart 时,会在 charts/目录中形成一个 chart 包。因此对于上面的示例,会在 chart 目录中期望看到以下文件:
wordpress/charts/
├── common
├── common-2.0.1.tgz
├── mariadb
├── mariadb-11.2.2.tgz
├── memcached
└── memcached-6.2.3.tgz
除了上面的其他字段外,每个需求项可以包含可选字段 tags 和 condition。所有的 chart 会默认加载。如果存在 tags 或者condition 字段,它们将被评估并用于控制它们应用的 chart 的加载。
Condition ——条件字段field 包含一个或多个 YAML 路径(用逗号分隔)。如果这个路径在上层 values 中已存在并解析为布尔值,chart 会基于布尔值启用或禁用 chart。只会使用列表中找到的第一个有效路径,如果路径为未找到则条件无效。
Tags ——tag字段是与 chart 关联的 YAML 格式的标签列表。在顶层 value 中,通过指定 tag 和布尔值,可以启用或禁用所有的带 tag 的 chart。
# parentchart/Chart.yaml
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
condition: subchart1.enabled, global.subchart1.enabled
tags:
- front-end
- subchart1
- name: subchart2
repository: http://localhost:10191
version: 0.1.0
condition: subchart2.enabled,global.subchart2.enabled
tags:
- back-end
- subchart2
# parentchart/values.yaml
subchart1:
enabled: true
tags:
front-end: false
back-end: true
在上面的例子中,所有带 front-end tag 的 chart 都会被禁用,但只要上层的 value 中 subchart1.enabled 路径被设置为 ‘true’,该条件会覆盖 front-end 标签且 subchart1 会被启用。
一旦 subchart2 使用了 back-end 标签并被设置为了 true,subchart2 就会被启用。也要注意尽管 subchart2 指定了一个条件字段, 但是上层 value 没有相应的路径和 value,因此这个条件不会生效。
–set 参数可以用来设置标签和条件值。
helm install --set tags.front-end=true --set subchart2.enabled=false
标签和条件的解析:
条件 (当设置在 value 中时)总是会覆盖标签 第一个 chart 条件路径存在时会忽略后面的路径。
标签被定义为 ‘如果任意的 chart 标签是 true,chart 就可以启用’。
标签和条件值必须被设置在顶层 value 中。
value 中的 tags:键必须是顶层键。
在某些情况下,允许子 chart 的值作为公共默认传递到父 chart 中是值得的。使用 exports格式的额外好处是它可是将来的工具可以自检用户可设置的值。
被导入的包含值的 key 可以在父 chart 的 dependencies 中的 import-values字段以 YAML 列表形式指定。列表中的每一项是从子 chart 中 exports 字段导入的 key。
导入 exports key 中未包含的值,使用 子-父格式。两种格式的示例如下所述。
使用导出格式:
如果子 chart 的 values.yaml 文件中在根节点包含了 exports 字段,它的内容可以通过指定的可以被直接导入到父 chart 的 value 中, 如下所示:
# parent's Chart.yaml file
dependencies:
- name: subchart
repository: http://localhost:10191
version: 0.1.0
import-values:
- data
# child's values.yaml file
exports:
data:
myint: 99
只要我们再导入列表中指定了键 data,Helm 就会在子 chart 的 exports 字段查找 data 键并导入它的内容。
最终的父级 value 会包含我们的导出字段:
# parent's values
myint: 99
【注意】父级键 data 没有包含在父级最终的 value 中,如果想指定这个父级键,要使用’子-父’ 格式。
下面示例中的import-values 指示 Helm 去拿到能再 child:路径中找到的任何值,并拷贝到 parent:的指定路径。
# parent's Chart.yaml file
dependencies:
- name: subchart1
repository: http://localhost:10191
version: 0.1.0
...
import-values:
- child: default.data
parent: myimports
上面的例子中,在 subchart1 里面找到的 default.data 的值会被导入到父 chart 的 myimports 键中,细节如下:
# parent's values.yaml file
myimports:
myint: 0
mybool: false
mystring: "helm rocks!"
# subchart1's values.yaml file
default:
data:
myint: 999
mybool: true
父 chart 的结果值将会是这样:
# parent's final values
myimports:
myint: 999
mybool: true
mystring: "helm rocks!"
Helm Chart 模板是按照 Go 模板语言书写, 增加了 50 个左右的附加模板函数 来自 Sprig 库 和一些其他 指定的函数。
所有模板文件存储在 chart 的 templates/ 文件夹。
当 Helm 渲染 chart 时,它会通过模板引擎遍历目录中的每个文件。
模板的 Value 通过两种方式提供:
apiVersion: v1
kind: ReplicationController
metadata:
name: deis-database
namespace: deis
labels:
app.kubernetes.io/managed-by: deis
spec:
replicas: 1
selector:
app.kubernetes.io/name: deis-database`在这里插入代码片`
template:
metadata:
labels:
app.kubernetes.io/name: deis-database
spec:
serviceAccount: deis-database
containers:
- name: deis-database
image: {{ .Values.imageRegistry }}/postgres:{{ .Values.dockerTag }}
imagePullPolicy: {{ .Values.pullPolicy }}
ports:
- containerPort: 5432
env:
- name: DATABASE_STORAGE
value: {{ default "minio" .Values.storage }}
上面的例子,松散地基于
https://github.com/deis/charts
是一个 Kubernetes 副本控制器的模板。可以使用下面四种模板值(一般被定义在 values.yaml 文件):
Values 通过模板中.Values 对象可访问的 values.yaml 文件(或者通过 --set 参数)提供,但可以模板中访问其他预定义的数据片段。
以下值是预定义的,对每个模板都有效,并且可以被覆盖。和所有值一样,名称 区分大小写。
values 文件被定义为 YAML 格式。chart 会包含一个默认的 values.yaml 文件。Helm 安装命令允许用户使用附加的 YAML values 覆盖这个 values:
helm install --generate-name --values=myvals.yaml wordpress
Helm 自带一个强大的搜索命令,可以用来从两种来源中进行搜索:
helm search hub 从 Artifact Hub https://artifacthub.io/ 中查找并列出 helm charts。Artifact Hub 中存放了大量不同的仓库。
helm search repo 从你添加(使用 helm repo add)到本地 helm 客户端中的仓库中进行查找。该命令基于本地数据进行搜索,无需连接互联网。
# 添加bitnami仓库源
helm repo add bitnami https://charts.bitnami.com/bitnami
# 从bitnami源查找所有chart包,不指定具体源的话,会查找本地添加的所有源地址的所有chart包
helm search repo bitnami
helm install mysql bitnami/mysql
helm list
# 先删除
helm uninstall mysql
# 拉包到本地
helm pull bitnami/mysql
# 不解压直接安装
helm install mysql ./mysql-9.3.1.tgz
helm list
# 拉包到本地
helm pull bitnami/mysql
# 解压安装
tar -xf mysql-9.3.1.tgz
# 开始安装
helm install mysql ./mysql \
--namespace=mysql \
--create-namespace \
--set image.registry=myharbor.com \
--set image.repository=bigdata/mysql \
--set image.tag=8.0.30 \
--set primary.service.type=NodePort \
--set service.nodePorts.mysql=30306
# 查看在运行的Release
helm list
# 卸载
helm uninstall mysql -n mysql
Helm 提供了以下类型转换函数:
atoi: 字符串转换成整型。
float64: 转换成 float64。
int: 按系统整型宽度转换成 int。
int64: 转换成 int64。
toDecimal: 将 unix 八进制转换成 int64。
toString: 转换成字符串。
toStrings: 将列表、切片或数组转换成字符串列表。
toJson (mustToJson): 将列表、切片、数组、字典或对象转换成 JSON。
toPrettyJson (mustToPrettyJson): 将列表、切片、数组、字典或对象转换成格式化 JSON。
toRawJson (mustToRawJson): 将列表、切片、数组、字典或对象转换成 HTML 字符未转义的 JSON。
Helm 提供了几个网络函数:
运算符
if/else 用法
调试模板可能很棘手,因为渲染后的模板发送给了 Kubernetes API server,可能会以格式化以外的原因拒绝 YAML 文件。以下命令有助于调试:
当你的 YAML 文件解析失败,但你想知道生成了什么,检索 YAML 一个简单的方式是注释掉模板中有问题的部分, 然后重新运行 helm install --dry-run --debug:
apiVersion: v2
# some: problem section
# {{ .Values.foo | quote }}
以上内容会被渲染同时返回完整的注释:
apiVersion: v2
# some: problem section
# "bar"