深入Pod —— 生命周期 及 PreStop事件的应用

图片描述

一、生命周期

lifecycle:
  postStart: # 容创建完成后执行的动作,不能保证该操作一定在容器的 command 之前执行,一般不使用
    exec: # 可以是 exec / httpGet / tcpSocket
      command:
        - sh
        - -c
        - 'mkdir /data'
  preStop: # 在容器停止前执行的动作
    httpGet: # 发送一个 http 请求
      path: /
      port: 80
    exec: # 执行一个命令
      command:
        - sh
        - -c
        - sleep 9

二、流程

1、容器环境初始化阶段

0个或多个初始化容器来帮我们进行初始化,只能初始化容器执行完了才算初始化完成

2、钩子回调函数

postStart(),启动之前需要做什么,注意:一般不用这个,因为可能 容器中的command 和 postStart() 执行顺序无法保证,工作中如果启动前要做什么,就直接用初始化容器

3、Pod内的主容器

3.1、Startup 启动探针(最开始监控)
3.2、Readiness 就绪探针(最开始监控),启动成功就绪
3.3、Liveness 存活探针(持续监控),如果当前容器挂掉了,根据重启策略决定是否需要重启

4、钩子回调函数

preStop(),容器退出之前需要做什么,如:销毁,日志

三、Pod 退出流程(删除操作)

1、Endpoint 删除 pod 的 ip 地址

2、Pod 变成 Terminating 状态

pod 变为删除中的状态后,会给 pod 一个宽限期,让 pod 去执行一些清理或销毁操作。
配置参数:
# 作用与 pod 中的所有容器
terminationGracePeriodSeconds: 30
containers:
  - xxx

3、执行 preStop 的指令

四、PreStop 的应用

如果应用销毁操作耗时需要比较长,可以在 preStop 按照如下方式进行配置

preStop:
  exec:
    command:
      - sh
      - -c
      - 'sleep 20; kill pgrep java'

但是需要注意,由于 k8s 默认给 pod 的停止宽限时间为 30s,如果我们停止操作会超过 30s 时,不要光设置 sleep 50,还要将 terminationGracePeriodSeconds: 30 也更新成更长的时间,否则 k8s 最多只会在这个时间的基础上再宽限几秒,不会真正等待 50s

1、注册中心下线

2、数据清理

3、数据销毁

posted @ 2023-10-12 18:31  yifanSJ  阅读(144)  评论(0编辑  收藏  举报