【云原生|Kubernetes】12-容器生命周期的回调(PreStart和PreStop)

这篇具有很好参考价值的文章主要介绍了【云原生|Kubernetes】12-容器生命周期的回调(PreStart和PreStop)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【云原生|Kubernetes】12-容器生命周期的回调(PreStart和PreStop)

简介

我们知道,K8S可以在应用容器启动之前先执行一些预定义的操作,比如事先生成一些数据,以便于应用容器在启动的时候使用。这种方式可以通过init container技术实现。

那么事实上,在实际生产中,还有一种需求,就是我们需要在应用容器启动后执行一些初始化操作,比如设置容器的dns参数等,说到这里就不得不多提一句,k8s到目前为止尚不支持通过为kubelet添加参数的方式为应用容器设置dns的options。事实上我们在生产中之所以使用到本篇文档所说的这种钩子,就是为了在应用容器启动后为其设置一个dns的options。

除了为容器添加启动后的钩子之外,还可以为容器添加销毁之前的钩子。

回调函数

有两个回调暴露给容器:

  • PostStart: 这个回调在容器被创建之后立即被执行(业务容器启动之后立即执行)。 但是,不能保证回调会在容器入口点(ENTRYPOINT)之前执行。 没有参数传递给处理程序。
  • PreStop: 在容器因 API 请求或者管理事件(诸如存活态探针、启动探针失败、资源抢占、资源竞争等) 而被终止之前,此回调会被调用。 如果容器已经处于已终止或者已完成状态,则对 preStop 回调的调用将失败。 在用来停止容器的 TERM 信号被发出之前,回调必须执行结束。 Pod 的终止宽限周期在 PreStop 回调被执行之前即开始计数, 所以无论回调函数的执行结果如何,容器最终都会在 Pod 的终止宽限期内被终止。 没有参数会被传递给处理程序。

回调处理程序的实现

容器可以通过实现和注册该回调的处理程序来访问该回调。 针对容器,有两种类型的回调处理程序可供实现:

  • Exec - 在容器的 cgroups 和名字空间中执行特定的命令(例如 pre-stop.sh)。 命令所消耗的资源计入容器的资源消耗。这些回调可以用于在容器终止之前执行清理操作,例如关闭文件句柄或释放其他资源。
  • HTTP - 对容器上的特定端点执行 HTTP 请求。这些回调可以用于在容器启动或停止时向外部服务发送通知,例如将容器的状态报告给监控系统。

回调处理程序执行

  • PreStart:

当调用容器生命周期管理回调时,Kubernetes 管理系统根据回调动作执行其处理程序, httpGettcpSocket 在 kubelet 进程执行(这一段是说Pod层面的健康检查和服务可用性检查),而 exec 则由容器内执行(这里就是我们这章所说的PreStart和PreStop)。

当一个 Pod 中的容器被创建时,Kubernetes 会先运行容器的入口点(即 commandargs 字段指定的命令),然后再运行 PostStart 回调处理程序。因此,在 PostStart 回调处理程序执行之前,容器的入口点已经完成并且容器已经启动。这是异步的行为,因为容器的入口点和 PostStart 回调处理程序是在不同的时间点执行的。

需要注意的是,在 PostStart 回调处理程序执行期间,容器仍然处于启动阶段,可能还没有完全准备好接受流量。因此,在 PostStart 回调处理程序中执行的任何操作都应该考虑到这一点,并且应该只涉及容器内部的操作,而不是与外部服务交互。例如,在 PostStart 回调处理程序中可以执行初始化操作、启动后台服务、创建临时文件等操作,但应该避免向外部服务发送请求或接收来自外部服务的请求。但是,如果回调运行或挂起的时间太长,则容器无法达到 running 状态。

  • PreStop:

PreStop 回调处理程序的执行与停止容器的信号处理程序是同步的,而不是异步的。当 Kubernetes 停止一个容器时,它将首先向容器发送一个停止信号,然后等待一段时间(称为 terminationGracePeriodSeconds)以便容器可以执行清理操作,并且关闭所有正在进行的连接。在此期间,Kubernetes 将运行 PreStop 回调处理程序,以便容器可以在关闭之前执行一些清理任务,例如保存状态、执行清理操作等。

需要注意的是,PreStop 回调处理程序必须在容器停止之前完成执行。如果回调处理程序无法在 terminationGracePeriodSeconds 内完成执行,Kubernetes 将强制停止容器,这可能会导致数据丢失或其他不良后果。因此,在编写 PreStop 回调处理程序时,需要确保它可以在规定的时间内完成执行,并且不会影响容器的正常停止过程。

1 如果 PreStop 回调在执行期间停滞不前,Pod 的阶段会变成 Terminating并且一直处于该状态, 直到其 terminationGracePeriodSeconds 耗尽为止,这时 Pod 会被杀死。 这一宽限期是针对 PreStop 回调的执行时间及容器正常停止时间的总和而言的。 例如,如果 terminationGracePeriodSeconds 是 60,回调函数花了 55 秒钟完成执行, 而容器在收到信号之后花了 10 秒钟来正常结束,那么容器会在其能够正常结束之前即被杀死, 因为 terminationGracePeriodSeconds 的值小于后面两件事情所花费的总时间

如果 PostStartPreStop 回调失败,它会杀死容器。

调试回调函数

回调处理程序的日志不会在 Pod 事件中公开。 如果处理程序由于某种原因失败,它将播放一个事件。 对于 PostStart,这是 FailedPostStartHook 事件,对于 PreStop,这是 FailedPreStopHook 事件。 要自己生成失败的 FailedPostStartHook 事件,请修改 lifecycle-events.yaml 文件将 postStart 命令更改为 “badcommand” 并应用它。

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "badcommand"]

为容器的生命周期事件设置处理函数

定义 postStart 和 preStop 处理函数

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      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"]

在上述配置文件中,你可以看到 postStart 命令在容器的 /usr/share 目录下写入文件 message。 命令 preStop 负责优雅地终止 nginx 服务。

可以使用 terminationGracePeriodSeconds 字段设置容器的优雅停机期限。这个字段指定了 Kubernetes 等待容器停止的时间,以确保容器可以优雅地停止并完成清理操作。在 terminationGracePeriodSeconds 时间内,Kubernetes 会等待容器完成所有正在进行的连接,并允许容器执行 PreStop 钩子中指定的清理操作。

默认情况下,terminationGracePeriodSeconds 的值为 30 秒。可以通过在 Pod 的 spec 字段中设置 terminationGracePeriodSeconds 来自定义该值。文章来源地址https://www.toymoban.com/news/detail-524227.html

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      preStop:
        exec:
          command: ["/bin/sh", "-c", "echo 'Stopping application'"]
    terminationGracePeriodSeconds: 60

总结

  • Kubernetes 在容器创建后立即发送 postStart 事件。 然而,postStart 处理函数的调用不保证早于容器的入口点(entrypoint) 的执行。postStart 处理函数与容器的代码是异步执行的,但 Kubernetes 的容器管理逻辑会一直阻塞等待 postStart 处理函数执行完毕。 只有 postStart 处理函数执行完毕,容器的状态才会变成 RUNNING。
    postStart 处理函数与容器的代码是异步执行的,但 Kubernetes 的容器管理逻辑会一直阻塞等待 postStart 处理函数执行完毕。 只有 postStart 处理函数执行完毕,容器的状态才会变成 RUNNING。

到了这里,关于【云原生|Kubernetes】12-容器生命周期的回调(PreStart和PreStop)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【云原生】Pod 的生命周期

    +v ljx97609760 一起沟通学习 本文讲解的是 Kubernetes 中 Pod 的生命周期,包括生命周期的不同阶段、存活和就绪探针、重启策略等。 Pod 的 status 字段是一个 PodStatus 对象,PodStatus中有一个 phase 字段。 Pod 的相位(phase)是 Pod 在其生命周期中的简单宏观概述。该字段并不是对容器或

    2024年02月12日
    浏览(39)
  • K8s: 关于Kubernetes中的Pod的生命周期(状态)以及生命周期的钩子函数处理

    pod 的生命周期 1 ) pod 几种常用状态 1.1 )Pending(挂起) Pod 已被 Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行 此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间。 1.2 )Running(运行中) Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建 至少有

    2024年04月22日
    浏览(57)
  • Docker——容器生命周期管理(下篇)

    ​创建一个新的容器并运行一个命令 OPtion 作用 -i 以交互模式运行,通常与-t同时使用 -t 启动容器后,为容器分配一个命令行,通常与-i同时使用 -v 目录映射,容器目录挂载到宿主机目录,格式host目录容器目录 -d 守护进程,后台运行该容器 -p 指定端口映射,格式: 主机(宿主

    2024年02月08日
    浏览(36)
  • Docker 容器生命周期:创建、启动、暂停与停止

    🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐 🌊 《100天精通Golang(基础入门篇)》学会Golang语言

    2024年02月14日
    浏览(38)
  • 【云原生】深入掌握k8s中Pod和生命周期

        个人主页: 征服bug-CSDN博客 kubernetes专栏: kubernetes_征服bug的博客-CSDN博客  1 什么是 Pod 2 Pod 基本操作 3 Pod 运行多个容器 4 Pod 的 Labels(标签) 5 Pod 的生命周期 1 什么是 Pod 摘取官网: Pod | Kubernetes 1.1 简介         Pod 是可以在 Kubernetes 中 创建和管理的、最小的可部署的计

    2024年02月14日
    浏览(40)
  • VMware Aria Suite Lifecycle 8.12 - 应用生命周期管理

    VMware Aria Suite Lifecycle 8.12 - 应用生命周期管理 请访问原文链接:https://sysin.org/blog/vmware-aria-suite-lifecycle/,查看最新版。原创作品,转载请保留出处。 作者主页:sysin.org 应用生命周期管理 VMware Aria Suite Lifecycle (以前称为 vRealize Suite Lifecycle Manager) 通过全面的应用生命周期和

    2024年02月10日
    浏览(89)
  • .NET开源IOC内置容器,生命周期管理与Autofac扩展

    大家好,我是行不更名,坐不改姓的宋晓刚,下面将带领大家从基础小白到高阶的.NET的IOC容器依赖与注入,以及IOC内置容器和生命周期,Autofac的学习,跟上我的步伐进入C#的世界。 微信:15319589104 QQ: 2981345658 文章内容: .NET依赖注入容器的生命周期管理,瞬时生命周期(

    2024年01月21日
    浏览(49)
  • K8s(四)Pod资源——pod生命周期、重启策略、容器钩子与容器探测

    目录 Pod生命周期 Pod重启策略 初始化容器 容器钩子 容器探测 启动探测 存活探测 就绪探测 参考资料 Pod 的生命周期 | Kubernetes Init 容器 | Kubernetes Pod的生命周期可以分为以下几个阶段: Pending(等待):在这个阶段,Pod被创建,并且正在等待被调度到一个节点上运行。此时,

    2024年01月20日
    浏览(44)
  • 飞天使-k8s知识点18-kubernetes实操3-pod的生命周期

    探针的生命周期 docker 创建:在创建阶段,你需要选择一个镜像来运行你的应用。这个镜像可以是公开的,如 Docker Hub 上的镜像,也可以是你自己创建的自定义镜像。创建自己的镜像通常需要编写一个 Dockerfile,这个文件定义了创建镜像所需的所有步骤,包括基础镜像、需要安

    2024年02月20日
    浏览(58)
  • Docker 容器生命周期:创建、启动、暂停与停止----从创建到停止多角度分析

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(45)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包