



YAML在Kubernetes中十分重要,因为Kubernetes中一切皆resource,而创建resource最常用的方式就是将resource的定义(配置)写入YAML文件,然后通过该文件来创建resource。因此,不管是自己创建resource还是看别人的YAML文件,都需要掌握YAML文件的用法。本节将介绍Kubernetes中YAML文件的基础用法,具体说明如下。
YAML是“YAML Ain't a Markup Language”(YAML不是一种标记语言)的缩写。YAML是一种数据序列化标准,它可以用于所有的编程语言,其特点是人性化,易读好懂。
序列化是指将内存中的对象(这里的对象,指面向对象编程中的对象,是广义的)数据,按照一定的标准(YAML就是其中的一种标准,JSON也是其中的一种标准),转换成可以传输或存储的数据。
反序列化:程序根据序列化标准,解析序列化数据,在内存中恢复出该对象的过程。
1.YAML使用步骤
使用YAML文件创建resource的步骤如下。
1)使用“kubectl explain XXX”获得指定resource的Object信息。
2)将Object信息按照YAML的标准写入YAML文件。
3)运行kubectl命令读取YAML文件来创建resource。
4)kubectl将YAML文件中的数据转换JSON格式的数据,并组成HTTP请求,发送给Kubernetes。
5)Kubernetes响应请求创建resource,并返回创建结果。
对于用户来说,最重要的就是将resource的Object信息,按照YAML的标准写入文件。
2.YAML描述示例
假设一个顾客(resource)Object的数据,包括两个成员:第一个成员是string类型,Key为name,Value值是张三;第二个成员是Object,Key是contact,Value有3个成员,其中第一个成员的Key是address,Value值是“江苏省南京市”,第二个成员的Key是telephone,Value是数组,包含一个值025-xxxxx,第三个成员的Key是mobilephone,Value是数组,包含两个值,分别是138xxxxxx和159xxxxxx。将上述Object写入YMAL文件,内容如图3-1所示。
图3-1 顾客Object的YAML描述图
上述Object也可以转换成JSON格式,内容如图3-2所示。
图3-2 顾客Object的JSON描述图
同一个resource的Object数据,既可以用YAML描述,也可以用JSON描述,YAML和JSON可以互相转换。这就如同一篇文章,既可以用中文,又可以用英文,不管使用哪种,它们表达的意思是一样的。
3.YAML基本语法
下面介绍使用YAML描述Object的基本语法。
(1)基本数据类型成员的表示
如图3-1第1行所示,name是Key在左边,中间使用冒号“:”分隔,张三是Value,在右边。要特别注意“:”的右边一定要有空格,但个数不限。
(2)Object成员的描述
如图3-1第2~8行所示,contact是Key在左边,中间使用冒号“:”分隔,“:”的右侧不能有数据,必须换行列出Value的各项成员,包括:address、telephone和mobilephone。要特别注意以下几点。
● address的首字母a,必须和Key(contact)有缩进,而且必须用空格来缩进,不能用〈Tab〉键,通常是缩进两个空格,但具体的空格数没有限制,如果不缩进的话,address就会被解析成和contact平级的成员。
● telephone的首字母t必须和address的a对齐,以此表示它们是同级的成员。
(3)数组成员的描述
如图3-1的4~5或6~8行所示,mobilephone是数组名,也是Key,位置在左边,后面跟“:”做分隔,“:”的右侧不能有数据,必须换行列出Value中各个元素,要特别注意以下几点。
● 数组元素以“-”作为开头,“-”不能超出Key(mobilephone)的位置,可以和Key(mobilephone)对齐,也可以缩进,建议缩进两个空格。
● “-”后面要有空格,否则Value就是对象类型,而不是数组类型了。
● 数组内的元素的“-”一定要对齐,就如“- 138xxxxxx”和“- 159xxxxxx”的“-”一定要对齐,否则会报错。
(4)对象成员的命名
同一级的对象成员不能同名,例如图3-3的写法就会报错。
图3-3 同组对象成员同名示例
(5)YAML使用“#”作为注释符号
(6)YAML文件通常以yml作为文件扩展名
小窍门:http://nodeca.github.io/js-yaml/是一个在线将YAML转JSON的网站,可以输入YAML格式的描述,如果能够顺利转换成JSON,且逻辑正确的话,则说明编写的YAML文件正确。
4.YAML描述resource
如下所示就是使用YAML描述的一个Pod Object。
上述Pod Object的YAML文件说明如下。
1)第1个成员的Key是apiVersion,Value值是v1。v1是API version,是稳定版,core是API Group,core默认不写入,因此最终的apiVersion就是v1。
2)第2个成员Key是kind,值是Pod。
3)第3个成员类型是Object,它的Key是metadata,Value有1个成员,成员的Key是name,值mypod,它将作为Pod的标识。
4)第4个成员也是一个对象,Key是spec,有1个成员containers,containers是一个Object数组,数组中有1个元素,该元素有两个成员,第一个成员的Key是name,Value值是myfrontend,第二个成员的Key是image,Value值是nginx。表明该Pod只有1个容器,容器的名字为myfrontend,镜像的名字为nginx。
如果要我们自己来填写YAML文件,那么上述YAML中各个成员的值是从哪里获取的呢?说明如下。
1)apiVersion和kind值,是通过运行“kubectl explain Pod”查询得到的。
2)metadata和spec的详细结构,可以运行“kubectl explain Pod--recursive=true”来查询,但是每个成员的值,是需要用户填入的,因为这个属于配置信息,没有固定的值供选择。
3)访问https://kubernetes.io/docs/reference/generated/kubernetes-api/v1.20可以获得resource中各个成员值的描述和说明。
4)使用命令“kubectl api-resources”查询当前Kubernetes所支持的resource。
5)使用命令“kubectl api-versions”查询当前Kubernetes所支持的API版本,其版本的具体形式是GROUP/VERSION。