Pod 是 Kubernetes 的最小单元,它的信息都记录在一个 YAML 文件里。那么这个 YAML 文件应该怎么写呢?里面有哪些参数?如何修
改 YAML 文件?带着这几个问题,我们来深入了解 YAML 文件。
初学者看到 Kubernetes 的 YAML 配置文件会觉得又长又没规律。
其实,我们可以从两个方面对其进行梳理:第一是找出必选参数,第二是找出主要参数对象。
必选参数
注意,对于 YAML 文件,下面几个参数是必须要声明的,不然运行绝对会出错,YAML 文件参数、字段类型及说明如下表所示。
参数名 | 字段类型 | 说明 |
---|---|---|
version | String | Kubernetes API 的版本,可以用 kubectl api-versions 命令查询。 |
kind | String | 标明 YAML 定义的资源类型和角色,如 Pod 、Deployment 等。 |
metadata | String | 元数据对象。 |
metadata.name | String | 元数据对象的名字,可自定义,比如命名 Pod 的名字。 |
spec | Object | 详细定义对象。 |
spec.containers[] | List | 容器列表定义。 |
spec.containers[].name | String | 定义容器的名字。 |
spec.containers[].image | String | 定义容器使用的镜像。 |
以上这些都是编写 YAML 文件的必选参数,每个 YAML 文件都包含它们。
主要参数对象
上文说的都是必选参数,其他功能的参数,虽然不是必选项,但是可以让 YAML 定义得更详细、功能更丰富。接下来的参数都是 spec
对象下面的,主要分为 spec. containers
和 spec.volumes
。
spec.containers
spec.containers
是一个 List 数组, 它用来描述 container 容器方面的参数,所以包含的参数非常多,如下表所示。
参数名 | 字段类型 | 说明 |
---|---|---|
spec.containers[].name | String | 定义容器的名字。 |
spec.containers[].image | String | 定义容器使用的镜像。 |
spec.containers[].imagePullPolicy | S | 定义镜像拉取策略,有 3 个值可选: (1) Always ,每次都尝试重新拉取镜像;(2) Never ,仅使用本地镜像;(3) IfNotPresent ,如果本地有镜像就使用本地镜像,没有就拉取在线镜像。如果上面 3 个值都没有设置,则默认是 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[].volumeMountsf].readOnly | String | 设置存储卷路径的读写模式,true 或者 false ,默认为读写模式。 |
spec.containers[].ports[] | List | 指定容器需要用到的端口列表。 |
spec.containers[].ports[].name | String | 指定端口名称。 |
spec.containers[].ports[].containerPort | String | 指定容器需要监听的端口号。 |
spec.containers[].ports[].hostPort | String | 指定容器所在主机需要监听的端口号,默认和 spec.containers[].ports[].containerPort 相同。注意,设置了则同一台主机无法启动该容器的相同副本(主机的端口号不能相同,若相同,会引发冲突)。 |
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 命令的参数。 |
spec.containers[].resources.limits.memory | String | 指定内存的限制,单位为 MiB 或 GiB。 |
spec.containers[].resources.requests | Object | 指定容器启动和调度时的限制。 |
spec.containers[].resources.requests.cpu | String | CPU 请求,单位为 core,容器启动时初始化可用数量。 |
spec.containers[].resources.requests.memory | String | 内存请求,单位为 MiB 或 GiB,容器启动的初始化可用数量。 |
spec.containers[].livenessProbe | Object | 指定 Pod 内容器健康检查的设置,当探测几次无响应后,系统将自动重启该容器。参数可以设置为 exec 、httpGet 、tcpSocket 。 |
spec.containers[].livenessProbe.exec | Object | 指定 Pod 内容器健康检查的设置,确定是 exec 方式。 |
spec.containers[].livenessProbe. exec.command[] | String | 指定 exec 方式后用这个参数设置需要指定的命令或者脚本。 |
spec.containers[].livenessProbe.httpGet | Object | 指定 Pod 内容器健康检查的设置,确定是 httpGet 方式。 |
spec.containers[].livenessProbe.tcpSocket | Object | 指定 Pod 内容器健康检查的设置,确定是 tcpSocket 方式。 |
spec.containers[].livenessProbe.initialDelaySeconds | Number | 指定容器启动完成后延迟多久开始首次探测的时间间隔,单位为秒。 |
spec.containers[].livenessProbe.timeoutSeconds | Number | 容器健康检查的探测等待时间,单位为秒,默认为 1 秒。若超过该时间,则认为该次探测失败。 |
spec.containers[].livenessProbe.periodSeconds | Number | 对容器健康检查的定期探测时间设置,单位为秒,默认每 10 秒探测一次。 |
spec.volumes
spec.volumes
是一个 List 数组,很明显,看名字就知道它是用于定义同步存储的参数,包含的参数非常多,如下表所示。
参数名 | 字段类型 | 说明 |
---|---|---|
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 意为私密、秘密,这很容易理解,它存储一些密码、密钥等敏感安全文件。挂载集群预定义的 Secret 对象到容器内部。 |
spec.volumes[].configMap | Object | 指定类型为 ConfigMap 的存储卷,表示挂载集群预定义的 ConfigMap 对象到容器内部。 |
额外的参数对象
除了上面介绍的 spec.containers
和 spec.volumes
两个主要参数,还有几个额外的参数对象,如下表所示。
参数名 | 参数类型 | 说明 |
---|---|---|
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 | 定义节点的过滤标签(以 key:value 格式指定)。 |
spec.imagePullSecrets | List | 定义拉取镜像时使用 Secret 名称(以 name:secretkey 格式指定)。 |
spec.hostNetwork | Boolean | 定义是否使用主机网络模式,默认值为 false 。 设置 true 表示使用宿主机网络,不使用 Docker 网桥,同时设置了 true 将无法在同一台宿主机上启动第二个副本。 |
YAML 里的这些参数其实是 Kubernetes 声明式的一种体现,我们可以简单地把它理解为用户操作 Kubernetes 的一个接口。YAML 里设置的参数数值,最终都会持久化到 ETCD 里。
评论区