Helm 常用命令
命令 |
描述 |
create |
创建一个 chart 并指定名字 |
dependency |
管理 chart 依赖 |
get |
下载一个 release。可用子命令:all、hooks、manifest、notes、values |
history |
获取 release 历史 |
install |
安装一个 chart |
list |
列出 release |
package |
将 chart 目录打包到 chart 存档文件中 |
pull |
从远程仓库中下载 chart 并解压到本地 helm pull stable/mysql –untar |
repo |
添加,列出,移除,更新和索引 chart 仓库。可用子命令:add、index、list、remove、update |
rollback |
从之前版本回滚 |
search |
根据关键字搜索 chart。可用子命令:hub、repo |
show |
查看 chart 详细信息。可用子命令:all、chart、readme、values |
status |
显示已命名版本的状态 |
template |
本地呈现模板 |
uninstall |
卸载一个 release |
upgrade |
更新一个 release |
version |
查看 helm 客户端版本 |
配置国内 Chart 仓库
1 添加存储库
1 2 3
| helm repo add stable http://mirror.azure.cn/kubernetes/charts helm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts helm repo update
|
2 查看配置的存储库
1 2
| helm repo list helm search repo stable
|
3 删除存储库
Helm 基本使用
主要介绍几个命令:
chart install
chart status
chart upgrade
chart history
chart rollback
chart uninstall
1 使用 chart 部署一个应用
1.1 查找 chart
1 2
| helm search repo helm search repo bitnami/nginx
|
1.2 查看 chart 信息
1
| helm show chart bitnami/nginx -n $namespace
|
1.3 安装包
1
| helm install my-release bitnami/nginx -n $namespace
|
1.4 查看发布状态
1
| helm status my-release -n $namespace
|
1.5 更新配置
更新过程中有两种方法可以传递配置数据:
- –values(或-f):指定带有覆盖的 YAML 文件。这可以多次指定,最右边的文件优先
- –set:在命令行上指定替代。如果两者都用,–set 优先级高
1
| helm upgrade my-release bitnami/nginx -n $namespace --set image.tag="1.23.0-debian-11-r0"
|
1.6 查看历史版本
1
| helm history my-release -n $namespace
|
1.7 回滚
1
| helm rollback my-release 1 -n $namespace
|
1.8 删除
1
| helm uninstall my-release -n $namespace
|
构建一个 Chart
先给学员自动生成目录讲解,然后再手动给学员创建目录和各个文件。
1 2 3 4 5 6 7 8 9 10 11 12 13
| helm create mychart
tree mychart/ mychart/ ├── charts ├── Chart.yaml ├── templates │ ├── deployment.yaml │ ├── _helpers.tpl │ ├── ingress.yaml │ ├── NOTES.txt │ └── service.yaml └── values.yaml
|
- Chart.yaml:用于描述这个 Chart 的基本信息,包括名字、描述信息以及版本等。
- values.yaml :用于存储 templates 目录中模板文件中用到变量的值。
- Templates: 目录里面存放所有 yaml 模板文件。
- charts:目录里存放这个 chart 依赖的所有子 chart。
- NOTES.txt :用于介绍 Chart 帮助信息, helm install 部署后展示给用户。例如:如何使用这个 Chart、列出缺省的设置等。
- _helpers.tpl:放置模板助手的地方,可以在整个 chart 中重复使用
创建 Chart 后,接下来就是将其部署:
1
| helm install web mychart/
|
也可以打包推送的 charts 仓库共享别人使用。
1 2
| helm package mychart/ mychart-0.1.0.tgz
|
1 内置对象
常用的内置对象:
变量名 |
描述 |
Release.Name |
release 名称 |
Release.Time |
release 的时间 |
Release.Namespace |
release 的 namespace(如果清单未覆盖) |
Release.Service |
release 服务的名称 |
Release.Revision |
此 release 的修订版本号,从 1 开始累加 |
Release.IsUpgrade |
如果当前操作是升级或回滚,则将其设置为 true。 |
Release.IsInstall |
如果当前操作是安装,则设置为 true。 |
常用语法
1 管道与函数
1
| - name: {{ .Values.name | default "nginx" }}
|
2 值转换字符串
可以不用管道符直接写到函数前面
1
| - name: {{ quote .Values.name }}
|
3 判断是 true 函数
1 2 3 4 5 6 7 8
| entryPoints: - {{ .Values.argo.web.https | ternary "https" "http" }}
argo: web: https: true
|
4 列表函数
toYaml: 获取列表
nindent 10: 缩进十个空格
1 2 3 4 5 6 7 8 9 10 11 12 13
| resources: {{- toYaml .Values.argo.resources | nindent 10 }}
argo: resources: limits: cpu: 4 memory: 8192Mi requests: cpu: 100m memory: 128Mi
|
5 流程控制
流程控制是为模板提供了一种能力,满足更复杂的数据逻辑处理。
Helm 模板语言提供以下流程控制语句:
if/else
条件块
with
指定范围
range
循环块
5.1 if
if/else
块是用于在模板中有条件地包含文本块的方法,条件块的基本结构如下:
1 2 3 4 5 6 7
| {{ if PIPELINE }} {{ else if OTHER PIPELINE }} {{ else }} {{ end }}
|
条件判断就是判断条件是否为真,如果值为以下几种情况则为 false:
除了上面的这些情况外,其他所有条件都为 真
。
例如,如果实例数(.Values.vault.replicaCount)大于 1,则值为 ha_enabled: true
1 2 3
| ha_enabled: {{ if gt (int .Values.vault.replicaCount) 1 }}"true"{{ else }}"false"{{ end }}
|
其中运算符 gt
是判断是否大于的操作,除此之外,还有 ne
、 lt
、 eq
、 and
、 or
等运算符。
通过模板引擎来渲染一下,会得到如下结果:
1 2 3 4
| helm install --dry-run web ../mychart/ ... ha_enabled: "true"
|
5.1.1 消除空行
可以看到渲染出来会有多余的空行,这是因为当模板引擎运行时,会将控制指令删除,所有之前占的位置也就空白了,需要使用{{- if ... }}
的方式消除此空行:
1 2 3 4
| ... ha_enabled: {{- if gt (int .Values.vault.replicaCount) 1 }}"true"{{ else }}"false"{{ end }}
|
如果使用{{-`需谨慎,因为`{{-`它删除了双方的换行符。
比如上面模板文件会渲染成:
## 6 with
> 控制变量作用域。
>
> 其语法和一个简单的 `if`语句比较类似:
1 2 3
| {{ with PIPELINE }} {{ end }}
|
`with`语句可以允许将当前范围 `.`设置为特定的对象,比如我们前面一直使用的 `.Values.label`,我们可以使用 `with`来将 `.`范围指向 `.Values.label`:
1 2 3 4 5 6
| ... {{- with .Values.label }} project: {{ .project }} app: {{ .app }} {{- end }}
|
上面增加了一个{{- with .Values.label }} xxx {{- end }}的一个块,这样的话就可以在当前的块里面直接引用
.project和
.app`了。
需要注意的在 with
声明的范围内,将无法从父范围访问到其他对象了,比如.Release.Name 是不生效的:
1 2 3 4 5
| {{- with .Values.label }} project: {{ .project }} app: {{ .app }} {{ .Release.Name }} {{- end }}
|
7 range
在 Helm 模板语言中,使用 range
关键字来进行循环操作。
循环内部我们使用的是一个 .
,这是因为当前的作用域就在当前循环内,这个 .
引用的当前读取的元素 :
7.1 每次传入单个值
1 2 3 4 5 6
| eventrouter: labels: - 1 - 2 - 3
|
7.1.1 循环打印该列表
1 2 3 4 5 6
| ... labels: {{- range .Values.eventrouter.labels }} app: {{ quote . }} {{- end }}
|
7.1.2 渲染结果
1 2 3 4
| labels: app: "1" app: "2" app: "3"
|
7.2 每次传入多个值
1 2 3 4 5
| eventrouter: labels: app: "tst" env: "tst"
|
7.2.1 循环打印该列表
1 2 3 4 5 6
| ... labels: {{- range $key, $value := .Values.eventrouter.labels }} {{ $key }}: {{ $value }} {{- end }}
|
7.2.2 会渲染成
1 2 3
| labels: app: tst env: tst
|
其他功能使用场景
1 判断是否开启组件
1.1 templates
1 2 3
| {{- if .Values.argo.enabled -}} ... {{- end }}
|
1.2 values
2 添加复杂内容变量
2.1 templates
1 2
| "kafkaBrokers": {{ .Values.eventrouter.kafkaBrokers }} "kafkaTopic": "{{ .Values.eventrouter.kafkaTopic }}"
|
2.2 values
1 2 3
| kafkaBrokers: |- ["10.122.23.156:9091","10.122.23.157:9091","10.122.23.158:9091"], kafkaTopic: "test-Topic"
|
2.3 渲染后
1 2 3 4 5
| { "sink": "kafka", "kafkaBrokers": ["10.122.23.156:9091","10.122.23.157:9091","10.122.23.158:9091"], "kafkaTopic": "test-Topic" }
|