一、YAML 文件概述
Kubernetes只支持YAML和JSON格式创建资源对象
JSON格式用于接口之间消息的传递,YAML格式用于配置和管理
YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。
k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。
二、YAML 介绍及优点
1.YAML 介绍
YAML 仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。
YAML 是一个可读性高,用来表达数据序列的格式。
2.YAML 优点
1)YAML 文件易于人类阅读,具有表达性和可扩展性。
2)YAML 文件易于实现和使用。
3)可在编程语言之间轻松移植。
4)与敏捷语言的原生数据结构相匹配。
5)YAML 文件具有一致模型,支持通用工具。
6)YAML 文件支持 One-pass 处理。
7)使用方便,因此您无需再将所有的参数添加到命令行中。
8)易于维护 – 可以将 YAML 文件添加到源控件中以跟踪更改。
9)灵活便捷 – 可以使用 YAML 创建更加复杂的结构(相对于使用命令行可以创建的结构)
三、YAML 基本语法
1)通过缩进表示层级关系,使用空格做为缩进
2)缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
3)低版本缩进时不允许使用 Tab 键,只允许使用空格,使用空格一般开头缩进两个空格
4)本字符后缩进一个空格,比如冒号,逗号等后面本使用
5)---表示新的yaml文件开始
4)使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
四、YAML与 JSON 和 XML 的关系
XML 是许多领域的优先采用格式。XML 最初设计为与标准通用标记语言 (SGML) 向后兼容,后者旨在支持结构化文档。因此,XML存在许多设计上的约束。
JSON 的设计理念是简单性和通用性,并且易于生成和解析。JSON 格式的可读性低,但是这种格式的数据每一种现代编程环境都可以轻松处理。
YAML 的设计目标是提升可读性,提供更加完善的信息模型。YAML 的生成和解析更加复杂,因此可以将其视为 JSON 的自然超集。每个
JSON 文件都是一个有效的 YAML 文件。
综上所述,在需要额外功能的情况下,可以轻松地从 JSON 迁移到 YAML。YAML 是从 XML 衍生而来。
五、YAML 文件组成部分
YAML 文件有两个组成部分:
1.控制器定义
2.被控制对象
六、YAML 在 Kubernetes 中的使用
Kubernetes 资源是通过声明的方式创建的,因此可以使用 YAML 文件。
Kubernetes 资源(比如 Pod、服务和部署)是使用 YAML 文件创建的。
YAML文件开头需要编写标签信息,对应不同资源信息
1.查看kubernetes的api版本
[root@k8s-master-001 ~]# kubectl api-versions
admissionregistration.k8s.io/v1beta1
apiextensions.k8s.io/v1beta1
apiregistration.k8s.io/v1
apiregistration.k8s.io/v1beta1
apps/v1 ##应用资源
apps/v1beta2 ##测试版本
authentication.k8s.io/v1
authentication.k8s.io/v1beta1
authorization.k8s.io/v1
authorization.k8s.io/v1beta1
autoscaling/v1
autoscaling/v2beta1 ##弹性伸缩资源
autoscaling/v2beta2
batch/v1
batch/v1beta1
certificates.k8s.io/v1beta1
coordination.k8s.io/v1beta1
events.k8s.io/v1beta1
extensions/v1beta1
networking.k8s.io/v1
policy/v1beta1
rbac.authorization.k8s.io/v1 ##权限控制资源
rbac.authorization.k8s.io/v1beta1
scheduling.k8s.io/v1beta1
storage.k8s.io/v1
storage.k8s.io/v1beta1
v1
2.编写Yaml文件
例如创建一个nginx资源,编写yaml文件
[root@k8s-master-001 ~]# vim nginx-deploy.yaml
apiVersion: apps/v1 ##版本号 ,pod资源
kind: Deployment ##类型/控制器
metadata: ##数据标签
name: nginx-deployment
labels: ##子标签
app: nginx ##业务容器
spec:
replicas: 3 ##副本集
selector: ##选择器
matchLabels: ##匹配标签
app: nginx ##对应上面的业务容器
template: ##模板
metadata:
labels:
app: nginx
spec:
containers: ##容器
- name: nginx ##对应上面的业务容器
image: nginx:1.15.4 ##使用镜像信息
ports:
- containerPort: 80 ##容器端口信息
---
apiVersion: v1 ##版本号
kind: Service ##服务类型
metadata:
name: nginx-service
labels:
app: nginx
spec:
type: NodePort ##端口映射
ports:
- port: 80 ##内部端口
targetPort: 80 ##映射端口
selector: ##选择器/
app: nginx ##选择业务进行发布
3.执行创建
#测试yaml文件命令的正确性
[root@k8s-master-001 ~]# kubectl create -f nginx-deploy.yaml --dry-run
deployment.apps/nginx-deployment created (dry run)
service/nginx-service created (dry run)
#执行创建
[root@k8s-master-001 ~]# kubectl create -f nginx-deploy.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
4.访问pod资源
[root@k8s-master-001 ~]# kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 3h7m
nginx NodePort 10.96.95.61 <none> 80:46847/TCP 12s
[root@k8s-master-001 ~]# curl 192.168.13.110:46847
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
七、YAML文件模板生成/导出
1.利用nginx镜像创建资源,生成yaml格式文件
#1.创建资源生成yaml文件
[root@k8s-master-001 ~]# kubectl create deployment web --image=nginx --port=80 --replicas=3 --dry-run -o yaml > my1.yaml
W0923 18:35:21.730422 2876 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
#2.查看是否生成新的yaml文件
[root@k8s-master-001 ~]# ll
total 12
-rw-r--r-- 1 root root 419 Sep 23 18:35 my1.yaml
#3.查看生成的yaml文件
[root@k8s-master-001 ~]# cat my1.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
creationTimestamp: null
labels:
app: web
name: web
spec:
replicas: 3
selector:
matchLabels:
app: web
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
app: web
spec:
containers:
- image: nginx
name: nginx
ports:
- containerPort: 80
resources: {}
status: {}
2.利用nginx镜像创建资源,生成json格式文件
#1.创建资源生成json文件
[root@k8s-master-001 ~]# kubectl create deployment web --image=nginx --port=80 --replicas=3 --dry-run -o json > my1.json
W0923 18:41:00.973387 4925 helpers.go:555] --dry-run is deprecated and can be replaced with --dry-run=client.
#2.查看是否生成新的json文件
[root@k8s-master-001 ~]# ll
total 16
-rw-------. 1 root root 1350 Jun 9 2020 anaconda-ks.cfg
drwxr-xr-x 2 root root 76 Sep 16 17:49 delopyment
-rw-r--r--. 1 root root 497 Aug 5 2020 hostname_ip.sh
-rw-r--r-- 1 root root 1009 Sep 23 18:41 my1.json
-rw-r--r-- 1 root root 419 Sep 23 18:35 my1.yaml
#3.查看生成的json文件
[root@k8s-master-001 ~]# cat my1.json
{
"kind": "Deployment",
"apiVersion": "apps/v1",
"metadata": {
"name": "web",
"creationTimestamp": null,
"labels": {
"app": "web"
}
},
"spec": {
"replicas": 3,
"selector": {
"matchLabels": {
"app": "web"
}
},
"template": {
"metadata": {
"creationTimestamp": null,
"labels": {
"app": "web"
}
},
"spec": {
"containers": [
{
"name": "nginx",
"image": "nginx",
"ports": [
{
"containerPort": 80
}
],
"resources": {}
}
]
}
},
"strategy": {}
},
"status": {}
}
3.将现有的资源生成模板导出到指定文件中
#1.查看现有资源
[root@k8s-master-001 ~]# kubectl get pods,deploy
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-d55b94fd-5jvtq 1/1 Running 0 16m
pod/nginx-deployment-d55b94fd-pfb7n 1/1 Running 0 16m
pod/nginx-deployment-d55b94fd-vtm7t 1/1 Running 0 16m
NAME DESIRED CURRENT UP-TO-DATE AVAILABLE AGE
deployment.extensions/nginx-deployment 3 3 3 3 16m
#2.导出资源成yaml文件到新的文件中
[root@k8s-master-001 ~]# kubectl get deployment/nginx-deployment --export -o yaml > nginx_abc.yaml
#3.验证导出的yaml文件
[root@k8s-master-001 ~]# cat nginx_abc.yaml
apiVersion: extensions/v1beta1
kind: Deployment
metadata:
annotations:
deployment.kubernetes.io/revision: "1"
creationTimestamp: null
generation: 1
labels:
app: nginx
name: nginx-deployment
selfLink: /apis/extensions/v1beta1/namespaces/default/deployments/nginx-deployment
spec:
progressDeadlineSeconds: 600
replicas: 3
revisionHistoryLimit: 10
selector:
matchLabels:
app: nginx
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
type: RollingUpdate
template:
metadata:
creationTimestamp: null
labels:
app: nginx
spec:
containers:
- image: nginx:1.15.4
imagePullPolicy: IfNotPresent
name: nginx
ports:
- containerPort: 80
protocol: TCP
resources: {}
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
dnsPolicy: ClusterFirst
restartPolicy: Always
schedulerName: default-scheduler
securityContext: {}
terminationGracePeriodSeconds: 30
status: {}
八、YAML 支持的数据结构
1.对象
键值对的集合,又称为映射(mapping) / 哈希(hashes)/ 字典(dictionary)
对象类型:对象的一组键值对,使用冒号结构表示
name: Tom
age: 18
Yaml也允许另一种写法,将所有键值对写成一个行内对象
hash: { name: Tom, age: 18 }
2.数组
一组按次序排列的值,又称为序列(sequence)/ 列表 (list)
数组类型:一组连词线开头的行,构成一个数组
Peop1e
- Tom
- Jack
数组也可以采用行内表示法
People: [Tom,Jack]
3.纯量
纯量:纯量是最基本的、不可再分的值。以下数据类型都属于纯量
数值直接以字面量的形式表示
number: 12.30
布尔值用true和false表示
isset: true
null 用~表示
parent: ~
时间采用iso8601格式
iso8601:2021-12-14t21:59:43.10-05:00
日期采用复合iso8601格式的年、月、日表示
date: 1976-07-31
YAML允许使用两个感叹号,强制转换数据类型
e: !!str 123
f: !!str true
字符串默认不使用引号表示
str: 这是一行字符串
如果字符串之中包含空格或特殊字符,需要放在引号之中
str: '内容: 字符串'
单引号和双引号都可以使用,双引号不对特殊字符转义
s1: '内容\n字符串'
s2: "内容\n字符串'
单引号之中如果还有单引号,必须连续使用两个单引号转义
str: 'labor''s day'
字符串可以写成多行,从第二行开始,必须有一个单空格缩进。换行符会被转为空格
str:这是一段
多行
字符串
多行字符串可以使用|保留换行符,也可以使用>折叠换行
this: |
Foo
Bar
that
Foo
Bar
九、资源清单描述方法
在 k8s 中,一般使用 YAML 格式的文件来创建符合我们预期期望的 pod,这样的 YAML 文件称为资源清单。
1.必须存在的字段
2.spec 主要对象
3.额外的参数
4.举例说明
---
# 创建一个namespace
apiVersion: v1
kind: Namespace
metadata:
name: test
---
# 创建一个pod
apiVersion: v1
kind: pod
metadata:
name: pod1
spec:
containers:
- name: nginx-containers
image: nginx:latest