YAML 文件概述

Kubernetes只支持YAML和JSON格式创建资源对象,JSON格式用于接口之间消息的传递,YAML格式用于配置和管理。

YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便,它实质上是一种通用的数据串行化格式。

k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象的操作都编辑到 YAML文件中,我们把这种文件叫做资源清单文件,通过 kubectl命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署。

YAML 基本语法

  • 缩进标识层级关系
  • 不支持TAB缩进,使用空格缩进
  • 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可(习惯缩进两个空格)
  • 字符后缩进一个空格,如冒号,逗号等
  • “#”表示注释,从这个字符一直到行尾,都会被解释器忽略
  • ---为可选的分隔符 ,当需要在一个文件中定义多个结构的时候需要使用,表示一个新的yaml文件开始

YAML 两种结构类型

  • Maps
  • Lists

(1)Map顾名思义指的是字典,即一个Key:Value 的键值对信息。例如:

---
apiVersion: v1
kind: Pod

Maps的value既能够对应字符串也能够对应一个Maps。例如:

---
apiVersion: v1
kind: Pod
metadata:
  name: kube100-site
  labels:
    app: web

上述的YAML文件中,metadata这个KEY对应的值为一个Maps,而嵌套的labels这个KEY的值又是一个Map。实际使用中可视情况进行多层嵌套。

YAML处理器根据行缩进来知道内容之间的关联。上述例子中,name和labels是相同缩进级别,因此YAML处理器知道他们属于同一map;它知道app是lables的值因为app的缩进更大。

(2)List即列表,说白了就是数组,例如:

args
 -beijing
 -shanghai
 -shenzhen
 -guangzhou

可以指定任何数量的项在列表中,每个项的定义以破折号(-)开头,并且与父元素之间存在缩进。在JSON格式中,表示如下:

{
  "args": ["beijing", "shanghai", "shenzhen", "guangzhou"]
}

当然Lists的子项也可以是Maps,Maps的子项也可以是List,例如:

---
apiVersion: v1
kind: Pod
metadata:
  name: kube100-site
  labels:
    app: web
spec:
  containers:
    - name: front-end
      image: nginx
      ports:
        - containerPort: 80
    - name: flaskapp-demo
      image: jcdemo/flaskapp
      ports: 8080

如上述文件所示,定义一个containers的List对象,每个子项都由name、image、ports组成,每个ports都有一个KEY为containerPort的Map组成。

k8s中YAML文件模板生成/导出(两种方式)

(1)利用镜像创建资源,生成yaml格式文件

kubectl create deployment web --image=nginx -o yaml --dry-run > my1.yaml

[root@master ~]# kubectl create deployment web --image=nginx -o yaml --dry-run > my1.yaml
W0407 01:14:27.073993  126062 helpers.go:535] --dry-run is deprecated and can be replaced with --dry-run=client.
[root@master ~]# cat my1.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  creationTimestamp: null
  labels:
    app: web
  name: web
spec:
  replicas: 1
  selector:
    matchLabels:
      app: web
  strategy: {}
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: web
    spec:
      containers:
      - image: nginx
        name: nginx
        resources: {}
status: {}
[root@master ~]# ls
123  123r  anaconda-ks.cfg  kube-flannel.yml  my1.yaml

表示以nginx镜像创建deployment资源,检测运行,生成yaml文件为my1.yaml。

(2)将现有的资源生成模板导出为yaml文件

kubectl get deploy nginx -o yaml --export > my2.yaml

#查看现有资源
[root@master ~]# kubectl get deploy
NAME    READY   UP-TO-DATE   AVAILABLE   AGE
nginx   1/1     1            1           19d
#导出资源成yaml文件
[root@master ~]# kubectl get deploy nginx -o yaml --export > my2.yaml
Flag --export has been deprecated, This flag is deprecated and will be removed in future.
[root@master ~]# ll
total 28
-rw-r--r--. 1 root root   31 Mar 16 00:10 123
-rw-r--r--. 1 root root   29 Mar 16 00:10 123r
-rw-------. 1 root root 1271 Mar 13 02:44 anaconda-ks.cfg
-rw-r--r--  1 root root 4821 Mar 19 00:25 kube-flannel.yml
-rw-r--r--  1 root root  376 Apr  7 01:14 my1.yaml
-rw-r--r--  1 root root 3026 Apr  7 04:27 my2.yaml
[root@master ~]# cat my2.yaml 
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: null
  generation: 1
  labels:
    app: nginx
  managedFields:
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:labels:
          .: {}
          f:app: {}
      f:spec:
        f:progressDeadlineSeconds: {}


。。。。。。。。。。。。。。。。

 将现有deployment资源nginx的生成模板导出为yaml文件。