Pod生命周期中的重要行为

除了创建应用容器(主容器及其辅助容器)之外,用户还可以为Pod对象定义其生命周期中的多种行为,如初始化容器、存活性探测及就绪性探测等。

初始化容器

初始化容器 (init container)即应用程序的主容器启动之前要运行的容器,常用于为主容器执行一些预置操作,它们具有两种典型特征。

1)初始化容器必须运行完成直至结束,若某初始化容器运行失败,那么Kubernetes需要重启亡直到成功完成。

2)每个初始化容器都必须按定义的顺序串行运行。

注意:如果Pod的spec.restartPolicy字段值为 “Never”,那么运行失败的初始化容器不会被重启。

有不少场景都需要在应用容器启动之前进行部分初始化操作,例如等待其他关联组件服务可用、基于环境变量或配置模板为应用程序生成配置文件、从配置中心获取配置等。

初始化容器的典型应用需求具体包含如下几种。

1)用于运行特定的工具程序,出于安全等方面的原因,这些程序不适于包含在主容器镜像中。

2)提供主容器镜像中不具备的工具程序或自定义代码。

3)为容器镜像的构建和部署人员提供了分离、独立工作的途径,使得他们不必协同起来制作单个镜像文件。

4)初始化容器和主容器处于不同的文件系统视图中,因此可以分别安全地使用敏感数据,例如Secrets资源。

5)初始化容器要先于应用容器串行启动并运行完成,因此可用于延后应用容器的启动直至其依赖的条件得到满足。

Pod资源的“spec.initContainers”字段以列表的形式定义可用的初始容器,其嵌套可用字段类似于“spec.containers”。下面的资源清单仅是一个初始化容器的使用示例,大家可自自行创建并观察初始化容器的相关状态:

apiVersion: v1
Kind: Pod
metadata:
name: myapp-pod
labels:
app: myapp
spec:
containers:
- name: myapp-container
image: ikubernetes/myapp
initContainers:
- name: init-something
image: busybox
command: ['sh', -C', 'sleep 10']

  

生命周期钩子函数

生命周期钩子函数(lifecycle hook)是编程语言(如Angular)中常用的生命周期管理的组件,它实现了程序运行周期中的关键时刻的可见性,并赋于用户为此采取某种行动的能力。类似地,容器生命周期钩子使它能够感知其自身生命周期管理中的事件,并在相应的时刻到来时运行由用户指定的处理程序代码。Kubernetes为容器提供了两种生命周期钩子。

  • postStart:于容器创建完成之后立即运行的钩子处理器(handler)不过Kubernetes无法确保它一定会于容器中的ENTRYPOINT之前运行。

  • preStop:于容器级止操作之前立即运行的钩子处理器,它以同步的方式调用,因此在其完成之前会阻塞删除容器的操作的调用。

钩子处理器的实现方式有“Exec”和“HTTP”两种,前一种在钩子事件触发时直接在当前容器中运行由用户定义的命令,后一种则是在当前容器中向某URL发起HTTP请求。

postStart和preStop处理器定义在容器的spec.lifecycle嵌套字段中,其使用方法如下面的资源清单所示,大家可自行创建相关的Pod资源对象,并验证其执行结果:

apiversion: v1
kind: Pod
metadata:
name: lifecycle-demo
spec:
containers:
- name: lifecycle-demo-container
image: ikubernetes/myapp:v1
lifecycle:
poststart:
exec:
command: ["/bin/sh", "-c", "echo 'lifecycle hooks handler' > /usr/share/
nginx/html/test.html"]

  

容器探测

容器探测(container probe)是Pod对象生命周期中的一项重要的日常任务,它是kubelet对容器周期性执行的健康状态诊断,诊断操作由容器的处理器(handler)进行定义。

Kubernetes支持三种处理器用于Pod探测。

  • ExecAction:在容器中执行一个命令,并根据其返回的状态码进行诊断的操作称为Exec探测,状态码为0表示成功,否则即为不健康状态。

  • TCPSocketAction:通过与容器的某TCP端口尝试建立连接进行诊断,端口能够成功打开即为正常,否则为不健康状态。

  • HTTPGetAction:通过向容器IP地址的某指定端口的指定path发起HTTP GET请求进行诊断,响应码为2xx或3xx时即为成功,否则为失败。

任何一种探测方式都可能存在三种结果: “Success”(成功)、“Failure”(失败)或“Unknown”(未知),只有第一种结果表示成功通过检测。

kubelet可在活动容器上执行两种类型的检测:存活性检测(livenessProbe)和就绪性检测(readinessProbe)。

  • 存活性检测:用于判定容器是否处于“运行”(Running)状态;一旦此类检测未通过,kubelet将杀死容器并根据其restartPolicy决定是否将其重启;未定义存活性检测的容器的默认状态为“Success”。

  • 就绪性检测:用于判断容器是否准备就绪并可对外提供服务;未通过检测的容器意味着其尚未准备就绪,端点控制器(如Service对象)会将其IP从所有匹配到此Pod对象的Service对象的端点列表中移除;检测通过之后,会再次将其IP添加至端点列表中。

提示:存活性检测和就绪性检测在之后我会做再进一步的介绍~

最新文章

  1. eclipse maven插件问题:error occurred while automatically activating bundle org.eclipse.m2e.core.ui (525)
  2. GaugeControl 数字时钟,温度计,仪表盘
  3. django template
  4. 配置jdk
  5. View (二) 自定义属性
  6. .NET获取不到js写的cookie解决方法
  7. 使用python + tornado 做项目demo演示模板
  8. 基于ant的jmeter自动化性能测试
  9. android 开发解密时出现pad block corrupted 错误
  10. MVC中Controller和Action讲解上篇
  11. ActionScript:Resampling PCM data
  12. OAuth2.0开发指南
  13. python添加自定义cookies
  14. 函数后面的const修饰符的作用
  15. 【移动端】解决fixed定位闪动问题
  16. Sublime_SideBarEnhancements
  17. 【转】Eclipse 乱码 解决方案总结(UTF8 -- GBK)
  18. Django项目的创建和设计模式
  19. vue-i18n
  20. Oracle 修改用户名

热门文章

  1. 10月26日内容总结——第三方模块下载与requests、openpyxl模块
  2. Docker修改已有容器的端口映射
  3. Nginx06 Rewrite
  4. JAVA虚拟机05-内存溢出示例(jdk1.8)
  5. CRT 与 exCRT
  6. 流量加密之:MSF流量加密
  7. .net 移动mas短信接口开发
  8. LeetCode-794 有效的井字游戏
  9. 【C++复习】运算符重载中的特殊运算符
  10. 97、UserAgentUtils