【kubernetes】Pod生命周期-启动钩子、停止钩子

news2024/11/15 9:31:56

一,Pod的生命周期

  • pod从开始创建到终止退出的时间范围称为Pod生命周期。
  • pod生命周期包含以下几个重要流程:
    在这里插入图片描述
    • 初始化容器(initContainers)。
      一个pod可以拥有任意数量的init容器。init容器是按照顺序以此执行的,并且仅当最后一个init容器执行完毕才会去启动主容器

    • 容器启动后钩子 (post-start)。

    • 容器探测

      • 启动探测(Startupprobe):探测容器是否正常运行
      • 存活性探测(Livenessprobe):判断容器是否处于runnning状态,根据重启策略决定是否重启容器
      • 就绪性探测(Readinessprobe):判断容器是否准备就绪并对外提供服务,将容器设置为不可用,不接受service转发的请求。
    • 容器停止前钩子 (pre-stop)。

初始化容器与主容器区别:

1、初始化容器不支持 Readinessprobe,因为它们必须在Pod就绪之前运行完成。
2、每个Init容器必须运行成功,下一个才能够运行。

二,Pod在生命周期所处的几种状态:

  • Pending:创建了pod资源并存入etcd中,但尚未完成调度。
  • ContainerCreating:Pod 的调度完成,被分配到指定 Node 上。处在容器创建的过程中。通常是在拉取镜像的过程中。
  • Running:Pod 包含的所有容器都已经成功创建,并且成功运行起来。
  • Succeeded:Pod中的所有容器都已经成功终止并且不会被重启。
  • Failed:所有容器都已经终止,但至少有一个容器终止失败,也就是说容器返回了非0值的退出状态或已经被系统终止。
  • Unknown:因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在节点主机通信失败。

三,3种探针用于Pod检测:

  • ExecAction:在容器中执行一个命令,并根据返回的状态码进行诊断,只有返回0为成功

  • TCPSocketAction:通过与容器的某TCP端口尝试建立连接

  • HTTPGetAction:通过向容器IP地址的某指定端口的path发起HTTP GET请求。

四,容器的重启策略:

需要提前定义:是否重启Pod对象。

  • Always:但凡Pod对象终止就重启,默认设置。

  • OnFailure:仅在Pod出现错误时,才重启。

  • Never:从不重启。

【注意】:一旦Pod绑定到一个节点上,就不会被重新绑定到另一个节点上,要么重启,要么终止。

五,pod的终止过程

终止过程主要分为如下几个步骤:

(1) 用户发出删除 pod 命令:kubectl delete pods [pod名] kubectl delete -f xx.yaml

(2) Pod 对象随着时间的推移更新,在宽限期(默认情况下30秒),pod 被视为“dead”状态。

(3) 将 pod 标记为“Terminating”状态。

(4) 第三步同时运行,监控到 pod 对象为“Terminating”状态的同时,启动 pod 关闭过程。

(5) 第三步同时进行,endpoints 控制器监控到 pod 对象关闭,将pod与service匹配的 endpoints 列表中删除。

(6) 如果 pod 中定义了 preStop 钩子处理程序,则 pod 被标记为“Terminating”状态时,以同步的方式启动执行;若宽限期结束后,preStop 仍未执行结束,第二步会重新执行并额外获得一个2秒的小宽限期。

(7) Pod 内对象的容器收到 TERM 信号。

(8) 宽限期结束之后,若存在任何一个运行的进程,pod 会收到 SIGKILL 信号。

(9) Kubelet 请求 API Server 将此 Pod 资源宽限期设置为0从而完成删除操作。

六,初始化容器 案例

【初始化容器使用案例】

定义2个初始化容器,依次执行“等待2秒钟”后,进入主容器执行命令,输出“containers start running!”。

# cat init.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: myapp-pod
  labels:
    app: myapp
spec:
  initContainers:
  - name: init-myservice
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', "sleep 2"]
  - name: init-mydb
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', "sleep 2"]
  containers:
  - name: myapp-container
    image: busybox:1.28
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo containers start running! && sleep 3600']

【初始化容器生产应用】
先运行初始化容器,来给主容器生成index.html文件。然后,主容器运行nginx服务,以达到访问百度静态页面的效果。

# cat init-1.yaml
 
apiVersion: v1
kind: Pod
metadata:
  name: initnginx
spec:
  initContainers:
  - name: install
    image: docker.io/library/busybox:1.28
    imagePullPolicy: IfNotPresent
    command:
    - wget
    - "-O"
    - "/work-dir/index.html"
    - "https://www.baidu.com"
    volumeMounts:
    - name: workdir
      mountPath: /work-dir
  containers:
  - name: nginx
    image: docker.io/xianchao/nginx:v1
    imagePullPolicy: IfNotPresent
    ports:
    - containerPort: 80
    volumeMounts:
    - name: workdir
      mountPath: /usr/share/nginx/html
  dnsPolicy: Default
  volumes:
  - name: workdir
    emptyDir: {}

可以通过curl 10.244.102.102 命令,查看访问页面内容。

七,容器钩子:postStart和preStop

  • postStart:容器创建之后立刻执行,用于资源部署、环境准备等。

  • preStop:在容器被终止前执行,用于优雅关闭应用程序、通知其他系统等。

......
containers:
- image: sample:v2  
  name: war
  lifecycle:
   postStart:
    exec:
      command:
       - “cp”
       -/sample.war”
       -/app”
   prestop:
    httpGet:
     host: monitor.com
     path: /waring
     port: 8080
     scheme: HTTP
......

以上示例中,定义了一个Pod,包含一个JAVA的web应用容器,其中设置了PostStart和PreStop回调函数。
即在容器创建成功后,复制/sample.war到/app文件夹中。而在容器终止之前,发送HTTP请求到http://monitor.com:8080/waring,即向监控系统发送警告。

程序优雅关闭:

即让应用程序完成正在处理的请求后,再关闭软件。

K8S提供两种信息通知:

1)默认:K8S通知node执行docker stop命令,docker会先向容器中PID为1的进程发送系统信号SIGTERM,然后等待容器中的应用程序终止执行。如果等待时间达到设定的超时时间,或者默认超时时间(30s),会继续发送SIGKILL的系统信号强行kill掉进程。

2)使用pod生命周期(利用PreStop回调函数),它执行在发送终止信号之前。
默认情况下,所有的删除操作的优雅退出时间都在30秒以内。kubectl delete命令支持–grace-period=的选项,以运行用户来修改默认值。0表示删除立即执行,并且立即从API中删除pod。在节点上,被设置了立即结束的的pod,仍然会给一个很短的优雅退出时间段,才会开始被强制杀死。

【强制删除pod命令】:

kubectl  delete pod [容器名]  --grace-period=0 --force

案例:

# cat pre-start.yaml 
apiVersion: v1
kind: Pod
metadata:
  name: life-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: docker.io/xianchao/nginx:v1
    imagePullPolicy: IfNotPresent
    lifecycle:
      postStart:
         exec:
           command: ["/bin/sh", "-c","echo 'lifecycle hookshandler' > /usr/share/nginx/html/test.html"]
      preStop:
         exec:
           command:
           - "/bin/sh"
           - "-c"
           - "nginx -s stop"

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2076798.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行

目录 HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行 注意事项: 初始化部分: 回调函数部分 HAL库:中断 方式按键检测:抬起执行、按下执行、长按短按检测、延时执行 注意事项&am…

如何在CMD/PowerShell中使用命令行管理IIS

使用通用IIS命令行管理工具: C:\Windows\System32\inetsrv\appcmd.exe 查看现有站点 1 appcmd list site 添加一个新站点 1 appcmd add site /name:"My New Site" /id:2 /bindings:http/*:81: /physicalPath:"c:\inetpub\mynewsite" /name …

559. N 叉树的最大深度(迭代法)

目录 一:题目: 二:代码: 三:结果: 一:题目: 给定一个 N 叉树,找到其最大深度。 最大深度是指从根节点到最远叶子节点的最长路径上的节点总数。 N 叉树输入按层序遍历…

学习系列三:V8目标检测与分割自动化标注

学习系列三:YOLOv8目标检测与分割自动化标注 提示:本次文章主要介绍yolov8目标检测与自动化标注(较简单,通用性比较强,标签格式txt),yolov8实例分割与自动化标注(程序较复杂,自动化标注效果有待提升,标签格…

SE11 没有激活的名称表存 No active nametab exists for

背景: SE11中减少某个非空表的字段的长度后,在SE14中的操作不当,并且对该表进行了删除重建的操作后,发生SE11激活该表报错。 原因: 出现了一些未知原因,导致该表在底层数据库存在,但是运行时对…

柔版印刷版市场前景:预计2030年全球市场规模将达到20.9亿美元

一、当前市场状况 目前,柔版印刷版市场呈现出较为稳定的发展态势。随着全球经济的逐步复苏,包装印刷等领域对柔版印刷版的需求持续增长。柔版印刷版具有环保、高效、印刷质量高等特点,在食品包装、标签印刷等行业中得到广泛应用。 全球前四…

微信聊天记录删除怎么恢复?两个抱藏方法快速恢复数据

微信作为我们日常沟通的重要工具,存储了大量的聊天记录,这些记录往往承载着珍贵的记忆或重要的工作信息。我们在日常使用微信时不小心左滑删除了和领导的聊天记录!里面还有很重要的工作内容,删除的微信聊天记录怎么恢复啊&#xf…

环境问题处理:Python写工具,转换excel内容合并到xml中(openpyxllxml)

问题描述 提示报错,但是没有像java代码的解决方案推荐。 Note:PycharmProjects\项目名\venv\Scripts 创建项目时自带的脚本,也包含python.exe 查看python文件有输出路径,使用python也能打开python3.8,但是无法查找pyt…

Java学习_22_网络编程

文章目录 前言网络编程网络编程三要素IPInetAddress 端口号协议OSI七层模型TCP/IP模型UDP协议TCP协议 综合练习多发多收接收和反馈上传文件上传文件重名问题上传文件多线程问题上传文件线程池问题BS架构 总结 前言 博客仅记录个人学习进度和一些查缺补漏。 学习内容&#xff1…

软考:一个月拿下软件设计师

前言 软考我满打满算也就准备了一个月不到,期间也走了不少弯路;特地做个博客记录一下,也给其它备考的人一些建议。 我是24年上半年参加的考试,说实在的这年下午题有几道不好写。 只要上午成绩和下午成绩都过45就算及格了。 正文…

【Git保姆级使用教程】Git从入门到精通超级详细的使用教程,一套教程带你搞定Git(高见龙版本)。

目录 Git下载与安装设置GitGit的用户设置 使用Git新增初始Repository将文件交给Git管控(将文件加入暂存区)查看Git文件记录查找commit记录更改提交commit的记录撤销提交commit 将某些文件取消Git版控Git中删除或更改文件名Git查看某个文件的某一行代码是谁写的.git目录中有什么…

Tower for Mac Git客户端管理软件

Mac分享吧 文章目录 效果一、下载软件二、开始安装1、双击运行软件,将其从左侧拖入右侧文件夹中,等待安装完毕2、应用程序显示软件图标,表示安装成功 三、运行测试1、打开软件,测试2、克隆项目,测试 安装完成&#xf…

港股震荡中保持乐观,市场信心回来了!

港股上午盘三大指数集体上涨,恒生科技指数一度冲高至1.54%,最终收涨0.98%,恒生指数上涨1.06%。盘面上,大型科技股多数维持上涨行情,百度、腾讯涨超1.5%,快手、美团小幅上涨,阿里巴巴、京东飘绿&…

Java:Date类

文章目录 Date类常用方法代码演示 SimpleDateFormat常用方法代码演示时间格式常见符号SimpleDateFormat解析字符串为Date对象代码总结 案例:秒杀活动: 黑马学习笔记 这些方法在API文档都能查到 Date类 常用方法 代码演示 package Time;import java.uti…

杰发科技AC7801——Flash模拟EEP内存(2)

1. 默认配置在1000个地址存储1000个数据 配置如下 计算地址 查看地址内容,等到打印完成 计算符合,从0-999共计1000 2. 修改配置在65536地址存储65536个数据 配置还是这个 因为传进去的地址是uint16_t,因此最大值是65536,写65536…

mp总结 mybatisPlus

一、准备 1.引入依赖&#xff08;引入后可以不再引mybatis依赖&#xff09; <dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.2</version> </dependency> 2.…

Leetcode JAVA刷刷站(95)不同的二叉搜索数 ||

一、题目概述 二、思路方向 为了生成所有由 n 个节点&#xff08;值从 1 到 n&#xff09;组成的不同二叉搜索树&#xff08;BST&#xff09;&#xff0c;我们可以采用递归的方式。核心思想在于&#xff0c;对于每个数字 i&#xff08;从 1 到 n&#xff09;&#xff0c;我们可…

【C语言报错已解决】 `Buffer Overflow`

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引言一、问题描述&#x1f469;‍&#x1f52c;报错示例&#x1f4da;报错分析&#x1f4da;解决思路 二、解决方法&a…

麒麟V10(x86_64)安装部署MySQL-5.1.70

麒麟V10(x86_64)安装部署MySQL-5.1.70 1. 主机信息 [kalamikysrv1 ~]$ uname -a Linux kysrv1 4.19.90-24.4.v2101.ky10.x86_64 #1 SMP Mon May 24 12:14:55 CST 2021 x86_64 x86_64 x86_64 GNU/Linux [kalamikysrv1 ~]$ [kalamikysrv1 ~]$ uname -m x86_64 [kalamikysrv1 ~…

深度学习模板方法设计模式

文章目录 前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 模板方法设计模式是行为型设计模式&#xff0c;主要是定义算法框架&#xff0c;并将一些步骤的实现延迟到子类&#xff0c;重新定义算法的步骤。 一、介绍 模板设计模式…