云原生时代的 YAML 教程 • Feiskyhttps://feisky.xyz/posts/2021-03-03-yaml/

目录

基本格式

字典

列表

字符串

片段和引用(Snippet)

Kubernetes 资源对象

辅助工具

yamllit

yq

kube-score

参考资料

Related Articles


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

基本格式

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

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

字典

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

# 方式一(行内表达法)
foo: { thing1: huey, thing2: louie, thing3: dewey }# 方式二
foo:thing1: hueything2: louiething3: dewey

列表

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

# 方式一
files:
- foo.txt
- bar.txt
- baz.txt# 方式二(行内表达法)
lists: [foo.txt, bar.txt, baz.txt]

字符串

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

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

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

比如

# 折叠换行符,即等同于 "bar : this is not a normal string it spans more than one line see?"
bar: >
this is not a normal string it
spans more than
one line
see?# 保留换行符
bar: |
this is not a normal string it
spans more than
one line
see?

片段和引用(Snippet)

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

Kubernetes 资源对象

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

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

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

apiVersion: v1
kind: Pod
metadata:name: nginx-6799fc88d8-tpx29namespace: defaultlabels:app: nginx
spec:containers:- image: nginximagePullPolicy: Alwaysname: nginxrestartPolicy: Always

辅助工具

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

yamllit

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

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

$ yamllint nginx.yaml
nginx.yaml1:1       warning  missing document start "---"  (document-start)10:3      error    wrong indentation: expected 4 but found 2  (indentation)

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

---
apiVersion: v1
kind: Pod
metadata:name: nginx-6799fc88d8-tpx29namespace: defaultlabels:app: nginx
spec:containers:- image: nginximagePullPolicy: Alwaysname: nginxrestartPolicy: Always

yq

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

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

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

$ yq eval '.metadata.name' nginx.yaml
nginx-6799fc88d8-tpx29

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

# yq eval '.metadata.name = "nginx"' nginx.yaml
apiVersion: v1
kind: Pod
metadata:name: nginxnamespace: defaultlabels:app: nginx
spec:containers:- image: nginximagePullPolicy: Alwaysname: nginxrestartPolicy: Always

kube-score

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

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

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

参考资料

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

  • YAML 语言规范 https://yaml.org/spec/1.2/spec.html
  • Kubernetes 资源对象 Understanding Kubernetes Objects | Kubernetes

欢迎长按下面的二维码关注漫谈云原生公众号,输入任意关键字查询更多云原生知识库。

Related Articles

  • 聊一聊 GKE AutopilotMar 01 '21
  • Kubernetes网络策略可视化编辑器Feb 01 '21
  • 三大公有云托管 Kubernetes 服务 (EKS、GKE、AKS) 评估Jan 20 '21
  • 为什么已经用了滚动更新服务还会中断Jan 18 '21
  • Kubernetes 配置更新的那些事Jan 13 '21

感谢原作者分享:

云原生时代的 YAML 教程 • Feiskyhttps://feisky.xyz/posts/2021-03-03-yaml/

云原生时代的 YAML 教程相关推荐

  1. 迎难而上,做云原生时代的弄潮儿:搞定 Kubernetes

    作者罗剑锋,网名"Chrono",Kong 高级工程师,Nginx/OpenResty 开源项目贡献者,也是极客时间<透视HTTP协议><罗剑锋的C++实战笔记& ...

  2. Kubernetes 已经成为云原生时代的安卓,这就够了吗?

    作者:司徒放 审核&校对:田玮靖.溪洋 编辑&排版:雯燕 导语: 云原生时代,直接使用 Kubernetes 和云基础设施过于复杂,如用户需要学习很多底层细节.应用管理的上手成本高.容 ...

  3. 云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator

    作者 | 刘睿.杜恒 导读:RocketMQ Operator 现已加入 OperatorHub,正式进入 Operator 社区.本文将从实践出发,结合案例来说明,如何通过 RocketMQ Ope ...

  4. .NET5实战千万并发,性能碾压各版本,云原生时代,.NET5为王!

    在移动互联网时代掉队的.NET,当下正凭借着.NET5的开源跨平台以及容器友好,在云原生时代正在重铸辉煌.而作为.NET开发者,新年跳槽季的高并发问题会更多了,因为高并发能牵扯出太多问题,接口响应超时 ...

  5. 带你深入探究云原生时代的分布式操作系统 Kubernetes

    过去几年,以 docker.kubernetes 为代表的容器技术已发展为一项通用技术,BAT.滴滴.京东.头条等大厂,都争相把容器和 k8s 项目作为技术重心,试图"放长线钓大鱼" ...

  6. 直播回顾|论道原生:云原生时代的中间件

    " 在基础软件领域,中间件与操作系统.数据库并列为三大基础软件.中间件 (Middleware) 是处于操作系统和应用程序之间的一大类软件的统称,主要管理计算资源和网络通信,可以通过屏蔽底层 ...

  7. 云原生时代,为什么基础设施即代码(IaC)是开发者体验的核心?

    作者 | 林俊(万念) 来源 |尔达 Erda 公众号 从一个小故事开始 你是一个高级开发工程师. 某天,你自信地写好了自动煮咖啡功能的代码,并在本地调试通过.代码合并入主干分支后,你准备把服务发布到 ...

  8. 云原生时代(五):Kubernetes与容器编排之战

    上文我们主要介绍了容器和Docker,第五部分我们来讲Kubernetes与容器编排之战. 容器编排与Kubernetes 在单机上运行容器,无法发挥它的最大效能,只有形成集群,才能最大程度发挥容器的 ...

  9. 云原生时代的DevOps平台设计之道

    开发人员与运维人员是 IT 领域很重要的两大人群,他们都会参与到各种业务系统的建设过程中去.DevOps 是近年间火爆起来的一种新理念,这种理念被很多人错误的解读为"由开发人员(Dev)学习 ...

最新文章

  1. mmap映射大于4g的文件_尴尬,win10镜像文件install.wim大于4G,如何将它装进U盘
  2. IIS 用户验证及授权
  3. 百练OJ:2714:求平均年龄
  4. ARM Cortex-A 编程手册学习笔记
  5. CVE-2016-0143 漏洞分析(2016.4)
  6. css演练 0920 个人简历的制作
  7. .net抽象类和抽象函数abstract
  8. python xp系统_win XP的系统应该装哪个python的安装包?
  9. Linux系统批量压缩图片工具
  10. 怎么讲bpm文件读入Matlab,bpm Matlab环境下基于期望传播算法的贝叶 类器工 238万源代码下载- www.pudn.com...
  11. [XCTF] reverse logmein
  12. 首先,打破一切常规 学习笔记 之二
  13. 2019牛客暑期多校训练营(第四场)----E- triples II
  14. 服务器时间 验证码不显示,时间不同步导致网页验证码不能正常显示解决方法...
  15. java项目结局篇之项目进度
  16. arm linux 工控,基于ARM和Linux通用工控平台设计 - ARM - 电子发烧友网
  17. 平头哥RVB2601板子上手——NETMGR与WIFI
  18. 父亲的暧昧行迹该告诉母亲吗?
  19. Dubbo高频面试题
  20. 实践!在Spring-Boot启动时添加方法运行,查漏补缺

热门文章

  1. Spring依赖注入的两种方式(根据实例详解)
  2. Java多线程学习三十:ThreadLocal 适合用在哪些实际生产的场景中
  3. MySQLi学习笔记 :一 1. 数据库的基本概念 2. MySQL数据库软件 安装-- 卸载--. 配置 3. SQL
  4. 我的JavaWeb学习1
  5. org.apache.commons.math3.linear.FieldMatrix的类关系图
  6. 【6.18校内test】T1多项式输出
  7. ES6-18:class类及其继承
  8. 清北学堂模拟赛d1t1 位运算1(bit)
  9. SPOJ HIGH Highways
  10. css中的一些问题及解决方法