侧边栏壁纸
博主头像
孔子说JAVA博主等级

成功只是一只沦落在鸡窝里的鹰,成功永远属于自信且有毅力的人!

  • 累计撰写 285 篇文章
  • 累计创建 125 个标签
  • 累计收到 4 条评论

目 录CONTENT

文章目录

Helm3入门教程-25:调试模板及最佳实践

孔子说JAVA
2022-05-05 / 0 评论 / 0 点赞 / 208 阅读 / 3,229 字 / 正在检测是否收录...

Helm3入门教程全系列,26小时轻松掌握Helm

1、Helm3调试模板

调试模板可能很棘手,因为模板是在Tiller服务器上渲染的,而不是在Helm客户端上。然后将渲染后的模板发送给了 Kubernetes API 服务器,该服务器可能会因为格式以外的原因拒绝YAML文件。

以下命令有助于你的调试:

  • helm lint 是验证chart是否遵循最佳实践的首选工具
  • helm install --dry-run --debughelm template --debug:我们已经看过这个技巧了, 这是让服务器渲染模板,然后返回生成的清单文件的好方法。
  • helm get manifest: 这是查看服务器上安装了哪些模板的好方法。

当你的YAML文件解析失败,但你想知道生成了什么,检索YAML一个简单的方式是注释掉模板中有问题的部分,然后重新运行 helm install --dry-run --debug

apiVersion: v2
# some: problem section
# {{ .Values.foo | quote }}

以上内容会被完整渲染同时返回注释:

apiVersion: v2
# some: problem section
#  "bar"

这样就提供了一种快速查看生成内容的方法,而不会被YAML解析错误阻塞。

2、Helm chart最佳实践

2.1 基本规约

  1. Chart命名:必须是小写字母和数字,单词之间分割符用 -,chart名称中不能用大写字母也不能用下划线。点( . ) 也不行。
  2. 版本规范: 版本号遵循SemVer2的规范
  3. Yaml缩进: 使用两个空格缩进,不能用tab

2.2 values.yaml编写的最佳实践

命名规范: 首字母小写的驼峰式命名

  • 注意所有的Helm内置变量以大写字母开头,以便与用户定义的value进行区分,如:.Release.Name

反例:

Chicken: true  # initial caps may conflict with built-ins
chicken-noodle-soup: true # do not use hyphens in the name

所有Helm内置的变量都是大写开头(如.Chart.Name, .Capabilities.KubeVersion),这样可以和用户自定义的变量区分开。

变量平铺 Or 层叠

Yaml格式灵活,里面的变量既可以平铺也可以层叠编写,通常情况下平铺更好,因为简单。

层叠:

server:
  name: nginx
  port: 80

平铺:

serverName: nginx
serverPort: 80

使用字典而不是数组

由于values.yaml的变量是可以支持被命令行的参数 --set--set-string 改写,而参数的写法有限。
所以values.yaml变量的写法尽可能使用map,而不是数组

反例:

servers:
  - name: foo
    port: 80
  - name: bar
    port: 81

如何用 --set改写端口, Helm2.4之前不支持, 2.5之后可以用 --set servers[0].port=80。 但表意不明确,万一values里的顺序改变了,就糟糕了。

正例:

servers:
  foo:
    port: 80
  bar:
    port: 81

改foo的端口 --set servers.foo.port=80

类型清醒

Yaml的类型转化的规则有时是反直觉的。比如foo: false和foo: "false"不一样。 大数 foo:1234567在某些场景下会变成科学计数法表达。

最简单,清醒的做法:所有变量都用 ""引号表达成字符串。

在需要使用数字时,用 {{ int $value }} 进行变量转换

2.3 模板

templates的结构化规范:

  1. 所有的yaml模板必须有 .yaml 后缀, 非格式化内容的模板使用 .tpl 后缀
  2. 模板文件的命名使用小写,使用 - 符号分割单词 (my-example-configmap.yaml),不用驼峰法。
  3. 每种资源的定义必须单独的模板文件
  4. 模板文件的名称应该反映名称中的资源类型。比如:foo-pod.yamlbar-svc.yaml
  5. 模板应该使用两个空格缩进(永远不要用tab)。
  6. 模板命令的大括号前后应该使用空格
  7. 模板注释
{{- /*
mychart.shortname provides a 6 char truncated version of the release name.
*/}}
  1. YAML注释
# This is a comment
type: sprocket
  1. 当相关的一些变量是可选的,为了安全起见,使用层叠方式,并在每个层级中都对变量进行校验。
{{ if .Values.server }}
  {{ default "none" .Values.server.name }}
{{ end }}
  1. helm lint是验证chart是否遵循最佳实践的首选工具

当你想测试模板渲染但又不想安装任何内容时,可以使用 helm install --debug --dry-run goodly-guppy ./mychart

命名模板

{{ define }}创建出命名模板是全局可见的,为了避免名称冲突,命名中应该带上命名空间。

正例

{{- define "nginx.fullname" }}
{{/* ... */}}
{{ end -}}

反例

{{- define "fullname" -}}
{{/* ... */}}
{{ end -}}

推荐使用helm create 创建新的chart,它会自动循序最佳实践

模板命令

{{ }}表示模板命令。在 {{ 后和 }} 前需要用一个空格隔开

正例

{{ .foo }}
{{ print "foo" }}
{{- print "bar" -}}

反例

{{.foo}}
{{print "foo"}}
{{-print "bar"-}}

2.4 模板函数和流水线

模板函数遵循的语法是 functionName arg1 arg2...

管道符

使用管道符(|)将参数“”发送给函数:.Values.favorite.drink | quote,这里倒置了命令。

模板函数列表

  • trim:移除字符串两边的空格
trim "   hello    "                             #hello
  • trimAll:从字符串中移除给定的字符
trimAll "$" "$5.00"                    #5.00
  • trimPrefix:从字符串中移除前缀
trimPrefix "-" "-hello"          #hello
  • trimSuffix:从字符串中移除后缀

  • trimSuffix “-” “hello-” #hello

  • lower:将整个字符串转换成小写

  • upper:将整个字符串转换成大写

lower "HELLO"                  #hello
upper "hello"                  #HELLO
  • title:首字母转换成大写
  • untitle:移除首字母大写
title "hello world"             #Hello World
untitle "Hello World"            #hello world
  • indent:以指定长度缩进给定字符串所在行

2.5 注释

每个变量都应该注释。
注释必须以变量名开头

正例

# serverHost is the host name for the webserver
serverHost: example
# serverPort is the HTTP listener port for the webserver
serverPort: 9191

变量名开头的注释有利于在grep时,可以快速抓取变量及其文档说明

Yaml注释: 常用注释,而且在 helm install --debug 调试时可见

# This is a comment
type: sprocket

模板注释:多行注释,常用于对模块、方法的说明

{{- /*
This is a comment.
*/}}
type: frobnitz
0

评论区