k8s回调函数-cnblog

news/2025/3/10 14:27:10/文章来源:https://www.cnblogs.com/vitochen/p/18762601

回调函数

Kubernetes 为容器提供了生命周期回调。 回调使容器能够了解其管理生命周期中的事件,并在执行相应的生命周期回调时运行在处理程序中实现的代码。Kubernetes 支持 PostStart 和 PreStop 事件。 当一个容器启动后,Kubernetes 将立即发送 PostStart 事件;在容器被终结之前, Kubernetes 将发送一个 PreStop 事件。

PostStart

PostStart回调在容器创建后立即执行,但是PostStart并不能保证在容器ENTRYPOINT之前运行,所以PostStart的执行相对于容器的代码执行是异步的。

PostStart主要用于资源部署、环境准备等。

只有 PostStart 处理函数执行完毕,容器的状态才会变成 RUNNING。

PreStop

PreStop在容器终止前立即被调用,它是阻塞的,所以它必须在删除容器的调用触发之前完成。

PreStop主要用于优雅关闭应用程序、通知其他系统等。

如果钩子在执行期间挂起,Pod阶段将停留在Running状态并且不会达到failed状态。

另外,PreStop的执行现对于SIGTERM信息,也是异步的,k8s也不会等待PreStop执行完成。

Pod生命周期

pod的生命周期,它主要包含以下的过程:

  1. pod创建;
  2. 运行初始化容器(init container);
  3. 运行主容器(main container);
    • 容器启动后钩子(post start)、容器终止前钩子(pre stop),在启动后就执行post start
    • 容器的存活性检测(liveness probe)、就绪性检测(readiness probe)。
  4. pod终止过程,pod完全退出之前执行pre stop操作,也就是收尾工作。

pod生命周期

优雅关闭

PreStop是实现Pod优雅关闭的重要工具。

进行Pod优雅关闭的重要性主要体现在以下几个方面:

  1. 避免服务中断:通过优雅关闭,Pod可以在终止前完成当前正在处理的请求,确保服务不会因为Pod的突然终止而中断。
  2. 确保数据一致性:优雅关闭允许Pod在终止前通过PreStop Hook完成必要的数据持久化或事务处理,从而确保数据的一致性。
  3. 最小化用户体验影响:通过优雅关闭,可以避免将流量路由到已经被删除的Pod,减少用户请求处理失败的可能性。在滚动更新或扩展Pod时,优雅关闭能够确保服务的平滑过渡,对用户来说几乎是无感知的。
  4. 合理利用资源:优雅关闭允许Pod在终止前释放占用的资源,避免资源浪费和泄露,提高资源的利用率。

Pod终止过程:

  • 【第一步】用户发出删除 pod 命令
  • 【第二步】K8S 会给旧POD发送SIGTERM信号;将 pod 标记为“Terminating”状态;pod 被视为“dead”状态,此时将不会有新的请求到达旧的pod;
  • 【第三步】并且等待宽限期(pod.spec.terminationGracePeriodSeconds 参数定义,默认情况下30秒)这么长的时间
  • 第三步同时运行,监控到 pod 对象为“Terminating”状态的同时启动 pod 关闭过程
  • 第三步同时进行,endpoints 控制器监控到 pod 对象关闭,将pod与service匹配的 endpoints 列表中删除
  • 如果 pod 中定义了 preStop 处理程序,则 pod 被标记为“Terminating”状态时以同步的方式启动执行preStop;若宽限期结束后,preStop 仍未执行结束,第二步会重新执行并额外获得一个2秒的小宽限期(最后的宽限期,所以定义preStop 注意时间,和terminationGracePeriodSeconds 参数配合使用),
  • Pod 内对象的容器收到 TERM 信号
  • 宽限期结束之后,若存在任何一个运行的进程,pod 会收到 SIGKILL 信号
  • Kubelet 请求 API Server 将此 Pod 资源宽限期设置为0从而完成删除操作

[!NOTE]

如果应用程序完成关闭并在terminationGracePeriod完成之前退出,Kubernetes会立即进入下一步。

总的来说,Pod优雅关闭是Kubernetes中一个重要的功能,它结合了PreStop Hook和宽限期等机制,确保Pod在终止前能够优雅地完成必要的清理工作,从而保持服务的稳定性和可用性、确保数据一致性、提升用户体验和合理利用资源。在进行Pod管理时,应该充分了解和利用Pod优雅关闭的功能。

PostStart对比初始化容器

PostStart容器是在一个Pod中,所有容器启动之后启动的一个容器。与Init Container不同,PostStart容器不需要先于其他容器启动,它的主要作用是在所有容器启动之后,完成一些额外的任务。

可以使用PostStart容器来进行一些初始化或准备工作,例如配置一些环境变量或启动一个后台服务。PostStart容器的输出将被记录在Pod的日志中。

Init Container用于在启动其他容器之前,执行一些必要的任务。例如,加载一些配置文件或检查一些网络连接。Init Container是按顺序启动的,并且只有在所有的Init Container都成功完成之后,才会启动其他容器。

PostStart容器则用于在所有其他容器启动之后,执行一些附加的任务。例如,进行一些初始化或准备工作。PostStart容器在所有其他容器启动之后启动,且所有容器启动完毕之前,Pod将一直处于容器启动中的状态。

应用实战

PostStart做准备工作,PreStop优雅关闭Nginx

使用官网案例,PostStart 命令在容器的 /usr/share 目录下写入文件 message。 命令 PreStop 负责优雅地终止 nginx 服务。

apiVersion: v1
kind: Pod
metadata:name: lifecycle-demo
spec:containers:- name: lifecycle-demo-containerimage: nginxlifecycle:postStart:exec:command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]preStop:exec:command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

使用 shell 连接到 Pod 里的容器:

kubectl exec -it lifecycle-demo -- /bin/bash

在 shell 中,验证 postStart 处理函数创建了 message 文件:

root@lifecycle-demo:/# cat /usr/share/message

命令行输出的是 postStart 处理函数所写入的文本:

Hello from the postStart handler

设置宽限期,优雅关闭Nginx

apiVersion: apps/v1
kind: Deployment
metadata:name: nginx-deployment
spec:replicas: 3selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginx:latestports:- containerPort: 80lifecycle:preStop:exec:command: ["/usr/sbin/nginx", "-s", "quit"]terminationGracePeriodSeconds: 120  # 设置优雅终止的超时时间为 120 秒(2 分钟)

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Transfomer 中的强制教学(Teacher Forcing)

在预测阶段, 我们希望输入 "天雷滚滚我好怕怕" 和 "[cls]" 能预测出下一个token: 劈 于是我们在训练阶段,我们的输入是 "天雷滚滚我好怕怕" 和 “[cls]劈得我浑身掉渣渣”, 由于我们希望"[cls]" 能预测出 “劈” 字。 我们在损失函…

jenkins安装后可用插件版本需要高版本的jenkins才能使用

首先我们直接用清华镜像源https://mirrors.tuna.tsinghua.edu.cn/jenkins/updates/,比如我们要找Jenkins2.429对应版本 emmmm,没有429,427凑合用吧 获取这个地址,放到updatesite 进服务器,找到default.json,替换掉它,然后重启jenkins。 cp default.json default.json.ba…

​党政机关数字化转型必备:10款信创认证项目管理工具深度测评

党政机关数字化转型是适应时代发展、提升治理效能的关键举措。在这一过程中,信创认证项目管理工具发挥着至关重要的作用。它们不仅能助力项目高效推进,还能保障信息安全与合规性。以下将对10款信创认证项目管理工具进行深度测评,为党政机关在数字化转型道路上的工具选择提供…

材料焊接工艺大全-芯晨微纳(河南) -专注于激光代加工

一、材料焊接中的“焊接力” 材料焊接,准确说应该为“材料互联”,是通过物理力、化学力、机械作用力等方式将原本相互隔离的材料连为一体的过程。 物理力中的四种基本力是万有引力、电磁力、强相互作用力和弱相互作用力。具体的,按性质(根据它们的物理性质来命名和分类)分…

Zabbix 7.2 + Grafana 中文全自动安装ISO镜像

简介 ​基于Zabbix 官方的Alma Linux 8 作为基础镜像。镜像源都改为国内大学镜像站,自动联网安装Zabbix+Grafana。安装中文字体、Zabbix和Grafana也配置默认中文。Zabbix 也指定中文字体,绘图无乱码。配置时区为东八区,Zabbix配置Web时区也为东八区。Grafana自动安装zabbix源…

第十八章 项目绩效域(2025年详细解析版)

目录导学太极八卦与项目管理体系项目管理整体框架图绩效域原则和绩效域的关系18.1 干系人绩效域干系人绩效域概述定义预期目标绩效要点 :促进干系人参与目的作用促进干系人参与要做的六项活动与其他绩效域的相互作用(了解)关联为什么要促进干系人参与?为什么干系人重要?执…

PCA9306DCTR特征—400kHz I2C/SMBus电压电平转换器/S9S08DZ60F2VLCR/CC2650F128RSMR/MAX4715EXK SPST 开关

PCA9306DCTR是一款2 位双向 400kHz I2C/SMBus 电压电平转换器,可以在 1.2V 到 5V 之间实现双向电压转换而无须使用方向引脚。PCA9306DCTR是一款2 位双向 400kHz I2C/SMBus 电压电平转换器,可以在 1.2V 到 5V 之间实现双向电压转换而无须使用方向引脚。PCA9306DCTR具有低导通状…

快速理解Kubernetes 系统架构

Kubernetes 架构解析1. 整体架构:管理层 + 执行层 管理层(Master 节点)——"老板团队"API 服务器(kube-apiserver) ▶️ 公司的"前台",所有指令必须通过这里传达(如部署应用、查看状态) 调度器(kube-scheduler) ▶️ 像"项目经理",决…

001TypeScript开发实战

1、点击文件,点击打开文件夹 2、选择文件夹,打开文件夹 3、点击终端,新建终端 4、在终端内输入npm init vue@latest 按回车 5、写入项目名称 vue3-ts-cms 6、选择:这里我们先这样选择,Router(单页面应用开发)Pinia(状态管理)这次我们搭建一下7、 这里我们选择NO 可以看见…

​信创概念深度科普:从3大政策背景到5类典型应用场景全解析

信创,即信息技术应用创新产业,近年来在我国的科技发展领域占据着愈发重要的地位。它不仅仅是一个简单的产业概念,更是我国实现科技自立自强、保障国家信息安全的关键支撑。随着数字化时代的加速推进,信创产业迎来了前所未有的发展机遇,其涵盖的范围广泛,涉及到众多的政策…

数字逻辑 可编程阵列逻辑(PAL)

数字逻辑 可编程阵列逻辑(PAL) 参考书籍:数字逻辑基础与Verilog设计 原书第3版 P402 这里先给个可编程逻辑阵列(PLA)的例子。PLA的常用示意图中画X的就是选中的。 所以图 B.27 的计算过程为: \[\begin{align} P_1=& \ x_1x_2\\[1mm] P_2=& \ x_1 \overline x_{3…

基本项目目录解析

1、这里是说明vscode的相关配置的 recommendations 推荐的意思 最好安装的一些插件 这个必须安装 也可以看到这里有安装插件的弹窗 2、public这里是放入的我们的一些资源的 3、这里是放站点图标的,网站的的图标 4、src 就是放我们的源代码的5、node_modules 文件夹主要用来存…