参考:https://kubernetes.io/docs/concepts/containers/container-lifecycle-hooks/

https://kubernetes.io/docs/tasks/configure-pod-container/attach-handler-lifecycle-event/

大多数编程语言框架都会提供组件生使周期管理钩子,与此类似,kubernetes通过容器的生命周期钩子管理容器。首先要为钩子注册处理句柄,当容器生命周期发生变化时,如创建、销毁时,触发为钩子注册的句柄的执行。

当前,kubernetes支持的钩子有两种:

PostStart

当容器被创建后,为这个钩子注册的处理句柄立刻执行,但是不保证钩子的处理句柄在容器的ENTRYPOINT之前执行。无法向此钩子的处理句柄传递参数。

PreStop

在容器被终止这之前执行,如果此操作没有执行完成,那么它会阻塞kubelet发送删除容器的操作。无法向此钩子的处理句柄传递参数。

钩子处理句柄的实现也有两种方式:

Exec

容器内的命令、脚本、及其它可执行程序。命令本身处于与窗口相同的namespace与cgroup之下,执行命令所点用的资源计入容器。

HTTP

向容器中的某个HTTP endpoint发送请求,由谁发送?文档里没有说。

钩子处理例外

当容器生命周期的变化事件发生时,Kubernetes management system在容器内部执行注册相应钩子的处理句柄。对于PostStart类型的钩子处理句柄,如果执行时间太长或者被挂起,则容器无法进入"running"状态。如果PreStop类型的钩子处理句柄在执行时被挂起,则容器一直停留在"Terminating"状态,并且在"terminationGracePeriodSeconds"后容器被杀死。如果PostStart或者PreStop执行失败,则容器直接被杀死。

用户应该尽量使钩子处理句柄执行的任务更轻,以免执行时间太长,使容器无法进入"running"状态或者无法正常终止而被系统强制杀死。但是有时候,长时间的处理句两是有意义的,比如在停止容器之前保存状态。

钩子分发保证

系统趋向于当容器生命周期状态发生变化时,为钩子注册的处理句柄只被调用一次,但在某些情况下,这个特性无法保证,也就是说钩子的处理句柄可能会被调用多次,应该由钩子处理句柄的具体实现保证对此种情况的正确处理。

调试钩子处理句柄

如果钩子处理句柄执行失败,通过如下命令查看:

kubectl describe pod <pod_name>

结果:

Events:FirstSeen    LastSeen    Count    From                            SubobjectPath        Type        Reason        Message---------    --------    -----    ----                            -------------        --------    ------        -------1m        1m        1    {default-scheduler }                                Normal        Scheduled    Successfully assigned test-1730497541-cq1d2 to gke-test-cluster-default-pool-a07e5d30-siqd1m        1m        1    {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}    spec.containers{main}    Normal        Pulling        pulling image "test:1.0"1m        1m        1    {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}    spec.containers{main}    Normal        Created        Created container with docker id 5c6a256a2567; Security:[seccomp=unconfined]1m        1m        1    {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}    spec.containers{main}    Normal        Pulled        Successfully pulled image "test:1.0"1m        1m        1    {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}    spec.containers{main}    Normal        Started        Started container with docker id 5c6a256a256738s        38s        1    {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}    spec.containers{main}    Normal        Killing        Killing container with docker id 5c6a256a2567: PostStart handler: Error executing in Docker Container: 137s        37s        1    {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}    spec.containers{main}    Normal        Killing        Killing container with docker id 8df9fdfd7054: PostStart handler: Error executing in Docker Container: 138s        37s        2    {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}                Warning        FailedSync    Error syncing pod, skipping: failed to "StartContainer" for "main" with RunContainerError: "PostStart handler: Error executing in Docker Container: 1"1m         22s         2     {kubelet gke-test-cluster-default-pool-a07e5d30-siqd}    spec.containers{main}    Warning        FailedPostStartHook

为容器生命周期事件提供处理句柄

假设有如下pod定义,其中包含一个容器,容器中包含对PostStart与PreStop容器生命周期事件的处理,如下:

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: ["/usr/sbin/nginx","-s","quit"]

从以上配置文件可以看到,当发生PostStart事件时,向/usr/share/message文件中写入一句话。当发生PreStop时,执行一条命令,退出nginx。

创建pod:

kubectl create -f https://k8s.io/examples/pods/lifecycle-events.yaml

确认pod运行状态:

kubectl get pod lifecycle-demo

在窗口内执行shell:

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

在容器内确认/usr/share/message文件内容:

Hello from the postStart handler

可以看到PostStart事件的处理被正确执行。

kubernetes之容器生命周期管理相关推荐

  1. Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理

    Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理 1. 在Kubernetes中部署应用流程 2. 使用Deployment部署Java应用 2.1 Pod与D ...

  2. Kubernetes中Sidecar生命周期管理

    背景 在多个容器的Pod中,通常业务容器需要依赖sidecar.启动时sidecar需要先启动,退出时sidecar需要在业务容器退出后再退出.k8s目前对于sidecar的生命周期比较有争议,见is ...

  3. SpringBoot : Spring容器生命周期管理:SmartLifecycle

    1.美图 2.Spring 容器简介 参考:Spring 容器简介 3.SmartLifeCycle简介 SmartLifeCycle是一个接口,具体继承关系如下: 如上图所示,在继承了Lifecyc ...

  4. Mirantis决定采用Kubernetes作为 Openstack的生命周期管理工具

    Mirantis是OpenStack的主要贡献者,今天他宣布将使用Kubernetes作为底层编排引擎重写其私有云平台.我们认为这是推进OpenStack和Kubernetes 社区伟大的一步. Op ...

  5. 容器,对象生命周期管理的基石

    2019独角兽企业重金招聘Python工程师标准>>> 郑重申明:包括本文在内的很多技术文章,大多出自山外高人,而非Fans. Fans暂时没有能力写作优秀的技术文章,Fans只是转 ...

  6. 用于管理容器生命周期的 Docker 命令

    了解 Docker 容器的各种状态对于任何认真的 Docker 用户都至关重要. 我将解释容器生命周期,然后显示生命周期每个阶段的 Docker 命令. 但在学习所有这些东西之前,让我们再次回顾一下容 ...

  7. Kubernetes之Pod生命周期详解

    简述 Kubernetes 是一种用于在一组主机上运行和协同容器化应用程序的系统,提供应用部署.规划.更新维护的机制.应用运行在 kubernetes 集群之上,实现服务的扩容.缩容,执行滚动更新以及 ...

  8. k8s的Pod状态和生命周期管理

    Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod pha ...

  9. Kubernetes pod的生命周期

    本文翻译自:Kubernetes: Lifecycle of a Pod 原文出处:Kubernetes: Lifecycle of a Pod - DZone Integration 参考:Cont ...

  10. 自定义Unity对象生命周期管理集成ADO.NET Entity Framework

    在Unity中,从Unity 取得的实例为 Transient.如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一个了.在Unity IOC中,它支持我们 ...

最新文章

  1. Vue Router 知识点梳理
  2. Nacos 2.0 性能提升十倍,贡献者 80% 以上来自阿里之外
  3. 对管理学的认识 知乎摘抄
  4. spring集成 JedisCluster 连接 redis3.0 集群
  5. 【ArcGIS遇上Python】Python使用栅格数据
  6. 改进初学者的PID-积分饱和
  7. python给生活带来哪些改变_Python - 笔记1
  8. 实训以来,到这里的次数少了!
  9. struts返回对象json格式数据
  10. go struct 零值_《Go 语言程序设计》读书笔记 (五) 协程与通道
  11. 使用frp通过ssh访问公司内网机器
  12. 用打印服务器打印打印机显示脱机,菜鸟也专业 打印机脱机故障处理方法
  13. python读取npy文件
  14. 耳机插在主机后面声音很小,音频软件测试很大声音,如何解决电脑前面耳机没声音后面却正常的问题...
  15. Pr:基本图形(文本)
  16. IOS15.4无法运行WebGL2.0问题
  17. 会计核算的基本前提与确认计量的一般原则
  18. 碱性溶液中HER动力学分析
  19. 可见光成像通信(OOC)驱动频率区域的计算
  20. 玩转MAC OS!实测DIY兼容机装苹果系统

热门文章

  1. kingsoft的服务器信息,Win10系统kingsoft是什么文件夹?可以删除吗?
  2. 服务器后端开发,学什么编程语言?
  3. installshield mysql_InstallShield 调用批处理部署MySql数据库 | 学步园
  4. A. 拼音魔法 大学生程序设计邀请赛(华东师范大学)
  5. IP技术 -- 6 Telemetry
  6. 基于javaweb的人才求职招聘管理系统(java+springboot+freemarker+jpa+mysql)
  7. python实现简易数独小游戏
  8. 深度学习之鸡兔同笼问题
  9. 中国大学MOOC动物遗传学试题及答案
  10. 村上春树《挪威的森林》读书笔记