简介

在kubernetes中,容器hooks旨在解决服务进程启动与停止时的一些优雅操作需求。比如说进程停止时要给进程一个清理数据的时间,保证服务的请求正常结束,而不是强行中断服务的运行,这样在生产环境中可能会造成不优雅的结果。

截止kubernetes v1.20版本,实现了PostStartPreStop两种容器hooks。

如果hooks执行失败,容器将会被kill。

容器hooks由kubelet组件管理并启动执行。

名词解释

hook 钩子,软件行业中指程序中在某一个地方定义的预留接口,而接口的实现可以后续指定。

容器Hooks介绍

  1. PostStart

    PostStart hook在容器启动的时候运行,但并不保证该hook一定会比容器指定的ENTRYPOINT命令先运行。就是说PostStart和ENTRYPOINT都会在容器启动后运行,至于谁先运行,谁先结束,并不一定,是随机的。如果容器启动的时候,PostStart没有成功,容器不会处于running状态。

  2. 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的更多相关文章

  1. Ionic 4 and the Lifecycle Hooks

    原文: https://medium.com/@paulstelzer/ionic-4-and-the-lifecycle-hooks-4fe9eabb2864 ------------------- ...

  2. [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 ...

  3. Istio 运维实战系列(1):应用容器对 Envoy Sidecar 的启动依赖问题

    本系列文章将介绍用户从 Spring Cloud,Dubbo 等传统微服务框架迁移到 Istio 服务网格时的一些经验,以及在使用 Istio 过程中可能遇到的一些常见问题的解决方法. 故障现象 该问 ...

  4. kubernetes concepts -- Pod Lifecycle

    Pod Lifecycle This page describes the lifecycle of a Pod. Pod phase A Pod’s status field is a PodSta ...

  5. kubernetes入门(07)kubernetes的核心概念(4)

    一.pod 二.Volume volume可以为容器提供持久化存储,比如 三.私有镜像 在使用私有镜像时,需要创建一个docker registry secret,并在容器中引用.创建docker r ...

  6. Kubernetes — 深入解析Pod对象:基本概念(一)

    在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 A ...

  7. Kubernetes之容器

    Images You create your Docker image and push it to a registry before referring to it in a Kubernetes ...

  8. Kubernetes探索学习004--深入Kubernetes的Pod

    深入研究学习Pod 首先需要认识到Pod才是Kubernetes项目中最小的编排单位原子单位,凡是涉及到调度,网络,存储层面的,基本上都是Pod级别的!官方是用这样的语言来描述的: A Pod is ...

  9. K8S中Pods

    什么是Pod 一个Pod(就像一群鲸鱼,或者一个豌豆夹)相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机 ...

随机推荐

  1. BZOJ3998 弦论 【SAM】k小子串

    BZOJ3998 弦论 给一个字符串,问其第\(K\)小字串是什么 两种形式 1.不同起始位置的相同串只算一次 2.不同起始位置的相同串各算一次 首先建\(SAM\) 所有串的数量就是\(SAM\)中 ...

  2. HDU6061 RXD and functions【NTT】

    \(RXD\ and\ functions\) Problem Description RXD has a polynomial function \(f(x)\), \(f(x)=\sum ^{n} ...

  3. 【noi 2.7_7215】简单的整数划分问题(算法效率)

    题意:问正整数n的所有划分个数. 解法:f[i][j]表示划分 i 后的每个数不大于 j 的划分数.分情况讨论:划分中每个数都小于 j,相当于每个数不大于 j- 1, 故划分数为 f[i][j-1]  ...

  4. python连接mysql数据库,并进行添加、查找数据

    1.删除MySQL数据表中的记录 DELETE FROM table_name WHERE condition; python操作mysql1数据库 import pymysql # 连接mysql数 ...

  5. Atcoder ABC161 A~E

    传送门 A - ABC Swap 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 ...

  6. 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 ...

  7. win10 远程桌面 ubuntu

    一.获取本机ip 通过ip查询网址来查询本机外网地址 二.下载远程链接软件 下载向日葵,注册账号 三.远程链接 将连接端与被连接端分别绑定账号,输入相应ip地址,即可连接.

  8. POJ 1742 Coins 【可行性背包】【非原创】

    People in Silverland use coins.They have coins of value A1,A2,A3...An Silverland dollar.One day Tony ...

  9. redis字符串-sds

    redis自己实现了一种名为简单动态字符串的抽象类型(simple dynamic string)作为字符串的表示.下面将简单介绍sds的实现原理. 一.sds的结构

  10. js optional chaining operator

    js optional chaining operator js 可选链 可选链操作符( ?. )允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效. ?. 操作符的功能类似于 ...