Helm学习笔记
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 仓库
- 微软仓库 http://mirror.azure.cn/kubernetes/charts/ 这个仓库强烈推荐,基本上官网有的 chart 这里都有。)
- 阿里云仓库 https://kubernetes.oss-cn-hangzhou.aliyuncs.com/charts 不算全
- 官方仓库 https://artifacthub.io/ 国内访问很慢。
1 添加存储库
helm repo add stable http://mirror.azure.cn/kubernetes/chartshelm repo add aliyun https://kubernetes.oss-cn-hangzhou.aliyuncs.com/chartshelm repo update2 查看配置的存储库
helm repo listhelm search repo stable3 删除存储库
helm repo remove aliyunHelm 基本使用
主要介绍几个命令:
-
chart install
-
chart status
-
chart upgrade
-
chart history
-
chart rollback
-
chart uninstall
1 使用 chart 部署一个应用
1.1 查找 chart
helm search repohelm search repo bitnami/nginx1.2 查看 chart 信息
helm show chart bitnami/nginx -n $namespace1.3 安装包
helm install my-release bitnami/nginx -n $namespace1.4 查看发布状态
helm status my-release -n $namespace1.5 更新配置
更新过程中有两种方法可以传递配置数据:
- —values(或-f):指定带有覆盖的 YAML 文件。这可以多次指定,最右边的文件优先
- —set:在命令行上指定替代。如果两者都用,—set 优先级高
helm upgrade my-release bitnami/nginx -n $namespace --set image.tag="1.23.0-debian-11-r0"1.6 查看历史版本
helm history my-release -n $namespace1.7 回滚
helm rollback my-release 1 -n $namespace1.8 删除
helm uninstall my-release -n $namespace构建一个 Chart
先给学员自动生成目录讲解,然后再手动给学员创建目录和各个文件。
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 后,接下来就是将其部署:
helm install web mychart/也可以打包推送的 charts 仓库共享别人使用。
helm package mychart/mychart-0.1.0.tgz1 内置对象
常用的内置对象:
| 变量名 | 描述 |
|---|---|
| Release.Name | release 名称 |
| Release.Time | release 的时间 |
| Release.Namespace | release 的 namespace(如果清单未覆盖) |
| Release.Service | release 服务的名称 |
| Release.Revision | 此 release 的修订版本号,从 1 开始累加 |
| Release.IsUpgrade | 如果当前操作是升级或回滚,则将其设置为 true。 |
| Release.IsInstall | 如果当前操作是安装,则设置为 true。 |
常用语法
1 管道与函数
| 表示追加操作
default 表示如果 .Values.name 没有配置,他的值为 nginx
- name: {{ .Values.name | default "nginx" }}2 值转换字符串
可以不用管道符直接写到函数前面
- name: {{ quote .Values.name }}3 判断是 true 函数
# cat templates/vault-configmap.yaml entryPoints: - {{ .Values.argo.web.https | ternary "https" "http" }}
# cat values.yamlargo: web: https: true4 列表函数
toYaml: 获取列表
nindent 10: 缩进十个空格
# cat templates/vault-configmap.yaml resources: {{- toYaml .Values.argo.resources | nindent 10 }}
# cat values.yamlargo: resources: limits: cpu: 4 memory: 8192Mi requests: cpu: 100m memory: 128Mi5 流程控制
流程控制是为模板提供了一种能力,满足更复杂的数据逻辑处理。
Helm 模板语言提供以下流程控制语句:
if/else条件块with指定范围range循环块
5.1 if
if/else块是用于在模板中有条件地包含文本块的方法,条件块的基本结构如下:
{{ if PIPELINE }} # Do something{{ else if OTHER PIPELINE }} # Do something else{{ else }} # Default case{{ end }}条件判断就是判断条件是否为真,如果值为以下几种情况则为 false:
-
一个布尔类型的
假 -
一个数字
零 -
一个
空的字符串 -
一个
nil(空或null) -
一个空的集合(
map、slice、tuple、dict、array)
除了上面的这些情况外,其他所有条件都为 真。
例如,如果实例数(.Values.vault.replicaCount)大于 1,则值为 ha_enabled: true
# cat values.yamlvault: replicas: 2# cat templates/vault-configmap.yaml ha_enabled: {{ if gt (int .Values.vault.replicaCount) 1 }}"true"{{ else }}"false"{{ end }}其中运算符
gt是判断是否大于的操作,除此之外,还有ne、lt、eq、and、or等运算符。
通过模板引擎来渲染一下,会得到如下结果:
helm install --dry-run web ../mychart/... ha_enabled: "true"5.1.1 消除空行
可以看到渲染出来会有多余的空行,这是因为当模板引擎运行时,会将控制指令删除,所有之前占的位置也就空白了,需要使用
{{- if ... }}的方式消除此空行:
# cat templates/deploymemt.yaml... ha_enabled: {{- if gt (int .Values.vault.replicaCount) 1 }}"true"{{ else }}"false"{{ end }}如果使用{{-需谨慎,因为{{-它删除了双方的换行符。
比如上面模板文件会渲染成:
ha_enabled: "true"6 with
控制变量作用域。
其语法和一个简单的
if语句比较类似:
{{ with PIPELINE }} # restricted scope{{ end }}with语句可以允许将当前范围 .设置为特定的对象,比如我们前面一直使用的 .Values.label,我们可以使用 with来将 .范围指向 .Values.label:
# cat templates/deploymemt.yaml... {{- with .Values.label }} project: {{ .project }} app: {{ .app }} {{- end }}上面增加了一个{{- with .Values.label }} xxx {{- end }}的一个块,这样的话就可以在当前的块里面直接引用 .project和 .app了。
需要注意的在 with声明的范围内,将无法从父范围访问到其他对象了,比如.Release.Name 是不生效的:
{{- with .Values.label }} project: {{ .project }} app: {{ .app }} {{ .Release.Name }} {{- end }}7 range
在 Helm 模板语言中,使用
range关键字来进行循环操作。
循环内部我们使用的是一个 .,这是因为当前的作用域就在当前循环内,这个 .引用的当前读取的元素 :
7.1 每次传入单个值
# cat values.yamleventrouter: labels: - 1 - 2 - 37.1.1 循环打印该列表
# cat templates/event-serviceaccount... labels: {{- range .Values.eventrouter.labels }} app: {{ quote . }} {{- end }}7.1.2 渲染结果
labels: app: "1" app: "2" app: "3"7.2 每次传入多个值
# cat values.yamleventrouter: labels: app: "tst" env: "tst"7.2.1 循环打印该列表
# cat templates/event-serviceaccount... labels: {{- range $key, $value := .Values.eventrouter.labels }} {{ $key }}: {{ $value }} {{- end }}7.2.2 会渲染成
labels: app: tst env: tst其他功能使用场景
1 判断是否开启组件
1.1 templates
{{- if .Values.argo.enabled -}}...{{- end }}1.2 values
argo: enabled: true2 添加复杂内容变量
2.1 templates
"kafkaBrokers": {{ .Values.eventrouter.kafkaBrokers }} "kafkaTopic": "{{ .Values.eventrouter.kafkaTopic }}"2.2 values
kafkaBrokers: |- # |表示纯文本, -表示不换行 ["10.1.23.156:9091","10.1.23.157:9091","10.1.23.158:9091"], kafkaTopic: "test-Topic" #直接获取字段2.3 渲染后
{ "sink": "kafka", "kafkaBrokers": ["10.1.23.156:9091","10.1.23.157:9091","10.1.23.158:9091"], "kafkaTopic": "test-Topic" }文章分享
如果这篇文章对你有帮助,欢迎分享给更多人!