1.什么是Pod?
Pod是在Kubernetes系统中创建、调度和管理的最小单位。其他的大多数资源对象都是用于支撑和扩展Pod
对象功能的,例如:
- 用于管控
Pod
运行的StatefulSet
和Deployment
等控制器对象, - 用于暴露
Pod
应用的Service
和Ingress
对象。 - 为
Pod
提供存储的PersistentVolume
存储资源对象。
2. Pod基本操作
2.1 创建
|
2.2 查询
|
2.3 更多详情
|
2.4 删除
|
3. Pod生命周期
3.1 周期示意图
Pod
对象自从其创建开始至其终止退出的时间范围称为其生命周期,典型的Pod生命周期是这样的:
- 用户定义一个
YAML
格式的清单文件,并将其POST
到API Server
。一旦发送成功,清单文件中的内容就被作为一条意图记录(a record of intent
)——即“期望状态”(desired
)——持久化记录在集群存储中, - 然后
Pod
被调度到一个健康的、有充足资源的节点上。一旦完成调度,就会进入等待状态(pending
),此时节点会下载镜像并启动容器。 - 在所有资源就绪前,
Pod
的状态都保持在等待状态。一切就绪后,Pod
进入运行状态(running
)。 - 在完成所有任务后,会停止并进入成功状态(
succeeded
)。
3.2 状态说明
Pending(等待)
:API Server
创建了Pod
资源对象并已存入etcd
中,但它尚未被调度完成,或者仍处于从仓库下载镜像的过程中。Running(运行)
:Pod
已经被调度至某节点,并且所有容器都已经被kubelet创建完成。Succeeded(成功)
:Pod
中的所有容器都已经成功终止并且不会被重启。Failed(失败)
: 所有容器都已经终止,但至少有一个容器终止失败,即容器返回了非0值的退出状态或已经被系统终止。Unknown(未知)
:API Server
无法正常获取到Pod
对象的状态信息,通常是由于其无法与所在工作节点的kubelet
通信所致。
4. Pod创建和终止
4.1 Pod
创建过程
Pod
是Kubernetes
的基础单元,理解它的创建过程对于了解系统运作大有裨益。下图描述了一个Pod
资源对象的典型创建过程。
创建流程描述:
- 用户通过
kubectl
或其他API
客户端提交Pod Spec
给API Server
。 API Server
尝试着将Pod
对象的相关信息存入etcd
中,待写入操作执行完成,API Server
即会返回确认信息至客户端。API Server
开始反映etcd
中的状态变化。- 所有的
Kubernetes
组件均使用watch
机制来跟踪检查API Server
上的相关的变动。 kube-scheduler
(调度器)通过其watcher
觉察到API Server
创建了新的Pod
对象但尚未绑定至任何工作节点。kube-scheduler
为Pod
对象挑选一个工作节点并将结果信息更新至API Server
。- 调度结果信息由
API Server
更新至etcd
存储系统,而且API Server
也开始反映此Pod
对象的调度结果。 Pod
所在工作节点上的kubelet
尝试在调用Docker
启动容器,并将容器的结果状态回送至API Server
。API Server
将Pod
状态信息存入etcd
系统中。- 在
etcd
确认写入操作成功完成后,API Server
将确认信息发送至相关的kubelet
,事件将通过它被接受。
4.2 Pod的终止过程
Pod
对象代表了在Kubernetes
集群节点上运行的进程,它可能曾用于处理生产数据或向用户提供服务等,当Pod
本身不再具有存在的价值时,如何将其优雅地终止呢?
终止流程描述:
用户发送删除
Pod
对象的命令。API Server
中的Pod
对象会随着时间的推移而更新,在宽限期内(默认为30秒)Pod
被视为dead
。将
Pod
标记为Terminating
状态。kubelet
在监控到Pod
对象转为Terminating
状态的同时,启动Pod
关闭过程。端点控制器监控到
Pod
对象的关闭行为时,将其从所有匹配到此端点的Service
资源的端点列表中移除。
如果当前
Pod
对象定义了preStop
钩子处理器,则在其标记为terminating
后即会以同步的方式启动执行;如若宽限期结束后,preStop
仍未执行结束,则第2步会被重新执行并额外获取一个时长为2秒的小宽限期。Pod
对象中的容器进程收到TERM
信号。宽限期结束后,若存在任何一个仍在运行的进程,那么
Pod
对象即会收到SIGKILL
信号。Kubelet
请求API Server
将此Pod
资源的宽限期设置为0
从而完成删除操作,它变得对用户不再可见。
默认情况下,所有删除操作的宽限期都是30秒,不过,
kubectl delete
命令可以使用--grace-period=<seconds>
选项自定义其时长,若使用0值则表示直接强制删除指定的资源,不过,此时需要同时为命令使用--force
选项。
5. Pod主要配置说明
虽然配置清单(yaml)中的字段有很多,但并不是所有的都要写,循序渐进,慢慢熟悉~
5.1 配置清单
|
5.2 imagePullPolicy(镜像获取策略)
容器的imagePullPolicy
字段用于为其指定镜像获取策略,它的可用值包括如下几个:
Always
: 镜像标签为latest
或镜像不存在时总是从指定的仓库中获取镜像。Never
: 禁止从仓库下载镜像,即仅使用本地镜像。IfNotPresent
: 仅当本地镜像缺失时,才从目标仓库下载镜像
5.3 restartPolicy(Pod的重启策略)
Always
: 表示容器失效时,由kubelet
自动重启该容器。OnFailure
: 表示容器终止运行且退出码不为0
时,由kubelet
自动重启该容器。Nerver
:表示不论容器运行状态如何,kubelet
都不会重启该容器。
需要注意的是,
restartPolicy
适用于Pod
对象中的所有容器,而且它仅用于控制在同一节点上重新启动Pod
对象的相关容器。
首次需要重启的容器,将在其需要时立即进行重启,随后再次需要重启的操作将由kubelet
延迟一段时间后进行,且反复的重启操作的延迟时长依次为10秒、20秒、40秒、80秒、160秒和300秒,300秒是最大延迟时长。
事实上,一旦绑定到一个节点,Pod
对象将永远不会被重新绑定到另一个节点,它要么被重启,要么终止,直到节点发生故障或被删除。