Kubernetes Pod钩子
1、Pod容器钩子最终目的
之前在生产环境中使用dubbo框架,由于服务更新的过程中,容器直接被停止了,部分请求仍会被分发到终止的容器,导致有用户会访问服务出现500错误,这部分错误请求数据占用的比较少,因为Pod是滚动一对一更新。由于这个问题出现了,考虑使用优雅的终止方式,将错误请求将至到最低,直至滚动更新完全不会影响到用户。
简单分析一下优雅的停止Pod
微服务中,网关会把流量分配给每个Pod节点,如:我们线上更新Pod的时候
1、如果我们直接把Pod给杀死,那这部分流量就无法得到正确的处理,会影响到部分用户访问,一般来说网关或者注册中心会将我们的服务保持一个心跳,过了心跳超时后就会自动摘除我们的服务,但是有一个问题就是超时时间可能是10s、30s、甚至是60s,虽然不会大规模的影响我们业务系统,但是一定会对用户产生轻微的抖动。
2、如果我们在停止服务前执行一条命令,通知网关或注册中心这台Pod,即服务进行下线,那么注册中心就会标记这个Pod/服务已经下线,不进行流量转发,用户也就不会有任何的影响,这就是优雅停止,将滚动更新的影响最小化。
2、何为Pod容器钩子
Kubernetes最小调度单位为Pod,它为Pod中的容器提供了生命周期钩子,钩子能够使得容器感知其生命周期内的所有事件,并且当相应的生命周期的钩子被调用时运行执行的代码,而Pod 钩子是由Kubelet发起的。
容器钩子两类触发点:
- PostStart:容器创建后
- PreStop:容器终止前
PostStart
这个钩子在容器创建后立即执行。
但是,并不能保证钩子将在容器ENTRYPOINT之前运行。
没有参数传递给处理程序。
容器ENTRYPOINT和钩子执行是异步操作。
如果钩子花费太长时间以至于容器不能运行或者挂起, 容器将不能达到running状态
PreStop
这个钩子在容器终止之前立即被调用。
它是阻塞的,意味着它是同步的, 所以它必须在删除容器的调用发出之前完成
如果钩子在执行期间挂起, Pod阶段将停留在running状态并且永不会达到failed状态。
如果PostStart或者PreStop钩子失败, 容器将会被kill。
用户应该使他们的钩子处理程序尽可能的轻量。
3、基于PostStart演示
如果PostStart或者PreStop钩子失败,它会杀死容器。所以我们应该让钩子函数尽可能的轻量。当然有些情况下,长时间运行命令是合理的,比如在停止容器之前预先保留状态。
1.我们echo一段话追加到/tmp/message,在Pod启动前操作
cat >>hook_test.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
name: hook-demo1
spec:
containers:
- name: hook-demo1
image: nginx
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo 1 > /tmp/message"]
EOF
2.应用hook_test.yaml
$ kubectl apply -f hook_test.yaml
3.可以通过下面查看结果
$ kubectl get pods | grep hook-demo1
hook-demo1 1/1 Running 0 49s
$ kubectl exec -it hook-demo1 /bin/bash
root@hook-demo1:/# cat /tmp/message
1
4、基于PreStop演示
下面示例中,定义一个Nginx Pod,设置了PreStop钩子函数,即在容器退出之前,优雅的关闭Nginx。
cat >>hook_test.yaml<<EOF
apiVersion: v1
kind: Pod
metadata:
name: hook-demo2
spec:
containers:
- name: hook-demo2
image: nginx
lifecycle:
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
EOF
5、优雅停止Java应用
我们都知道java应用的启动和停止都需要时间,为了更加优雅的停止,可以通过pidof
获取到java进程ID,循环通过kill
命令往PID发送SIGTERM信号。
lifecycle:
preStop:
exec:
command: ["/bin/bash","-c","PID=`pidof java` && kill -SIGTERM $PID && while ps -p $PID > /dev/null;do sleep 1; done;"]
Kubernetes Pod钩子的更多相关文章
- pod(五):pod hook(pod钩子)和优雅的关闭nginx pod
目录 一.系统环境 二.前言 三.pod hook(pod钩子) 四.如何优雅的关闭nginx pod 一.系统环境 服务器版本 docker软件版本 Kubernetes(k8s)集群版本 CPU架 ...
- Kubernetes Pod 驱逐详解
原文链接:Kubernetes Pod 驱逐详解 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 ...
- Kubernetes Pod 镜像拉取策略
Kubernetes Pod 镜像拉取策略 官方文档:https://kubernetes.io/docs/concepts/containers/images/ • IfNotPresent:默认值 ...
- Kubernetes Pod 资源限制
Kubernetes Pod 资源限制 官方文档:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources- ...
- Kubernetes Pod 调度约束
Kubernetes Pod 调度约束 可以将pod调度到指定的节点Node内 默认:根据节点资源利用率等分配Node节点. nodeName用于将Pod调度到指定的Node名称上 nodeSelec ...
- Kubernetes Pod故障归类与排查方法
Pod概念 Pod是kubernetes集群中最小的部署和管理的基本单元,协同寻址,协同调度. Pod是一个或多个容器的集合,是一个或一组服务(进程)的抽象集合. Pod中可以共享网络和存储(可以简单 ...
- Python Django撸个WebSSH操作Kubernetes Pod(下)- 终端窗口自适应Resize
追求完美不服输的我,一直在与各种问题斗争的路上痛并快乐着 上一篇文章Django实现WebSSH操作Kubernetes Pod最后留了个问题没有解决,那就是terminal内容窗口的大小没有办法调整 ...
- Kubernetes Pod 全面知识
Pod 是在 Kubernetes 中创建和管理的.最小的可部署的计算单元,是最重要的对象之一.一个 Pod 中包含一个或多个容器,这些容器在 Pod 中能够共享网络.存储等环境. 学习 Kubern ...
- (五)Kubernetes Pod状态和生命周期管理
什么是Pod Pod是kubernetes中你可以创建和部署的最小也是最简的单位.Pod代表着集群中运行的进程. Pod中封装着应用的容器(有的情况下是好几个容器),存储.独立的网络IP,管理容器如何 ...
随机推荐
- 借助Redis完成延时任务
背景 相信我们或多或少的会遇到类似下面这样的需求: 第三方给了一批数据给我们处理,我们处理好之后就通知他们处理结果. 大概就是下面这个图说的. 本来在处理完数据之后,我们就会马上把处理结果返回给对方, ...
- 波兰政府在继韩国之后也增加了对 Linux 的使用
导读 前段时间, 韩国政府起草了一项战略,准备采用基于 Linux 的开源操作系统全面取代 Windows 7,以摆脱对其的依赖. 目前,波兰的社会保险公司 ZUS( Zakład Ubezpiecz ...
- css中:overflow:hidden清除浮动的原理
要想彻底清除浮动的影响,适合的属性不是 clear 而是 overflow. 一般使用 overflow:hidden,利用 BFC 的“结界”特性彻底解决浮动对外部或兄弟元素的影响. 1. 前言: ...
- Hadoop集群搭建(四)~centos6.8关闭防火墙
一.centos关闭防火墙 1,关闭防火墙.service iptables stop 2,关闭防火墙开机自启.chkconfig iptables off 3,查看防火墙状态.service ipt ...
- js遍历删除对象的key
// 如果用户没有填写值,则删除对象的key. Object.keys(obj).forEach( (key) => { if (!obj[key]) { // !obj[key]表示 ...
- 面试刷题11:java系统中io的分类有哪些?
随着分布式技术的普及和海量数据的增长,io的能力越来越重要,java提供的io模块提供了足够的扩展性来适应. 我是李福春,我在准备面试,今天的问题是: java中的io有哪几种? java中的io分3 ...
- 贵州省网络安全知识竞赛团体赛Writeup-phpweb部分
0x01 混淆后门#conn.php 首先还是拖到D盾扫描 打开conn.php发现底部有那么一串代码: 对这个代码进行分析 首先可以对几个比较简单的变量输出看一下 $s输出内容为create_fun ...
- Linux Namespace 入门系列:Namespace API
Linux Namespace 是 Linux 提供的一种内核级别环境隔离的方法.用官方的话来说,Linux Namespace 将全局系统资源封装在一个抽象中,从而使 namespace 内的进程认 ...
- leetcode 945. 使数组唯一的最小增量
题目 给定整数数组 A,每次 move 操作将会选择任意 A[i],并将其递增 1. 返回使 A 中的每个值都是唯一的最少操作次数. 示例 1: 输入:[1,2,2] 输出:1 解释:经过一次 mov ...
- windows10删除用户头像
点击开始菜单,然后这里我们点击最上方的用户,弹出的界面,点击这里的更改帐户设置,大家如图进行操作,点击这里即可. 这里我们通过浏览可以修改自己的账户头像,问题是怎么删除这里使用过的账户头像呢?这里 ...