通过上两篇文章,我想大家对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的对象。

 

 

 

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐