0
点赞
收藏
分享

微信扫一扫

Kubernetes(三)Pod详解


文章目录

  • ​​Kubernetes(三)Pod详解​​
  • ​​Pod结构​​
  • ​​Pod生命周期​​
  • ​​Pod创建过程​​
  • ​​初始化容器&钩子函数​​
  • ​​容器探测&重启策略​​
  • ​​Pod调度​​

Kubernetes(三)Pod详解

Pod结构

每个Pod中都可以包含一个或多个容器,可以分为两类:

  • 用户应用程序所在的程序,数量可多可少
  • Pause容器,每个Pod都会有一个根容器
  • 监听pod的健康状态
  • 设置ip实现Pod容器通信

Kubernetes(三)Pod详解_重启

Pod生命周期

Pod生命周期是指Pod对象从创建到销毁的时间线范围

  • Pod创建
  • 运行初始化容器
  • 运行主容器
  • 容器启动后执行钩子函数
  • 容器存活性探测,就绪性探测
  • 容器终止前探测
  • 容器终止

Kubernetes(三)Pod详解_初始化_02

在整个生命周期中,Pod会出现5种状态:

  • 挂起(pending):APIServer已经创建了Pod资源对象,但他尚未被调度完成或者仍处于下载镜像的过程中
  • 运行中(Running):Pod已经被调度到某个节点上,并且Pod上所有容器都已经成功创建完成
  • 成功(succeeced):Pod中所有容器都已经被成功终止且不会被重启
  • 失败(Failed):容器终止过程中,存在至少一个容器终止失败。
  • 未知(unknown):apiserver无法正常获取到pod对象的状态信息

Pod创建过程

Kubernetes(三)Pod详解_重启_03

初始化容器&钩子函数

初始化容器主要是做一些主容器的前置工作,在主容器启动之前要运行的容器

  • 初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么k8s会重启直到他成功为止,而且初始化容器严格按照定义顺序执行,当且仅当前一个成功之后,后面一个才能运行

yaml配置实例:

Kubernetes(三)Pod详解_重启_04

钩子函数:

  • 容器启动后钩子函数
  • 容器创建之后执行,如果失败了会重启容器
  • 容器终止前钩子函数
  • 容器终止之前执行,执行成功之后容器将成功终止,在其完成之前会阻塞删除容器的操作

钩子处理器支持三种方式定义:

  • 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部署在同一个拓扑域的问题
  • 亲和性问题:
  • 如果两个应用频繁交互,让这两个应用离得近,减少通信消耗
  • 如果应用采用多副本部署,就让这个应用的实例分离部署,提交服务高可用性
  • 污点和容忍调度:

Kubernetes(三)Pod详解_初始化_05

Kubernetes(三)Pod详解_钩子函数_06


举报

相关推荐

0 条评论