云原生时代的 YAML 教程
云原生时代的 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 教程相关推荐
- 迎难而上,做云原生时代的弄潮儿:搞定 Kubernetes
作者罗剑锋,网名"Chrono",Kong 高级工程师,Nginx/OpenResty 开源项目贡献者,也是极客时间<透视HTTP协议><罗剑锋的C++实战笔记& ...
- Kubernetes 已经成为云原生时代的安卓,这就够了吗?
作者:司徒放 审核&校对:田玮靖.溪洋 编辑&排版:雯燕 导语: 云原生时代,直接使用 Kubernetes 和云基础设施过于复杂,如用户需要学习很多底层细节.应用管理的上手成本高.容 ...
- 云原生时代 RocketMQ 运维管控的利器 - RocketMQ Operator
作者 | 刘睿.杜恒 导读:RocketMQ Operator 现已加入 OperatorHub,正式进入 Operator 社区.本文将从实践出发,结合案例来说明,如何通过 RocketMQ Ope ...
- .NET5实战千万并发,性能碾压各版本,云原生时代,.NET5为王!
在移动互联网时代掉队的.NET,当下正凭借着.NET5的开源跨平台以及容器友好,在云原生时代正在重铸辉煌.而作为.NET开发者,新年跳槽季的高并发问题会更多了,因为高并发能牵扯出太多问题,接口响应超时 ...
- 带你深入探究云原生时代的分布式操作系统 Kubernetes
过去几年,以 docker.kubernetes 为代表的容器技术已发展为一项通用技术,BAT.滴滴.京东.头条等大厂,都争相把容器和 k8s 项目作为技术重心,试图"放长线钓大鱼" ...
- 直播回顾|论道原生:云原生时代的中间件
" 在基础软件领域,中间件与操作系统.数据库并列为三大基础软件.中间件 (Middleware) 是处于操作系统和应用程序之间的一大类软件的统称,主要管理计算资源和网络通信,可以通过屏蔽底层 ...
- 云原生时代,为什么基础设施即代码(IaC)是开发者体验的核心?
作者 | 林俊(万念) 来源 |尔达 Erda 公众号 从一个小故事开始 你是一个高级开发工程师. 某天,你自信地写好了自动煮咖啡功能的代码,并在本地调试通过.代码合并入主干分支后,你准备把服务发布到 ...
- 云原生时代(五):Kubernetes与容器编排之战
上文我们主要介绍了容器和Docker,第五部分我们来讲Kubernetes与容器编排之战. 容器编排与Kubernetes 在单机上运行容器,无法发挥它的最大效能,只有形成集群,才能最大程度发挥容器的 ...
- 云原生时代的DevOps平台设计之道
开发人员与运维人员是 IT 领域很重要的两大人群,他们都会参与到各种业务系统的建设过程中去.DevOps 是近年间火爆起来的一种新理念,这种理念被很多人错误的解读为"由开发人员(Dev)学习 ...
最新文章
- mmap映射大于4g的文件_尴尬,win10镜像文件install.wim大于4G,如何将它装进U盘
- IIS 用户验证及授权
- 百练OJ:2714:求平均年龄
- ARM Cortex-A 编程手册学习笔记
- CVE-2016-0143 漏洞分析(2016.4)
- css演练 0920 个人简历的制作
- .net抽象类和抽象函数abstract
- python xp系统_win XP的系统应该装哪个python的安装包?
- Linux系统批量压缩图片工具
- 怎么讲bpm文件读入Matlab,bpm Matlab环境下基于期望传播算法的贝叶 类器工 238万源代码下载- www.pudn.com...
- [XCTF] reverse logmein
- 首先,打破一切常规 学习笔记 之二
- 2019牛客暑期多校训练营(第四场)----E-	triples II
- 服务器时间 验证码不显示,时间不同步导致网页验证码不能正常显示解决方法...
- java项目结局篇之项目进度
- arm linux 工控,基于ARM和Linux通用工控平台设计 - ARM - 电子发烧友网
- 平头哥RVB2601板子上手——NETMGR与WIFI
- 父亲的暧昧行迹该告诉母亲吗?
- Dubbo高频面试题
- 实践!在Spring-Boot启动时添加方法运行,查漏补缺
热门文章
- Spring依赖注入的两种方式(根据实例详解)
- Java多线程学习三十:ThreadLocal 适合用在哪些实际生产的场景中
- MySQLi学习笔记 :一 1. 数据库的基本概念 2. MySQL数据库软件 	 安装-- 卸载--. 配置 3. SQL
- 我的JavaWeb学习1
- org.apache.commons.math3.linear.FieldMatrix的类关系图
- 【6.18校内test】T1多项式输出
- ES6-18:class类及其继承
- 清北学堂模拟赛d1t1 位运算1(bit)
- SPOJ HIGH Highways
- css中的一些问题及解决方法