一、概述
二、YAML文件优点
三、YAML与 JSON 和 XML 的关系
四、YAML 文件的结构
五、YAML 在 Kubernetes 中的使用
六、YAML文件模板生成/导出
Kubernetes只支持YAML和JSON格式创建资源对象
JSON格式用于接口之间消息的传递,YAML格式用于配置和管理
YAML是专门用来写配置文件的语言,非常简洁和强大,使用比json更方便。它实质上是一种通用的数据串行化格式。
YAML 文件易于人类阅读,具有表达性和可扩展性。
YAML 文件易于实现和使用。
可在编程语言之间轻松移植。
与敏捷语言的原生数据结构相匹配。
YAML 文件具有一致模型,支持通用工具。
YAML 文件支持 One-pass 处理。
使用方便,因此您无需再将所有的参数添加到命令行中。
易于维护 – 可以将 YAML 文件添加到源控件中以跟踪更改。
灵活便捷 – 可以使用 YAML 创建更加复杂的结构(相对于使用命令行可以创建的结构)
XML 是许多领域的优先采用格式。XML 最初设计为与标准通用标记语言 (SGML) 向后兼容,后者旨在支持结构化文档。因此,XML存在许多设计上的约束。
JSON 的设计理念是简单性和通用性,并且易于生成和解析。JSON 格式的可读性低,但是这种格式的数据每一种现代编程环境都可以轻松处理。
YAML 的设计目标是提升可读性,提供更加完善的信息模型。YAML 的生成和解析更加复杂,因此可以将其视为 JSON 的自然超集。每个JSON 文件都是一个有效的 YAML 文件。
综上所述,在需要额外功能的情况下,可以轻松地从 JSON 迁移到 YAML。YAML 是从 XML 衍生而来。
键值对 – YAML 文件中的基本条目类型是键值对。键值对的格式是键和冒号,之后是空格,然后是值。
数组/列表 – 列表会在列表名称下列出一些项目。列表的元素以 - 开头。可以有 n 个列表,但是,数组中各个元素的缩进非常重要。
在编写 YAML 文件时,切记以下准则:
缩进标识层级关系
不支持制表符缩进,使用空格缩进
通常开头缩进两个空格
字符后缩进一个空格,如冒号,逗号等
“—”表示YAML格式,一个文件的开始
“#”表示注释
Kubernetes 资源是通过声明的方式创建的,因此可以使用 YAML 文件。
Kubernetes 资源(比如 Pod、服务和部署)是使用 YAML 文件创建的。
YAML文件开头需要编写标签信息,对应不同资源信息
[root@k8s_master ~]# 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
例如创建一个nginx资源
编写yaml文件
[root@k8s_master ~]# 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 ##选择业务进行发布
执行创建
###测试yaml文件命令的正确性
[root@k8s_master ~]# kubectl create -f nginx-deploy.yaml --dry-run
deployment.apps/nginx-deployment created (dry run)
service/nginx-service created (dry run)
##执行创建
[root@k8s_master ~]# kubectl create -f nginx-deploy.yaml
deployment.apps/nginx-deployment created
service/nginx-service created
访问pod资源
##卡看容器对外端口
[root@k8s_master ~]# kubectl get all
利用nginx镜像创建资源,生成yaml格式文件
[root@k8s_master ~]# kubectl run nginx-deployment --image=nginx --port=80 --replicas=3 --dry-run -o yaml
apiVersion: apps/v1beta1
kind: Deployment
metadata:
creationTimestamp: null
labels:
run: nginx-deployment
name: nginx-deployment
spec:
replicas: 3
selector:
matchLabels:
run: nginx-deployment
strategy: {}
template:
metadata:
creationTimestamp: null
labels:
run: nginx-deployment
spec:
containers:
- image: nginx
name: nginx-deployment
ports:
- containerPort: 80
resources: {}
status: {}
利用nginx镜像创建资源,生成json格式文件
[root@k8s_master ~]# kubectl run nginx-deployment --image=nginx --port=80 --replicas=3 --dry-run -o json
{
"kind": "Deployment",
"apiVersion": "apps/v1beta1",
"metadata": {
"name": "nginx-deployment",
"creationTimestamp": null,
"labels": {
"run": "nginx-deployment"
}
},
"spec": {
"replicas": 3,
"selector": {
"matchLabels": {
"run": "nginx-deployment"
}
},
"template": {
"metadata": {
"creationTimestamp": null,
"labels": {
"run": "nginx-deployment"
}
},
"spec": {
"containers": [
{
"name": "nginx-deployment",
"image": "nginx",
"ports": [
{
"containerPort": 80
}
],
"resources": {}
}
]
}
},
"strategy": {}
},
"status": {}
}
将现有的资源生成模板导出到指定文件中(–export -o)
##查看现有资源
[root@k8s_master ~]# 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
##导出资源成yaml文件到新的文件中
[root@k8s_master ~]# kubectl get deployment/nginx-deployment --export -o yaml > nginx_abc.yaml
##验证导出的yaml文件
[root@k8s_master ~]# 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: {}
查看字段帮助信息
使用 kubectl explain命令可以查看yaml文件的字段中可以使用那些信息字段
例如:查看pod资源中spec下的containers下的ports可以使用哪些信息字段
[root@k8s_master ~]# kubectl explain pod.spec.containers.ports
KIND: Pod
VERSION: v1
RESOURCE: ports <[]Object>
DESCRIPTION:
List of ports to expose from the container. Exposing a port here gives the
system additional information about the network connections a container
uses, but is primarily informational. Not specifying a port here DOES NOT
prevent that port from being exposed. Any port which is listening on the
default "0.0.0.0" address inside a container will be accessible from the
network. Cannot be updated.
ContainerPort represents a network port in a single container.
FIELDS:
containerPort <integer> -required-
Number of port to expose on the pod's IP address. This must be a valid port
number, 0 < x < 65536.
hostIP <string>
What host IP to bind the external port to.
hostPort <integer>
Number of port to expose on the host. If specified, this must be a valid
port number, 0 < x < 65536. If HostNetwork is specified, this must match
ContainerPort. Most containers do not need this.
name <string>
If specified, this must be an IANA_SVC_NAME and unique within the pod. Each
named port in a pod must have a unique name. Name for the port that can be
referred to by services.
protocol <string>
Protocol for port. Must be UDP, TCP, or SCTP. Defaults to "TCP".