Kubernetes Container lifecycle hooks
简介
在kubernetes中,容器hooks旨在解决服务进程启动与停止时的一些优雅操作需求。比如说进程停止时要给进程一个清理数据的时间,保证服务的请求正常结束,而不是强行中断服务的运行,这样在生产环境中可能会造成不优雅的结果。
截止kubernetes v1.20版本,实现了PostStart和PreStop两种容器hooks。
如果hooks执行失败,容器将会被kill。
容器hooks由kubelet组件管理并启动执行。
名词解释
hook 钩子,软件行业中指程序中在某一个地方定义的预留接口,而接口的实现可以后续指定。
容器Hooks介绍
PostStart
PostStart hook在容器启动的时候运行,但并不保证该hook一定会比容器指定的ENTRYPOINT命令先运行。就是说PostStart和ENTRYPOINT都会在容器启动后运行,至于谁先运行,谁先结束,并不一定,是随机的。如果容器启动的时候,PostStart没有成功,容器不会处于running状态。PreStop
PreStop会在kubelet给Pod发送TERM信号之前执行。一般API Server会给kubelet发送结束Pod的信号,或者Pod的liveness/startup探针失败,或其它原因导致Pod失败,kubelet会尝试发送TERM信号给Pod里主进程。如果PreStop存在,kubelet则会优先启动PreStop,待PreStop结束之后再发送TERM信号给Pod。但从API Server将Pod标记为Terminating状态开始,整个Pod停止时间不能超过terminationGracePeriodSeconds所设置的时间,如果超过,kubelet需要发送KILL信号给Pod所有的进程。
举例:
如果一个Pod设置terminationGracePeriodSeconds=60,PreStop执行需要55s,服务进程停止需要10s。API Server首先将需要停止的Pod标记为Terminating状态,并且开始计算terminationGracePeriodSeconds时间。kubelet开始启动PreStop,等待55s后执行完毕,kubelet给Pod的主进程发送TERM信号,这时主进程开始清理退出,5s之后,terminationGracePeriodSeconds时间到达,kubelet将发送KILL信号给Pod所有进程,强制停止。这一通操作之后,发现主服务进程没有清理完毕就被强制停止了。面对这种情况,我们需要增加terminationGracePeriodSeconds=65。
Hooks类型
Exec 指定一个可执行命令或脚本,在容器内执行
HTTP 发送一个http请求给容器,由kubelet发送请求
Hooks执行的次数
hook至少会调用一次,意思说如果有多个触发事件,hooks可能会被调用多次。
一般情况下hooks只会调用一次,只在很少的异常时候才会调用多次。比如在Pod停止的过程中kubelet被重启,重启后的kubelet会再次发送hooks调用。
Debug Hooks
PostStart执行失败时会记录FailedPostStartHook事件,PreStop执行失败时会记录FailedPreStopHook事件。可以通过kubectl describe pod <pod_name>查看。
容器Hooks配置示例
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"]
Kubernetes Container lifecycle hooks的更多相关文章
- Ionic 4 and the Lifecycle Hooks
原文: https://medium.com/@paulstelzer/ionic-4-and-the-lifecycle-hooks-4fe9eabb2864 ------------------- ...
- [Recompose] Add Lifecycle Hooks to a Functional Stateless Component using Recompose
Learn how to use the 'lifecycle' higher-order component to conveniently use hooks without using a cl ...
- Istio 运维实战系列(1):应用容器对 Envoy Sidecar 的启动依赖问题
本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法. 故障现象 该问 ...
- kubernetes concepts -- Pod Lifecycle
Pod Lifecycle This page describes the lifecycle of a Pod. Pod phase A Pod’s status field is a PodSta ...
- kubernetes入门(07)kubernetes的核心概念(4)
一.pod 二.Volume volume可以为容器提供持久化存储,比如 三.私有镜像 在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用.创建docker r ...
- Kubernetes — 深入解析Pod对象:基本概念(一)
在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 A ...
- Kubernetes之容器
Images You create your Docker image and push it to a registry before referring to it in a Kubernetes ...
- Kubernetes探索学习004--深入Kubernetes的Pod
深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...
- K8S中Pods
什么是Pod 一个Pod(就像一群鲸鱼,或者一个豌豆夹)相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机 ...
随机推荐
- BZOJ3998 弦论 【SAM】k小子串
BZOJ3998 弦论 给一个字符串,问其第\(K\)小字串是什么 两种形式 1.不同起始位置的相同串只算一次 2.不同起始位置的相同串各算一次 首先建\(SAM\) 所有串的数量就是\(SAM\)中 ...
- HDU6061 RXD and functions【NTT】
\(RXD\ and\ functions\) Problem Description RXD has a polynomial function \(f(x)\), \(f(x)=\sum ^{n} ...
- 【noi 2.7_7215】简单的整数划分问题(算法效率)
题意:问正整数n的所有划分个数. 解法:f[i][j]表示划分 i 后的每个数不大于 j 的划分数.分情况讨论:划分中每个数都小于 j,相当于每个数不大于 j- 1, 故划分数为 f[i][j-1] ...
- python连接mysql数据库,并进行添加、查找数据
1.删除MySQL数据表中的记录 DELETE FROM table_name WHERE condition; python操作mysql1数据库 import pymysql # 连接mysql数 ...
- Atcoder ABC161 A~E
传送门 A - ABC Swap 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 ...
- DNA Sequence POJ - 2778 AC自动机 && 矩阵快速幂
It's well known that DNA Sequence is a sequence only contains A, C, T and G, and it's very useful to ...
- win10 远程桌面 ubuntu
一.获取本机ip 通过ip查询网址来查询本机外网地址 二.下载远程链接软件 下载向日葵,注册账号 三.远程链接 将连接端与被连接端分别绑定账号,输入相应ip地址,即可连接.
- POJ 1742 Coins 【可行性背包】【非原创】
People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony ...
- redis字符串-sds
redis自己实现了一种名为简单动态字符串的抽象类型(simple dynamic string)作为字符串的表示.下面将简单介绍sds的实现原理. 一.sds的结构
- js optional chaining operator
js optional chaining operator js 可选链 可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效. ?. 操作符的功能类似于 ...