Kubernetes YAML 编写技巧和坑
Kubernetes 资源定义重度依赖 YAML 文件,本文会讲解一些 YAML 编写的技巧和坑!
- 原文地址:https://itnext.io/kubernetes-yaml-tips-and-tricks-904a2c0b2b81
不要用 Tab
缩进,对 YAML 很重要,不要用 Tab 来缩进,用两个空格、四个空格都是 OK 的。
YAML 官方在 FAQ 中说明过为啥不要用缩进:
由于不同的编辑器和工具对制表符(Tabs)的处理方式不同,制表符已被禁用。而且由于缩进对于正确解读YAML至关重要,这个问题极其棘手,甚至都不值得尝试。实际上,Python的吉多·范罗苏姆(Guido van Rossum)已经承认,在Python源代码中允许使用制表符给许多人带来了麻烦,如果他重新设计Python,他会禁止使用制表符。
坑
YAML 中最重要的结构是 Map 和 List,Map 是一堆键值对,而且可以嵌套,对应 JSON 的话示例如下:
另一个重要结构是列表,列表的每一项前面有个短横线:
任何列表或映射的值都可以是字符串、数字、布尔值、null 或其他 Map 或 List。
在大多数情况下,字符串不需要引号。但有时,如果你错过了他们……💣💥
挪威问题
认情况下,单词 “yes” 和 “no” 将转换为布尔值。
注意哦,不止是 false 会当做 bool 值,no
、off
都会被转换为 bool 值。这可能会跟你的原始期望不符,小心哦!(加上双引号可以解决)
数字转换
有些版本号,你原本是当做字符串的,如果没有加双引号,也可能会有问题,比如:
还有日期,可能会被自动转换为时间戳,比如:
键关键字
虽然 JSON 中的键始终是字符串,但在 YAML 中,它们可以是任何值,包括布尔值。
将 on
作为键是一个糟糕的主意。
其他有用的功能
1、您可以使用 ---
分隔文档
2、引用机制,避免重复编写内容
上例中,matchLabels 是一个 Map,里边有一个 run 的字段,matchLabels 右侧加了一个 &pod-label
,之后就可以在其他地方使用 *pod-label
引用。
当然,也可以引用一大段,比如:
user: &user
name: John
address:
street: 123 Main St
city: Anytown
admin:
<<: *user
role: admin
调试工具
- 像 http://www.yamllint.com/ 这样的在线 YAML linter
- 像 https://yamllint.readthedocs.io/en/stable/ 这样的 CLI
- 如果您使用 Visual Studio Code,请从 Red Hat 安装 YAML 扩展以实现自动完成 https://marketplace.visualstudio.com/items?itemName=redhat.vscode-yaml
另外,在用 JSON 时经常会用到一个工具叫 jq
,在 YAML 中也可以使用 yq
工具,比如上面的 YAML 文件可以使用 yq
转换为 JSON 做测试:
ulric@192 trash % cat a.yaml
user: &user
name: John
address:
street: 123 Main St
city: Anytown
admin:
<<: *user
role: admin%
ulric@192 trash % yq --tojson a.yaml
Flag --tojson has been deprecated, please use -o=json instead
{
"user": {
"name": "John",
"address": {
"street": "123 Main St",
"city": "Anytown"
}
},
"admin": {
"name": "John",
"address": {
"street": "123 Main St",
"city": "Anytown"
},
"role": "admin"
}
}
其他 yq
的用法这里就不赘述了。下次见!
在监控领域创业四年了,如果您想索要监控/可观测性白皮书资料或申请产品演示,都可联系我们(免费哒)👇