Kubernetes-Pod详解
pod是k8s中操作的最小单元,pod详解。
目录
一、pod的状态
Pending:API Server 已经创建该 Pod,且 Pod 内还有一个或多个容器的镜像没有创建,包括正在下载镜像的过程。
Running:Pod 内所有容器均已创建,且至少有一个容器处于运行状态、正在启动状态或正在重启状态。
Succeeded:Pod 内所有容器均成功执行退出,且不会重启。
Failed:Pod 内所有容器均已退出,但至少有一个容器退出为失败状态。
Unknown:由于某种原因无法获取该 Pod 状态,可能由于网络通信不畅导致。
terminate:pod 无法删除,可能会出现 terminate 状态,需要强行删除 pod
二、Pod 的创建流程
1、客户端提交 Pod 的配置信息(可以是 yaml 文件定义的信息)到 kube-apiserver。
2、Apiserver 收到指令后,通知给 controller-manager 创建一个资源对象。
3、Controller-manager 通过 api-server 将 pod 的配置信息存储到 ETCD 数据中心中。
4、Kube-scheduler 检测到 pod 信息会开始调度预选,会先过滤掉不符合 Pod 资源配置要求的节点,然后开始调度调优,主要是挑选出 更适合运行 pod 的节点,然后将 pod 的资源配置单发送到 node 节点上的 kubelet 组件上。
5、Kubelet 根据 scheduler 发来的资源配置单运行 pod,运行成功后,将 pod 的运行信息返回给 scheduler,scheduler 将返回的 pod 运行状况的信息存储到 etcd 数据中心
三、pod的生命周期
首先,会启动一个pause容器:
pause容器的功能主要有三个:第一个会挂载可能存在的存储卷,第二个是共享网络栈,如果pod里面有僵尸进程,那么会把他杀死。pause容器启动后,
第二,启动initc容器了,这个initc可以有,也可以没有。initc是线性启动的,只有当前一个initc成功启动之后,下一个initc才会开始启动,并且他是一个阻塞性的行为,我们可以在initc中放一个脚本,检测mysql有没有启动,如果没有启动,那么就不继续运行。第二种是把共享存储挂载到pause容器内部,然后我们的initc可以实现一个共享存储的功能。
第三,initc全部启动成功后,mainc开始启动,这个mainc是我们的主容器,至少要大于等于一个,mainc是并行启动的过程,他里面的端口和容器名是不能冲突的,否则会造成启动失败,首先是我们容器的启动命令,然后是容器初始化,会加载一些系统环境变量,在启动我们的启动后钩子,我们不能保证启动后钩子一定位于启动命令后执行,再就是我们的一些探针(就绪探针,存活探针还有初始化探针),在容器发送关闭命令之前,会执行一个关闭前钩子,会捕获关闭信号来执行一些动作,然后在执行对容器的关闭。
四、Pod 的重启策略
Pod 的重启策略包括 Always、OnFailure 和 Never,默认值为 Always。
Always:当容器失效时,由 kubelet 自动重启该容器;
OnFailure:当容器终止运行且退出码不为 0 时,由 kubelet 自动重启该容器;
Never:不论容器运行状态如何,kubelet 都不会重启该容器。
五、pod的镜像拉取策略
1、IfNotPresent:在镜像已经存在的情况下,kubelet 将不再去拉取镜像,仅当本地缺失时才从仓库中 拉取,默认的镜像拉取策略。
2、Always:每次创建 Pod 都会重新拉取一次镜像。
3、Never:Pod 不会主动拉取这个镜像,仅使用本地镜像。 注意:对于标签为“:latest”的镜像文件(不跟标签默认也为 latest),其默认的镜像获取策略即为“Always”; 而对于其他标签的镜像,其默认策略则为“IfNotPresent”。
六、pod的健康检查方式
对 Pod 的健康检查可以通过两类探针来检查:LivenessProbe 和 ReadinessProbe。
LivenessProbe 探针:用于判断容器是否存活(running 状态),如果 LivenessProbe 探针探测到容器不健康,则 kubelet 将杀掉该 容器,并根据容器的重启策略做相应处理。若一个容器不包含 LivenessProbe 探针,kubelet 认为该容器的 LivenessProbe 探针返回 值用于是“Success”。
ReadineeProbe 探针:用于判断容器是否启动完成(ready 状态)。如果 ReadinessProbe 探针探测到失败,则 Pod 的状态将被修改。 Endpoint Controller 将从 Service 的 Endpoint 中删除包含该容器所在 Pod 的 Eenpoint。
更多推荐
所有评论(0)