(四)YAML 语法基础
通过上两篇文章,我想大家对k8s有了大致的概念,今天我们继续往下学习。一直再想先讲偏实践的pod,还是先讲重于理论的k8s对象。想了半年难辨左右,好吧,咱们就先讲讲yaml基础的语法。这不能让各位猜着了。不管pod或者是k8s的对象,落到实际都是yaml文件。所以yaml文件是k8s最核心最基础的内容。对于我们来说yaml文件的编写很重要,以后的日常工作大部分经历就是编写yaml文件。重要的事情说
通过上两篇文章,我想大家对k8s有了大致的概念,今天我们继续往下学习。一直再想先讲偏实践的pod方面操作,还是先讲重于理论的k8s对象。想了半年难辨左右,好吧,咱们就先讲讲yaml基础的语法。这不能让各位猜着了。不管pod或者是k8s的对象,落到实际都是yaml文件。所以yaml文件是k8s最核心最基础的内容。对于我们来说yaml文件的编写很重要,以后的日常工作大部分经历就是编写yaml文件。重要的事情说三遍,yaml!yaml!yaml!yaml基础语法很简单,基本上都能看的懂怎么回事儿。但事实看得懂和能写是两码事儿。所以我们还是有必要来学习yaml语法的基础。
YAML 是一种简洁的非标记语言。YAML以数据为中心,使用空白,缩进,分行组织数据,从而使得表示更加简洁易读。一般的网上yaml讲解都是结合json来讲,json我未必会,那我们只讲单纯的来讲yaml语法。
一. 基本规则
YAML有以下基本规则:
1、大小写敏感
2、使用缩进表示层级关系
3、禁止使用tab缩进,只能使用空格键
4、缩进长度没有限制,只要元素对齐就表示这些元素属于一个层级。
5、使用#表示注释
6、字符串可以不用引号标注
这个不需要我过多的讲解,大家记住就行。
二. 数据类型
这里我列出几种常用的数据类型,不太常用的以后用到了在做解释。
1.字符串
字符串很好理解,常规的不做过多解释,一般情况下不需要用引号。但是有几种情况需要特殊处理:
1.如果字符串的首部或者尾部有空白字符,那么必须使用引号,否则在解析文件的时候会将首部和尾部的空白字符移除。
2.如果在字符串中包含了如下的控制字符,必须要使用双引号:
\0, \x01, \x02, \x03, \x04, \x05, \x06, \a, \b, \t, \n, \v, \f, \r, \x0e, \x0f, \x10, \x11, \x12, \x13, \x14, \x15, \x16,\x17, \x18, \x19, \x1a, \e, \x1c, \x1d, \x1e, \x1f, \N, \_, \L, \P
3. 此外,在下面这几种情况下也必须使用引号进行包裹:
- 当字符串是 true 或者 false (否则的话,会被认为是一个布尔值);
- 当字符串是 null或者 ~ (否则的话,会被认为是一个null);
- 当字符串像一个数字,比如整数(2,4)、浮点数(2.6,12.3)、科学计数(12e7)等等可以被看作是数字的字符串;
- 当字符串看起来像一个日期格式(2014-12-31);
4. 如果在字符串中包含下面的字符,必须要使用引号,如果你使用单引号的话可以避免转义,如果使用双引号那么在下面的字符前面必须使用转义字符“\”:
:, {, }, [, ], ,, &, *, #, ?, |, -, <, >, =, !, %, @, `
2. 数字
# 整数
12
# 八进制
014
# 十六进制
0x0C
# 浮点数
13.4
# 科学计数法
1.2e+34
# 无穷大
.inf
3. 空值
NULL或者 ~
4. 布尔值
true和false
5.日期
2021-02-14t21:59:43.10-05:00
# 简单的日期
2021-02-14
三.数据结构
1. 对象(Object)
使用冒号(:)表示键值对,同一缩进的所有键值对属于一个对象。
age : 12
name : huang
#也可以写在一行
{age:12,name:huang}
2. 数组(Aarry)
使用连字符(-)表示:
- a
- b
- 12
#也可以写在一行
[a,b,c]
3. scalar,纯量
数据最小的单位,不可以再分割。这个用的不是很多。
最后,以K8s中的示例来说明对象和数组:
apiVersion: apps/v1
kind: ReplicaSet #这也是对象
metadata: #对象可以是多个k:v 组合,这就是一个多k:v组合的对象。
name: myapp
namespace: default
spec: #它也是对象,它更复杂点,它是复合型的对象
replicas: 2
selector:
matchLabels:
app: myapp
release: canary
template:
metadata:
name: myapp-pod
labels:
app: myapp
release: canary
environment:qa
spec:
containers: #它的帮助信息中显示,它的类型为: <[]Object> ,但Yamy中,
#它实际上是一个对象类型,但这个对象的值是一个数组类型。
- name: myapp-container #这是一个多属性的数组,即一个数组有多个元素组成。
image: busybox
ports: #它和containers一样。也是一个对象类型,但值(value)是数组类型.
- name:http #注意: 数组是以"-"开头的.
containerPort: 80
- name: https
containerPort: 443
注意数组的另外一种形式:
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
四.数据结构嵌套
数组和对象组合可组成多种嵌套,常见的有4种,结合上例,加以分析
1. 对象嵌套对象
matchLabels:
app: myapp
release: canary
2. 对象嵌套数组
ports:
- name: http
containerPort: 80
- name: https
containerPort: 443
3. 数组嵌套对象
- name: http
containerPort: 80
4. 数组嵌套数组
# 例子没有太合适,可能造成误解,我简单写一个吧
-
- Ruby
- Perl
- Python
-
- c
- c++
- java
五. yaml 中的特殊用法
1. 注释
YAML采用行注释,使用“#” ,可以单独一行,也可以在行位注释
# 注释一行
"symfony 1.0": { PHP: 5.0, Propel: 1.2 } # 在行尾进行注释
"symfony 1.2": { PHP: 5.2, Propel: 1.3 }
2. 三横线 “---”及三点“...”
三个横线("---")表示一个配置段的开始.
---
spring:
profiles: development
server:
address: 10.0.0.1
---
spring:
profiles: production
server:
address: 172.20.120.1
三个横线表示文档开始,三个点表示文档结束
---
time: 12:13:17
server: 192.168.2.3
...---
time: 12:13:17
server: 192.168.2.4
...
3. 单引号中的双引号 ' " '
str: 'labor''s day' 可表示 str: 'labor\'s day'
4. 锚点(&) 和 引用(*) 的组合使用:
hr:
- Mark McGwire
- &SS Sammy Sosa #创建了一个锚点叫SS, 其值为:Sammy Sosa
rbi:
- *SS #引用一个已经定义的锚点SS,这样就引用了SS的值 Sammy Sosa。
- Ken Griffey
#这个好理解
defaults: &defaults #定义了一个锚点:叫defautls
adapter: postgres
host: localhost
development:
database: myapp_development
<<: *defaults #这里引用了defaults描点的值,并使用"<<"表示将其合并到当前对象(Object)或叫映射(map)中。
test:
database: myapp_test
<<: *defaults
合并后的结果,就相当于:
defaults:
adapter: postgres
host: localhost
development:
database: myapp_development
adapter: postgres
host: localhost
test:
database: myapp_test
adapter: postgres
host: localhost
##定义对象
merge:
- &CENTER { x: 1, y: 2 }
- &LEFT { x: 0, y: 2 }
- &BIG { r: 10 }
- &SMALL { r: 1 }
sample1:
<<: *CENTER
r: 10
sample2:
<< : [ *CENTER, *BIG ]
other: haha
sample3:
<< : [ *LEFT, *BIG ]
r: 100
合并就相当于下面:
sample1:
x: 1
y: 2
r: 10
sample2:
x: 1
y: 2
r: 10
other: haha
##多锚点
后记
yaml语法就写这些吧,接下来开始讲k8s的对象。
更多推荐
所有评论(0)