k8s---pod 全生命周期---Init容器、探针、kubelet管理pod、pod的状态status

Pod的全生命周期

pod的生命周期官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/

特点:

  1. 与单个应用程序容器一样,pod被认为是相对短暂(而不是持久)的实体。Pods被创建,分配一个唯一的ID (UID),并调度到节点,直到终止(根据重启策略)或删除。如果一个Node死亡,调度到该节点的pod将在超时时间后被调度删除。
  2. pod本身并不能自我修复。如果某个Pod被调度到某个node后fails,则该Pod会被删除;同样,由于缺乏资源或节点维护,Pod也无法在驱逐中存活下来。Kubernetes使用一种更高层次的抽象,称为controller控制器,它处理管理相对一次性Pod实例的工作。
  3. 一个给定的Pod(由UID定义)永远不会“重新调度”到一个不同的节点;相反,这个Pod可以被一个新的、几乎相同的Pod替换,如果需要,甚至可以使用相同的名称,但使用不同的UID。
  4. 当某些东西被说具有与Pod相同的生存期时,例如volume,这意味着只要特定的Pod(具有确切的UID)存在,该东西就存在。如果由于任何原因删除了Pod,即使创建了相同的替换,相关的东西(本例中为卷)也会被销毁并重新创建。

pod----init容器

  1. pod能够具有多个容器,应用运行在容器里面;但是pod会有一个或多个先于应用容器启动的init容器。
  2. init容器与普通的容器非常像,除了有两点不同:①init容器总是运行到成功完成为止;②每个init容器都必须在下一个init容器启动前完成;
  3. 如果pod的init容器失败,kubernetes会不断的重启该pod,直到init容器成功为止;然而如果pod的restartPolicy参数为never,则不会重新启动;
  4. init容器具有于应用容器分离的单独镜像;

pod运行----探针

pod通过探针来检查容器的健康状态;
LivenessProbe探针:用于判断容器是否健康(而不一定可用,不可用检测不出来)并反馈给kubelet。如果LivenessProbe探针探测到容器不健康,则kubelet将删除该容器,并根据容器的重启策略做相应的处理。如果一个容器不包含LivenessProbe探针,则kubelet认为该容器的LivenessProbe探针返回值永远为Success。
ReadnessProbe探针:用于判断容器是否启动完成,且准备接收请求,接收流量;如果ReadnessProbe探针检测到容器启动失败,则pod的状态将被修改,Endpoint Controller将从Service的Endpoint中删除包含该容器所在pod的ip地址和Endpoint条目

StartupProbe探针:k8s1.16版本以后新加的探针,用于判断容器内应用程序是否已经启动;如果配置了startupProbe 探针,就会先禁止其他探针,直到他成功为止,成功后不再进行探测,

kubelet定期调用容器中的LivenessProbe探针来诊断容器的健康状况;三类探针中每类探针包含以下3种探测方式:

ExecAction:在容器中执行命令,根据返回的状态码判断容器健康状态,返回0即表示成功,否则为失败。
TCPSocketAction: 通过与容器的某TCP端口尝试建立连接进行诊断,端口能打开即为表示成功,否则失败。
HTTPGetAction:向容器指定 URL 发起 HTTP GET 请求,响应码为2xx或者是3xx为成功,否则失败。


kubelet管理pod

借助etcd提供的watch API接口,kubelet通过API server Client 使用list-watch的方式监听"/registory/node/$"当前节点的名称和"/registory/pods"目录将获取信息同步到本地缓存中。
kubelet会监听etcd,所有针对pod的操作都会被kubelet监听,如果发现有绑定到本节点的pod,则按照pod清单的要求创建该pod。
如果发现本地的pod被修改,则kubelet会做出相应的动作;比如监听到删除pod中的某个容器时,会通过docker client 删除容器。
如果发现删除本节点的pod,则删除相应的pod,并通过docker client 删除pod中的容器
如果读取监听到创建和修改pod任务则做如下处理:

  1. 为该pod创建一个数据目录
  2. 从API server读取该pod的清单
  3. 为该pod挂载外部卷(External Volume)
  4. 下载pod用到的Secret
  5. 检查已经运行在节点上的pod,如果该pod没有容器或pause容器没有启动,则先停止pod里所有容器的进程;如果在pod中有需要删除的容器,则删除这些容器
  6. 用"kubernetes/pause"镜像为每个pod创建一个pause容器
  7. 为pod中的每个容器做如下处理:为容器计算一个hash值,然后用容器的名称去查对应docker容器的hash值。若查找到容器,且二者hash值不同则停止docker中容器的进程,并停止与之关联的pause容器;若二者相同则不做任何处理 ,如果容器被终止了,且容器没有指定的restartpolicy(重启策略)则不做任何处理;然后调用docker client 下载容器镜像,调用docker client 运行容器。

pause容器:https://www.cnblogs.com/du-z/p/15944723.html

pod退出流程

pod的退出流程:https://www.cnblogs.com/du-z/p/16198260.html



pod的状态:status

  1. 挂起 (pending) pod已被kubernetes系统接受,但有一个或者多个容器镜像尚未创建;等待时间包括:调度pod的时间和通过网络下载镜像的时间;这可能需要花点时间.
  2. 运行中 (running) 改pod已经绑定到了一个节点上,pod所有的容器都已被创建,至少一个容器在运行或者正处在启动或重启状态
  3. 成功 (Succeed)pod中所有容器都被成功终止,并且不会再重启
  4. 失败 (Failed) pod中的所有的容器都已经终止了,并且至少有一个容器时因为失败终止,也就是说容器已非0状态退出或被系统终止
  5. 未知 (Unknow) 因为某些原因无法获取pod的状态,通常是因为与pod主机通信失败

状态 描述
CrashLoopBackOff 容器退出,kubelet正在将它重启
InvalidImageName 无法解析镜像名称
ImageInspectError 无法校验镜像
ErrImageNeverPull 策略禁止拉取镜像
ImagePullBackOff 正在重试拉取
RegistryUnavailable 连接不到镜像中心
ErrImagePull 通用的拉取镜像出错
CreateContainerConfigError 不能创建kubelet使用的容器配置
CreateContainerError 创建容器失败
m.internalLifecycle.PreStartContainer 执行hook报错
RunContainerError 启动容器失败
PostStartHookError 执行hook报错
ContainersNotInitialized 容器没有初始化完毕
ContainersNotRead 容器没有准备完毕
ContainerCreating 容器创建中
PodInitializing pod初始化中
DockerDaemonNotReady docker还没有完全启动
NetworkPluginNotReady 网络插件还没有完全启动
Evicted 即驱赶的意思,意思是当节点出现异常时,kubernetes将有相应的机制驱赶该节点上的Pod。 多见于资源不足时导致的驱赶。
Terminating 终止容器中
posted @ 2021-08-06 11:24  du-z  阅读(738)  评论(0编辑  收藏  举报