kubernetes中pod的生命周期

摘要

Kubernetes是在主机上运行的并且协同容器化应用程序的系统,提供了应用的部署、规划、更新维护机制。应用容器部署在Kubernetes集群之上。Kubernetes实现管理服务的各项功能是通过定义各种类型的资源来实现的。如deployment、pod、service、volume等。以下讲述了了pod的基础信息以及pod的生命周期。

Pod简介

Pod是kubernetes集群的基础单元,是由用户创建及部署的最小单元,也是kubernetes上运行容器化应用的资源对象。Kubernetes集群中所有的资源都是服务于pod这个资源对象来实现kubernetes的管理应用服务的目的。

Kubernetes集群主要组件包括master节点组件API Server、Controller Manager、Scheduler、etcd、网络组件以及node节点组件kubelet、docker、kube-proxy、网络组件等。从集群各组件的交互来看pod的创建、运行、销毁等生命周期,Pod的生命中存在的几种不同的状态包括:pending、running、succeeded、failed、Unknown。

与API的交互过程

API Server提供了集群与外部交互的接口,通过kubectl命令行以及其他api客户端或者是api的CMDB集成管理平台提交pod spec 给API Server作为pod创建的开始。

Pod与API Server的主要交互流程如下:
1、API Server接受到创建pod的请求后,会根据用户提交的创建参数来创建一个运行时的pod对象
2、根据API Server请求的元数据来验证两者的namespace是否匹配,如果不匹配则创建失败
3、Namespace匹配成功后,会向pod对象注入一些系统数据,如果pod对象未提供pod的名字,则API Server会将pod的uuid作为pod的名字
4、接下来API Server会检测pod对象的必须字段是否为空,如果为空,则创建失败
5、在上述准备和创建工作完成后,将在etcd中持久化这个对象,将异步调用返回结果封装成restful.response进行结果的反馈
6、到此时,API Server创建的过程完成,剩下的由scheduler和kubelet来完成,此时的pod状态为pending状态

与scheduler的交互过程

当提交创建pod的请求与API Server交互完成后,接下来有scheduler来进行工作,scheduler组件的功能主要是完成pod的调度决定pod具体运行在集群的哪个节点上。注:在API Server完成自己的任务后,将信息写入到etcd中,此时scheduler通过watch机制监听到写入到etcd中的信息后在进行工作

Scheduler读取写入到etcd中的pod信息,然后基于一系列的算法规则从集群中挑选一个节点来运行pod,调度时主要有以下过程来确定合适的node:
1、节点预选:基于一系列的的预选规则,例如PodFitsResource或者是MatchNode-selector等等,对每个节点进行检查,将不符合创建pod的节点过滤掉完成节点的预选
2、节点优选:对预选出来的节点进行优先级排序,以便与选出最适合创建和运行pod的节点
3、从优先级排序结果中挑选出优先级最高的节点来运行pod对象,当优先级节点相同时可以随机进行一个的挑选
注:如果有特殊的pod资源需要运行在特殊的节点或者是选定的节点上,此时可以通过组合节点标签以及pod标签和标签选择器来实现高级调度,例如MatchNodeSelector、MatchInterPodAffinity和PodToleratesNodeTaints等预选策略,他们为用户提供自定义pod亲和性或反亲和性、节点亲和性以及基于污点及容忍度的调度机制

当scheduler通过一系列的策略的选定pod创建和运行的节点之后将结果信息更新到API Server,再由API Server更新到etcd中,并且由API Server反映调度结果,接下来由kubelet在选定的节点上启动pod

Kubelet启动pod

Kubelet组件的作用不只是创建pod,另外还包括节点的管理、cAdvisor资源监控管理、容器健康检查等功能

启动pod的流程分析

kubelet通过API Server监听etcd目录,同步pod列表。如果发现有新的pod被绑定到该节点,则按照pod清单要求创建pod,如果发现是pod被更新,则做出相应的更改。

读取到pod信息之后,如果是创建和修改pod的任务,则做出如下处理:
1、为该pod创建一个数据目录
2、从API Server中读取该pod的清单
3、为该pod挂载外部卷
4、下载pod所需的Secret
5、检查已经运行在节点中的pod,如果该pod没有容器或者pause容器没有启动,则先停止pod里面的所有容器进程
6、使用pause镜像为每个pod创建一个容器,该容器用于接管pod中所有其他容器的网络
7、为pod中的每个容器做下面的处理:①为容器计算一个hash值,然后通过容器的名字去查询对于docker容器的hash值,若查到容器,且两者的hash值不同,则停止docker中的容器进程,并停止与之相关的pause容器,若相同,则不做任何处理,如果容器被停止了,且容器没有相应的重启策略,则不做任何处理调用docker client下载容器镜像,并重启容器
注:pause容器是什么
Docker支持以containers的方式部署软件,container也非常适合用来
部署单个软件。但是,当我们想一起运行一个软件的多个模块的时
候,这种方式又会变得非常的笨重。我们会常常遇到这种情况,当开
发人员创建了多个docker镜像后,还需要使用监控模块去启动和管理
多个进程。在生产环境下,会发现如果把这些应用部署为一组容器,
并将这些容器组彼此分隔,每个容器组共享一个环境,这种方式会更
有效。原则上,任何人只需要创建一个父容器就可以配置docker来管
理容器组之间的共享问题。这个父容器需要能够准确的知道如何去创
建共享运行环境的容器,还能管理这些容器的生命周期。为了实现这
个父容器的构想,kubernetes中,用pause容器来作为一个pod中所有
容器的父容器。这个pause容器有两个核心的功能,第一,它提供整
个pod的Linux命名空间的基础。第二,启用PID命名空间,它在每个
pod中都作为PID为1进程,并回收僵尸进程。

容器生命周期内的几种行为

初始化容器

初始化容器即pod主容器启动之前要运行的容器,主要是做一些前置工作,初始化容器具有下面的特征:
1、初始化容器必须首先执行,如果初始化容器失败,集群会一直重启初始化容器直至完成。如果pod的重启策略为Nerver,那初始化容器启动失败就不会再重启
2、初始化容器必须按照定义的顺序执行,初始化容器可以通过pod的spec.initcontainers进行定义

生命周期钩子函数

kubernetes为容器提供了两种生命周期钩子:

  • Poststart:在容器创建完成后立即运行的钩子程序该钩子在容器被创建后立刻触发,通知容器它已经被创建。该钩子不需要向其所对应的hook handler传人任何参数。如果该钩子对应的hook handler执行失败,则该容器会被杀死,并根据该容器的重启策略决定是否要重启该容器
  • preStop:容器终止之前立即运行的程序,是以同步方程式进行,因其完成之前会阻塞,删除容器的调用。该钩子在容器被删除前触发,其所对应的hook handler必须在删除该容器的请求发送给Docker daemon之前完成。在该钩子对应的hook handler完成后不论执行的结果如何,Docker daemon会发送一个SGTERN信号量给Docker daemon来删除该容器。同样地。该钩子也不需要传人任何参数
    注:钩子程序的执行方式有“Exec”和“HTTP”两种

容器探测

容器探测分为存活性探测和就绪性探测,容器探测是kubelet对容器健康状态进行诊断,容器探测的方式主要有以下三种:
1、ExecAction:在容器中执行命令,根据返回的状态码判断容器的健康状态,返回0表示执行成功,否则为执行失败
2、TCPSocketAction:通过与容器的某TCP端口尝试建立连接进行诊断,端口能打开就表示成功,否则为失败
3、HTTPGetAction:向容器制定URL发起HTTP GET的请求,响应码为2XX或者是3XX为成功,否则为失败

Pod终止过程

pod的终止过程主要分为以下几个步骤:
1、用户发出删除pod的命令
2、pod对象随着时间的推移更新,在宽周期(默认为30s),pod被标记为"dead"状态
3、将pod标记为"Terminating"状态
4、与第3步同时运行,监控到pod对象为"Terminating"状态的同时启动pod关闭过程
5、与第3步同时运行,endpoints控制器监控到pod对象关闭,将pod与service匹配的endpoints从列表中删除
6、如果pod定义了preStop钩子处理程序,则pod被标记为"Terminating"状态以同步的方式启动执行;如果宽限期结束后,preStop仍未执行结束,第二步会重新执行并额外获得2s的小宽限周期
7、pod内对象的容器收到TERM信号
8、宽限期结束后,若存在一个运行的进程,pod会收到SIGKILL信号
9、kubelet请求API Server将此pod资源宽限期设置为0从而彻底完成删除操作

kubelet除了启动之外,kubelet中还有cAdvisor用于收集容器的CPU、内存、文件系统和网络使用状况等信息,与prometheus结合实现对集群内的pod监控

除了以上三个组件在创建pod的过程中有交互,还有controller-manager来保证pod处于用户期望状态(active状态)等功能以及proxy用于集群内pod之前的通信等等

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值