Kubernetes-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。

你可能感兴趣的:(Kubernetes,kubernetes,容器,云原生,linux)