k8s---pod 全生命周期---Init容器、探针、kubelet管理pod、pod的状态status
Pod的全生命周期
pod的生命周期官网:https://kubernetes.io/zh-cn/docs/concepts/workloads/pods/pod-lifecycle/
特点:
- 与单个应用程序容器一样,pod被认为是相对短暂(而不是持久)的实体。Pods被创建,分配一个唯一的ID (UID),并调度到节点,直到终止(根据重启策略)或删除。如果一个Node死亡,调度到该节点的pod将在超时时间后被调度删除。
- pod本身并不能自我修复。如果某个Pod被调度到某个node后fails,则该Pod会被删除;同样,由于缺乏资源或节点维护,Pod也无法在驱逐中存活下来。Kubernetes使用一种更高层次的抽象,称为controller控制器,它处理管理相对一次性Pod实例的工作。
- 一个给定的Pod(由UID定义)永远不会“重新调度”到一个不同的节点;相反,这个Pod可以被一个新的、几乎相同的Pod替换,如果需要,甚至可以使用相同的名称,但使用不同的UID。
- 当某些东西被说具有与Pod相同的生存期时,例如volume,这意味着只要特定的Pod(具有确切的UID)存在,该东西就存在。如果由于任何原因删除了Pod,即使创建了相同的替换,相关的东西(本例中为卷)也会被销毁并重新创建。
pod----init容器
- pod能够具有多个容器,应用运行在容器里面;但是pod会有一个或多个先于应用容器启动的init容器。
- init容器与普通的容器非常像,除了有两点不同:①init容器总是运行到成功完成为止;②每个init容器都必须在下一个init容器启动前完成;
- 如果pod的init容器失败,kubernetes会不断的重启该pod,直到init容器成功为止;然而如果pod的restartPolicy参数为never,则不会重新启动;
- 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任务则做如下处理:
- 为该pod创建一个数据目录
- 从API server读取该pod的清单
- 为该pod挂载外部卷(External Volume)
- 下载pod用到的Secret
- 检查已经运行在节点上的pod,如果该pod没有容器或pause容器没有启动,则先停止pod里所有容器的进程;如果在pod中有需要删除的容器,则删除这些容器
- 用"kubernetes/pause"镜像为每个pod创建一个pause容器
- 为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
- 挂起 (pending) pod已被kubernetes系统接受,但有一个或者多个容器镜像尚未创建;等待时间包括:调度pod的时间和通过网络下载镜像的时间;这可能需要花点时间.
- 运行中 (running) 改pod已经绑定到了一个节点上,pod所有的容器都已被创建,至少一个容器在运行或者正处在启动或重启状态
- 成功 (Succeed)pod中所有容器都被成功终止,并且不会再重启
- 失败 (Failed) pod中的所有的容器都已经终止了,并且至少有一个容器时因为失败终止,也就是说容器已非0状态退出或被系统终止
- 未知 (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 | 终止容器中 |