1、YAML 文件概述
k8s 集群中对资源管理和资源对象编排部署都可以通过声明样式(YAML)文件来解决,也 就是可以把需要对资源对象操作编辑到 YAML 格式文件中,我们把这种文件叫做资源清单文 件,通过 kubectl 命令直接使用资源清单文件就可以实现对大量的资源对象进行编排部署了。
2.YAML 文件书写格式
2.1 YAML 介绍
YAML 仍是一种标记语言。为了强调这种语言以数据做为中心,而不是以标记语言为重点。 YAML 是一个可读性高,用来表达数据序列的格式。
2.2 YAML 基本语法
- 使用空格做为缩进
- 缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
- 低版本缩进时不允许使用 Tab 键,只允许使用空格
- 使用#标识注释,从这个字符一直到行尾,都会被解释器忽略
2.3 YAML 支持的数据结构
-
对象
键值对的集合,又称为映射(mapping) / 哈希(hashes) /字典(dictionary)
# 对象类型:对象的一组键值对,使用冒号结构表示 name: 向北 age: 18 gender: male # Yaml也允许另一种写法,将所有键值对写成一个行内对象 hash: {name: 向南, age: 18, gender: female} -
数组:
一组按次序排列的值,又称之为序列(sequence) / 列表 (list)
# 数组类型:一组连词线开头的行,构成一个数组
people
- Tom
- Jack
# 数组也可以采用行内表示法
people: [Tom,Jack]
- 纯量(scalars)
单个的、不可再分的值
# 数值直接以字面量的形式表示
number: 10.24
# 布尔值用true和false表示
isAnble: true
# null用~表示
length: ~
# 时间采用ISO8601 格式
iso8601: 2020-12-26t15:16:34.10-05:00
# 日期采用复合iso8601格式的年、月、日表示
date: 2020-12-26
3. 资源清单描述方法
(1)在 k8s 中,一般使用 YAML 格式的文件来创建符合我们预期期望的 pod,这样的 YAML 文件称为资源清单。
(2)常用字段
必须存在的属性
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| version | String | k8s API的版本,可使用kubectl api-sersion命令查询 |
| kind | String | 这里指定k8s资源的类型,比如Pod |
| matedata | Object | 元数据对象,固定写值matedata |
| matedata-name | String | 元数据对象的名字,比如命名pod的名字 |
| matedata-namespace | String | 元数据对象的命名空间 |
| Spec | Object | 详细定义对象,固定值写Spec |
| spec.container[] | list | spec对象的容器列表定义 |
| spec.container[].name | String | 容器对象的名字 |
| spec.container[].image | String | 定义要用到的对象名称 |
spec主要对象
spec.containers
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| spec.containers[].name | String | 定义容器的名字 |
| spec.containers[].image | String | 定义要用到的镜像名称 |
| spec.containers[].imagePullPolicy | String | 定义镜像拉取策略,有Always、Never、IfNotPresent三个值可选(1)Always:意思是每次都尝试重新拉取镜像 (2)Never:表示仅使用本地镜像 (3)IfNotPresent:如果本地有镜像就使用本地镜像,没有就拉取在线镜像。 上面三个值都没设置的话,默认是Always。 |
| spec.containers[].command[] | List | 指定容器启动命令,因为是数组可以指定多个,不指定则使用镜像打包时使用的启动命令。 |
| spec.containers[].args[] | List | 指定容器启动命令参数,因为是数组可以指定多个。 |
| spec.containers[].workingDir | String | 指定容器的工作目录 |
| spec.containers[].volumeMounts[] | List | 指定容器内部的存储卷配置 |
| spec.containers[].volumeMounts[].name | String | 指定可以被容器挂载的存储卷的名称 |
| spec.containers[].volumeMounts[].mountPath | String | 指定可以被容器挂载的存储卷的路径 |
| spec.containers[].volumeMounts[].readOnly | String | 设置存储卷路径的读写模式,ture 或者false,默认为读写模式 |
| spec.containers[].ports[] | List | 指定容器需要用到的端口列表 |
| spec.containers[].ports[].name | String | 指定端口名称 |
| spec.containers[].ports[].containerPort | String | 指定容器需要监听的端口号 |
| spec.containers[].ports[].hostPort | String | 指定容器所在主机需要监听的端口号,默认跟上面containerPort相同,注意设置了hostPort 同一台主机无法启动该容器的相同副本(因为主机的端口号不能相同,这样会冲突) |
| spec.containers[].ports[].protocol | String | 指定端口协议,支持TCP和UDP,默认值为TCP |
| spec.containers[].env[] | List | 指定容器运行前需设置的环境变量列表 |
| spec.containers[].env[].name | String | 指定环境变量名称 |
| spec.containers[].env[].value | String | 指定环境变量值 |
| spec.containers[].resources | Object | 指定资源限制和资源请求的值(这里开始就是设置容器的资源上限) |
| spec.containers[].resources.limits | Object | 指定设置容器运行时资源的运行上限 |
| spec.containers[].resources.limits.cpu | String | 指定CPU的限制,单位为core数,将用于 docker run --cpu-shares参数(这里前面文章Pod资源限制有讲过) |
| spec.containers[].resources.limits.memory | String | 指定MEM内存的限制,单位为MIB、GiB |
| spec.containers[].resources.requests | Object | 指定容器启动和调度时的限制设置 |
| spec.containers[].resources.requests.cpu | String | CPU请求,单位为core数,容器启动时初始化可用数量 |
| spec.containers[].resources.requests.memory | String | 内存请求,单位为MIB、GiB,容器启动的初始化可用数量 |
spec.volumes
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| spec.volumes[].name | String | 定义Pod的共享存储卷的名称,容器定义部分的spec.containers[].volumeMounts[].name的值跟这里是一样的。 |
| spec.volumes[].emptyDir | Object | 指定Pod的临时目录,值为一个空对象:emptyDir:{} |
| spec.volumes[].hostPath | Object | 指定挂载Pod所在宿主机的目录 |
| spec.volumes[].hostPath.path | String | 指定Pod所在主机的目录,将被用于容器中mount的目录 |
| spec.volumes[].secret | Object | 指定类型为secret的存储卷,secret意为私密、秘密的意思,很容易理解,它存储一些密码,token或者秘钥等敏感安全文件。挂载集群预定义的secret对象到容器内部。 |
| spec.volumes[].configMap | Object | 指定类型为configMap的存储卷,表示挂载集群预定义的configMap对象到容器内部。 |
| spec.volumes[].livenessProbe | Object | 指定Pod内容器健康检查的设置,当探测无响应几次后,系统将自动重启该容器。这个在前面的文章中有说,具体可以设置:exec、httpGet、tcpSocket。 |
| spec.volumes[].livenessProbe.exec | Object | 指定Pod内容器健康检查的设置,确定是exec方式 |
| spec.volumes[].livenessProbe.exec.command[] | String | 指定exec方式后需要指定命令或者脚本,用这个参数设置 |
| spec.volumes[].livenessProbe.httpGet | Object | 指定Pod内容器健康检查的设置,确定是httpGet方式 |
| spec.volumes[].livenessProbe.tcpSocket | Object | 指定Pod内容器健康检查的设置,确定是tcpSocket方式 |
| spec.volumes[].livenessProbe.initialDelaySeconds | Number | 容器启动完成后手册探测的时间设置,单位为s |
| spec.volumes[].livenessProbe.timeoutSeconds | Number | 对容器健康检查的探测等待响应的超时时间设置,单位为S,默认为1s。若超过该超时时间设置,则认为该容器不健康,会重启该容器。 |
| spec.volumes[].livenessProbe.periodSeconds | Number | 对容器健康检查的定期探测时间设置,单位为S,默认10s探测一次。 |
额外参数
| 参数名 | 字段类型 | 说明 |
|---|---|---|
| spec.restartPolicy | String | 定义Pod的重启策略,可选值为Always、OnFailure,默认值为Always。 1.Always:Pod一旦终止运行,则无论容器是如何终止的,kubelet服务都将重启它。 2.OnFailure:只有Pod以非零退出码终止时,kubelet才会重启该容器。如果容器正常结束(退出码为0),则kubelet将不会重启它。 3. Never:Pod终止后,kubelet将退出码报告给Master,不会重启该Pod。 |
| spec.nodeSelector | Object | 定义Node的Label过滤标签,以key:value格式指定 |
| spec.imagePullSecrets | Object | 定义pull镜像时使用secret名称,以name:secretkey格式指定 |
| spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为false。设置true表示使用宿主机网络,不使用docker网桥,同时设置了true将无法在同一台宿主机上启动第二个副本。 |
一个简单的例子
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginxdeployment
spec:
selector:
matchLabels:
app: nginx
replicas: 2
template:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
通过上述yaml文件创建一个Deployment资源
查看deployment详情
查看pod
查看pod详情