基础命令
helm repo add bitnami https://charts.bitnami.com/bitnami
# 查找chart
helm search repo nginx
# 更新repo
helm repo update
# 安装chart
helm install bitnami/nginx --generate-name
# 查看chart信息
helm show chart bitnami/mysql
# 查看完整chart信息
helm show all bitnami/mysql
# 列出所有可能被部署的版本
helm list 或 helm ls
# 卸载一个版本 加上 --keep-history选项 保留版本历史
helm uninstall
# 下载一个chart,不安装
helm pull chartrepo/chartname
# 下载依赖的chart,文件会下载到charts目录下
helm dependency update
# 创建一个chart
helm create mychart
# 打包chart
helm package mychart
# 查找chart的格式或信息问题
helm lint mychart
# 若只是想测试渲染而不安装任何实际应用
helm install --debug --dry-run yapi-serval ./mychart
chart
# v2/v1
apiVersion: chart API 版本 (必需)
appVersion: 包含的应用版本(可选)。不需要是语义化,建议使用引号,自定项目版本
name: chart名称 (必需)
version: 语义化2 版本(必需)
kubeVersion: 兼容Kubernetes版本的语义化版本(可选)(在安装时验证版本,k8s版本不匹配会失败)
description: 一句话对这个项目的描述(可选)
# application(默认) / library
type: chart类型 (可选)
icon: 用做icon的SVG或PNG图片URL (可选)
deprecated: 不被推荐的chart (可选,布尔值)
annotations:
example: 按名称输入的批注列表 (可选).
keywords:
- 关于项目的一组关键字(可选)
home: 项目home页面的URL (可选)
sources:
- 项目源码的URL列表(可选)
dependencies: # chart 必要条件列表 (可选)
- name: chart名称 (nginx)
version: chart版本 ("1.2.3")
# 注意你必须使用helm repo add在本地添加仓库
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 (每个维护者可选)
- kubeVersion
>= 1.13.0 < 1.15.0 (或者使用 || 符号连接) >= 1.13.0 < 1.14.0 || >= 1.14.1 < 1.15.0
除了版本约束外,使用运算符 = != > < >= <= 支持以下速记符号:
闭合间隔的连字符范围, 1.1 - 2.3.4 等价于 >= 1.1 <= 2.3.4
通配符 x, X 和 *, 1.2.x 等价于 >= 1.2.0 < 1.3.0
波浪符号~范围 (允许改变补丁版本), ~1.2.3 等价于 >= 1.2.3 < 1.3.0
插入符号^范围 (允许改变次版本), ^1.2.3 等价于 >= 1.2.3 < 2.0.0
chart hook
Helm 提供了一个 hook 机制允许chart开发者在发布生命周期的某些点进行干预。
- 安装时在加载其他chart之前加载配置映射或密钥
- 安装新chart之前执行备份数据库的任务,然后在升级之后执行第二个任务用于存储数据
- 在删除发布之前执行一个任务以便在删除服务之前退出滚动
注释 | 描述 |
---|---|
pre-install | 在模板渲染之后,Kubernetes资源创建之前执行 |
post-install | 在所有资源加载到Kubernetes之后执行 |
pre-delete | 在Kubernetes删除之前,执行删除请求 |
post-delete | 在所有的版本资源删除之后执行删除请求 |
pre-upgrade | 在模板渲染之后,资源更新之前执行一个升级请求 |
post-upgrade | 所有资源升级之后执行一个升级请求 |
pre-rollback | 在模板渲染之后,资源回滚之前,执行一个回滚请求 |
post-rollback | 在所有资源被修改之后执行一个回滚请求 |
test | 调用Helm test子命令时执行 |
执行步骤
1. 用户返回 helm install foo
2. Helm库调用安装API
3. 在 crds/目录中的CRD会被安装
4. 在一些验证之后,库会渲染foo模板
5. 库准备执行pre-install钩子(将hook资源加载到Kubernetes中)
6. 库按照权重对钩子排序(默认将权重指定为0),然后在资源种类排序,最后按名称正序排列。
7. 库先加载最小权重的钩子(从负到正)
8. 库会等到钩子是 “Ready”状态(CRD除外)
9. 库将生成的资源加载到Kubernetes中。注意如果设置了--wait参数,库会等所有资源是ready状态, 且所有资源准备就绪后才会执行post-install钩子。
10. 库执行post-install钩子(加载钩子资源)。
11. 库会等到钩子是”Ready”状态
12. 库会返回发布对象(和其他数据)给客户端
13 客户端退出
示例
apiVersion: batch/v1
kind: Job
metadata:
name: ""
labels:
app.kubernetes.io/managed-by:
app.kubernetes.io/instance:
app.kubernetes.io/version:
helm.sh/chart: "-"
annotations:
# This is what defines this resource as a hook. Without this line, the
# job is considered part of the release.
"helm.sh/hook": post-install
"helm.sh/hook-weight": "-5"
"helm.sh/hook-delete-policy": hook-succeeded
spec:
template:
metadata:
name: ""
labels:
app.kubernetes.io/managed-by:
app.kubernetes.io/instance:
helm.sh/chart: "-"
spec:
restartPolicy: Never
containers:
- name: post-install-job
image: "alpine:3.3"
command: ["/bin/sleep",""]
一个资源可以实现多个钩子
annotations:
"helm.sh/hook": post-install,post-upgrade
删除策略
注释 | 描述 |
---|---|
before-hook-creation | 新钩子启动前删除之前的资源 (默认) |
hook-succeeded | 钩子成功执行之后删除资源 |
hook-failed | 如果钩子执行失败,删除资源 |
template
默认资源
对象可以通过模板引擎传递到模板中。 当然你的代码也可以传递对象。 对象可以是非常简单的:仅有一个值。或者可以包含其他对象或方法。比如,Release对象可以包含其他对象(比如:Release.Name)和Files对象有一组方法。 在上一部分中,我们用在模板中插入版本名称。Release是你可以在模板中访问的顶层对象之一。
Release: Release对象描述了版本发布本身。包含了以下对象:
Release.Name: release名称
Release.Namespace: 版本中包含的命名空间(如果manifest没有覆盖的话)
Release.IsUpgrade: 如果当前操作是升级或回滚的话,该值将被设置为true
Release.IsInstall: 如果当前操作是安装的话,该值将被设置为true
Release.Revision: 此次修订的版本号。安装时是1,每次升级或回滚都会自增
Release.Service: 该service用来渲染当前模板。Helm里始终Helm
Values: Values对象是从values.yaml文件和用户提供的文件传进模板的。默认为空
Chart: Chart.yaml文件内容。 Chart.yaml里的所有数据在这里都可以可访问的。比如 - 会打印出 mychart-0.1.0
Files: 在chart中提供访问所有的非特殊文件的对象。你不能使用它访问Template对象,只能访问其他文件。 请查看这个 文件访问部分了解更多信息
Files.Get 通过文件名获取文件的方法。 (.Files.Getconfig.ini)
Files.GetBytes 用字节数组代替字符串获取文件内容的方法。 对图片之类的文件很有用
Files.Glob 用给定的shell glob模式匹配文件名返回文件列表的方法
Files.Lines 逐行读取文件内容的方法。迭代文件中每一行时很有用
Files.AsSecrets 使用Base 64编码字符串返回文件体的方法
Files.AsConfig 使用YAML格式返回文件体的方法
Capabilities: 提供关于Kubernetes集群支持功能的信息
Capabilities.APIVersions 是一个版本列表
Capabilities.APIVersions.Has $version 说明集群中的版本 (比如,batch/v1) 或是资源 (比如, apps/v1/Deployment) 是否可用
Capabilities.KubeVersion 和Capabilities.KubeVersion.Version 是Kubernetes的版本号
Capabilities.KubeVersion.Major Kubernetes的主版本
Capabilities.KubeVersion.Minor Kubernetes的次版本
Capabilities.HelmVersion 包含Helm版本详细信息的对象,和 helm version 的输出一致
Capabilities.HelmVersion.Version 是当前Helm语义格式的版本
Capabilities.HelmVersion.GitCommit Helm的git sha1值
Capabilities.HelmVersion.GitTreeState 是Helm git树的状态
Capabilities.HelmVersion.GoVersion 是使用的Go编译器版本
Template: 包含当前被执行的当前模板信息
Template.Name: 当前模板的命名空间文件路径 (e.g. mychart/templates/mytemplate.yaml)
Template.BasePath: 当前chart模板目录的路径 (e.g. mychart/templates)
传值可以被覆盖
- hart中的values.yaml文件
- 如果是子chart,就是父chart中的values.yaml文件
- 使用-f参数(helm install -f myvals.yaml ./mychart)传递到 helm install 或 helm upgrade的values文件
- 使用–set (比如helm install –set foo=bar ./mychart)传递的单个参数
默认使用values.yaml,可以被父chart的values.yaml覆盖,继而被用户提供values文件覆盖, 最后会被–set参数覆盖,优先级为values.yaml最低,–set参数最高