kubernetes之容器生命周期管理
参考: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之容器生命周期管理相关推荐
- Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理
Kubernetes CKA认证运维工程师笔记-Kubernetes应用程序生命周期管理 1. 在Kubernetes中部署应用流程 2. 使用Deployment部署Java应用 2.1 Pod与D ...
- Kubernetes中Sidecar生命周期管理
背景 在多个容器的Pod中,通常业务容器需要依赖sidecar.启动时sidecar需要先启动,退出时sidecar需要在业务容器退出后再退出.k8s目前对于sidecar的生命周期比较有争议,见is ...
- SpringBoot : Spring容器生命周期管理:SmartLifecycle
1.美图 2.Spring 容器简介 参考:Spring 容器简介 3.SmartLifeCycle简介 SmartLifeCycle是一个接口,具体继承关系如下: 如上图所示,在继承了Lifecyc ...
- Mirantis决定采用Kubernetes作为 Openstack的生命周期管理工具
Mirantis是OpenStack的主要贡献者,今天他宣布将使用Kubernetes作为底层编排引擎重写其私有云平台.我们认为这是推进OpenStack和Kubernetes 社区伟大的一步. Op ...
- 容器,对象生命周期管理的基石
2019独角兽企业重金招聘Python工程师标准>>> 郑重申明:包括本文在内的很多技术文章,大多出自山外高人,而非Fans. Fans暂时没有能力写作优秀的技术文章,Fans只是转 ...
- 用于管理容器生命周期的 Docker 命令
了解 Docker 容器的各种状态对于任何认真的 Docker 用户都至关重要. 我将解释容器生命周期,然后显示生命周期每个阶段的 Docker 命令. 但在学习所有这些东西之前,让我们再次回顾一下容 ...
- Kubernetes之Pod生命周期详解
简述 Kubernetes 是一种用于在一组主机上运行和协同容器化应用程序的系统,提供应用部署.规划.更新维护的机制.应用运行在 kubernetes 集群之上,实现服务的扩容.缩容,执行滚动更新以及 ...
- k8s的Pod状态和生命周期管理
Pod状态和生命周期管理 一.什么是Pod? 二.Pod中如何管理多个容器? 三.使用Pod 四.Pod的持久性和终止 五.Pause容器 六.init容器 七.Pod的生命周期 (1)Pod pha ...
- Kubernetes pod的生命周期
本文翻译自:Kubernetes: Lifecycle of a Pod 原文出处:Kubernetes: Lifecycle of a Pod - DZone Integration 参考:Cont ...
- 自定义Unity对象生命周期管理集成ADO.NET Entity Framework
在Unity中,从Unity 取得的实例为 Transient.如果你希望使用多线程方式,就需要在组成时使用lifecycle参数,这时候取出的组件就不再是同一个了.在Unity IOC中,它支持我们 ...
最新文章
- Vue Router 知识点梳理
- Nacos 2.0 性能提升十倍,贡献者 80% 以上来自阿里之外
- 对管理学的认识 知乎摘抄
- spring集成 JedisCluster 连接 redis3.0 集群
- 【ArcGIS遇上Python】Python使用栅格数据
- 改进初学者的PID-积分饱和
- python给生活带来哪些改变_Python - 笔记1
- 实训以来,到这里的次数少了!
- struts返回对象json格式数据
- go struct 零值_《Go 语言程序设计》读书笔记 (五) 协程与通道
- 使用frp通过ssh访问公司内网机器
- 用打印服务器打印打印机显示脱机,菜鸟也专业 打印机脱机故障处理方法
- python读取npy文件
- 耳机插在主机后面声音很小,音频软件测试很大声音,如何解决电脑前面耳机没声音后面却正常的问题...
- Pr:基本图形(文本)
- IOS15.4无法运行WebGL2.0问题
- 会计核算的基本前提与确认计量的一般原则
- 碱性溶液中HER动力学分析
- 可见光成像通信(OOC)驱动频率区域的计算
- 玩转MAC OS!实测DIY兼容机装苹果系统
热门文章
- kingsoft的服务器信息,Win10系统kingsoft是什么文件夹?可以删除吗?
- 服务器后端开发,学什么编程语言?
- installshield mysql_InstallShield 调用批处理部署MySql数据库 | 学步园
- A. 拼音魔法 大学生程序设计邀请赛(华东师范大学)
- IP技术 -- 6 Telemetry
- 基于javaweb的人才求职招聘管理系统(java+springboot+freemarker+jpa+mysql)
- python实现简易数独小游戏
- 深度学习之鸡兔同笼问题
- 中国大学MOOC动物遗传学试题及答案
- 村上春树《挪威的森林》读书笔记