文章目录
- Kubernetes(三)Pod详解
- Pod结构
- Pod生命周期
- Pod创建过程
- 初始化容器&钩子函数
- 容器探测&重启策略
- Pod调度
Kubernetes(三)Pod详解
Pod结构
每个Pod中都可以包含一个或多个容器,可以分为两类:
- 用户应用程序所在的程序,数量可多可少
- Pause容器,每个Pod都会有一个根容器
- 监听pod的健康状态
- 设置ip实现Pod容器通信
Pod生命周期
Pod生命周期是指Pod对象从创建到销毁的时间线范围
- Pod创建
- 运行初始化容器
- 运行主容器
- 容器启动后执行钩子函数
- 容器存活性探测,就绪性探测
- 容器终止前探测
- 容器终止
在整个生命周期中,Pod会出现5种状态:
- 挂起(pending):APIServer已经创建了Pod资源对象,但他尚未被调度完成或者仍处于下载镜像的过程中
- 运行中(Running):Pod已经被调度到某个节点上,并且Pod上所有容器都已经成功创建完成
- 成功(succeeced):Pod中所有容器都已经被成功终止且不会被重启
- 失败(Failed):容器终止过程中,存在至少一个容器终止失败。
- 未知(unknown):apiserver无法正常获取到pod对象的状态信息
Pod创建过程
初始化容器&钩子函数
初始化容器主要是做一些主容器的前置工作,在主容器启动之前要运行的容器
- 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么k8s会重启直到他成功为止,而且初始化容器严格按照定义顺序执行,当且仅当前一个成功之后,后面一个才能运行
yaml配置实例:
钩子函数:
- 容器启动后钩子函数
- 容器创建之后执行,如果失败了会重启容器
- 容器终止前钩子函数
- 容器终止之前执行,执行成功之后容器将成功终止,在其完成之前会阻塞删除容器的操作
钩子处理器支持三种方式定义:
- Exec,在容器内执行一次命令
lifecycle:
poststart:
exec:
command: // 是一个数组,数组连起来就是完整命令
-
-
- TCPSocket,在当前容器内访问指定的socket
lifecycle:
poststart:
tcpsocket:
port: // 端口号
- HTTPGet:在当前容器内发起指定Http请求
lifecycle:
poststart:
httpget:
path: // uri
port: // 端口号
host: // ip
scheme: // 协议
容器探测&重启策略
容器探测是检测容器内的实例是否正常工作,用于保证业务稳定性。
如果经过探测,容器实例状态不符合预期,k8s就会将该实例摘除
- livenessProbe 存活性探针:检测当前应用实例是否处于正常运行状态
- 决定是否重启容器
- readlnessProbe 就绪性探针:检测当前应用实例是否能正常接收请求
- 决定是否将请求转发给容器
具体配置和钩子函数差不多,lifecycle改为livenessProbe或者readlnessProbe,同样具备exec,TCPSocket,HttpGet三种方式
Pod具有三种重启策略:
- Always:容器失效时,自动重启容器
- OnFailure:容器终止运行且退出码不为0时重启
- Never:不论如何,从不重启容器
容器重启采用阶梯式重启原则,每次重启完后,会延长一定时间再重启
Pod调度
K8s提供了4种调度策略:
- 自动调度,取决于scheduler组件调度算法
- 定向调度,在Pod上声明NodeName或者NodeSelector,以此将Pod调度到期望的Pod上
- 亲和性调度:在NodeSelector上进行了扩展,优先选择满足条件的Node进行调度,如果没有也会调度到不满足条件的Node上
- nodeAffinity(Node亲和性):以Node为目标,解决Pod可以调度到哪些Node的问题
- podAffinity(pod亲和性):以pod为目标,解决pod可以和哪些已存在的pod部署在同一个拓扑域的问题
- podAntiAffinity(pod反亲和性):以pod为目标,解决pod不可以和哪些已存在的pod部署在同一个拓扑域的问题
- 亲和性问题:
- 如果两个应用频繁交互,让这两个应用离得近,减少通信消耗
- 如果应用采用多副本部署,就让这个应用的实例分离部署,提交服务高可用性
- 污点和容忍调度: