云原生时代的 YAML 教程

YAML 是 "YAML Ain't a Markup Language" 的缩写,是一种可读性高的数据序列化语言,常用于配置管理中。在云原生时代,很多流行的开源项目、云平台等都是 YAML 格式表达的,比如 Kubernetes 中...

YAML 是 "YAML Ain't a Markup Language" 的缩写,是一种可读性高的数据序列化语言,常用于配置管理中。在云原生时代,很多流行的开源项目、云平台等都是 YAML 格式表达的,比如 Kubernetes 中的资源对象、Ansible/Terraform 的配置文件以及流行 CI/CD 平台的配置文件等等。

基本格式

首先需要理解的是 YAML 主要是面向数据而非表达能力,所以 YAML 本身的语法非常简洁,其最基本的语法规则为:

  •     大小写敏感
  •     使用空格缩进表示层级关系(不可以使用 TAB)
  •     以 # 表示注释,行内注释 # 前面必须要有空格
  •     基本数据类型包括 Null、布尔、字符串、整数、浮点数、日期和时间等
  •     基本数据结构包括字典、列表以及纯量(即单个基本类型的值),其他复杂数据结构都是通过这些基本数据结构组合而成
  •     单个文件包括多个 YAML 数据结构时使用 --- 分割

字典

字典有两种表达方式,两种方式是对等的,一般方式二用的多一些:

attachments-2021-03-tB7tKZim6055d656c42b8,png

列表

列表也有两种表达方式,一般方式一用的多一些:

attachments-2021-03-Nv506p2R6057003bf318d,png

字符串

YAML 中默认字符串不需要添加任何引号,但在容易导致混淆的地方则是需要添加引号的。比如

  • 字符串格式的数字必须加上引号,比如 "20"
  • 字符串格式的布尔值必须加上引号,比如 "true"

YAML 也支持多行字符串,可以使用 >(折叠换行) 或者 |(保留换行符):

比如

attachments-2021-03-7qacgciY6057005ce1580,png

片段和引用(Snippet)

YAML 也支持片段和引用,这些构造复杂数据类型时非常有用。你可以用 & 来定义一个片段,随后使用 * 来引用这个片段。

attachments-2021-03-ZjPRwKVK6057008aa2fa0,jpg

Kubernetes 资源对象

Kubernetes 资源对象格式可以参考其官方 API 文档 https://kubernetes.io/docs/reference/kubernetes-api/。需要注意的是,每个资源对象在定义的时候必须包含以下的字段:

  • apiVersion - 创建该对象所使用的 Kubernetes API 的版本
  • kind - 想要创建的对象的类别
  • metadata - 帮助唯一性标识对象的一些数据,包括一个 name 字符串、UID 和可选的 namespace

通常,你也需要提供对象的 spec 字段。对象 spec 的详细格式对每个 Kubernetes 对象来说是不同的,包含了特定于该对象的嵌套字段。比如,一个 Nginx Pod 的定义如下所示:

attachments-2021-03-5sAs4TwJ605700a123ede,png

辅助工具

最后再推荐几个常用的 YAML 工具,包括 yamllint、yq、以及 kube-score。

yamllit

yamllint 是一个用来检查 YAML 语法的工具,你可以通过 pip install --user yamllint 命令来安装该工具。

比如,对上面的 Nginx Pod 运行 yamllint 会得到如下的警告和错误:

attachments-2021-03-D6Jb7rKk605700b89014a,png

根据这两个警告和错误,可以把其修改成如下的格式:

attachments-2021-03-7OxE4LQC605700d0ce492,png

yq

yq 是一个 YAML 数据处理以及高亮显示的工具,你可以通过 brew install yq 来安装该工具(类似于 JSON 数据处理的 jq 工具)。

比如,你可以高亮显示上面的 Nginx Pod YAML:

attachments-2021-03-Pd9MjHaa605700ea9b0e2,jpg

或者提取上述 YAML 的部分内容:

attachments-2021-03-LxmL0mDl605700ff8d47b,png

或者修改 YAML 中 metadata.name 字段:

attachments-2021-03-SIBFzrtd6057011518beb,png

kube-score

kube-score 是一个 Kubernetes YAML 静态分析工具,用来检查 Kubernetes 资源对象的配置是否遵循了最佳实践。你可以通过 kubectl krew install score 来安装该工具。

比如,还是上述的 Nginx Pod,运行 kubectl score nginx.yaml 可以得到如下的错误:

attachments-2021-03-XmeemhPV6057013021404,png

根据这些错误,可以发现容器资源、镜像标签、网络策略以及容器安全上下文等四个配置没有遵循最佳实践。

参考资料

更多 YAML 的使用细节可以参考如下的资料:

  • YAML 语言规范 https://yaml.org/spec/1.2/spec.html
  • Kubernetes 资源对象 https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/





  • 发表于 2021-03-20 19:00
  • 阅读 ( 37 )

你可能感兴趣的文章

相关问题

0 条评论

请先 登录 后评论
shitian
shitian

662 篇文章

作家榜 »

  1. shitian 662 文章
  2. 石天 437 文章
  3. 每天惠23 33 文章
  4. 小A 29 文章