前言
钩子函数对于程序员来说并不陌生,比如我们java中常用的过滤器、拦截器都可以称作为一个钩子函数。指在自身生命周期过程中需要做的事情。
K8s对于Pod中的主容器提供了两个钩子函数
Post start容器创建后执行
Pre stop容器终止前执行
与Pod的健康检查一样。可以使用 exec、tcpSocket、httpGet
下面我们来使用一下钩子函数。
使用
在生产环境中,应用启动后通常需要将服务注册才能使用。应用终止前,由于可能有大量的用户正在办理业务。需要等他们办理完才能停止。这段期间需要阻止有新的业务进来。通常我们把它叫做优雅停机。
在这里就不写java程序来演示,直接使用nginx镜像模拟,容器启动后生成一个running.html内容为Runnning,容器终止前修改running.html内容为Stopping,并且等待10秒后才能真正终止。
apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command:
- "/bin/sh"
- "-c"
- "echo Running > /usr/share/nginx/html/running.html"
preStop:
exec:
command:
- "/bin/sh"
- "-c"
- "echo 'Stopping' > /usr/share/nginx/html/running.html; sleep 10"
启动Pod,观察服务状态,停止Pod观察服务状态与停止过程
# 启动
[root@master cycle]# kubectl create -f kube-nginx.yml
pod/nginx created
# 查看当前服务状态
[root@master ~]# kubectl exec -it nginx -- curl 127.0.0.1/running.html
Running
# 停止,注意这里停止我们设置了休眠10s,所以新打开一个终端查看状态
[root@master cycle]# kubectl delete -f kube-nginx.yml
# 新打开一个终端查看状态
[root@master ~]# kubectl exec -it nginx -- curl 127.0.0.1/running.html
Stopping
#观察停止过程,这里我删掉启动过程,只暂时 Stopping
[root@master ~]# kubectl describe pod nginx|grep -A 100 Event
Normal Killing 7s kubelet Stopping container nginx
[root@master ~]# kubectl describe pod nginx|grep -A 100 Events
Normal Killing 10s kubelet Stopping container nginx
[root@master ~]# kubectl describe pod nginx|grep -A 100 Events
Error from server (NotFound): pods "nginx" not found
从上面结果可以看出,容器运行后postStart也运行了,在delete Pod时。等待了十秒钟才删除,并且这十秒期间服务状态为Stopping,不在对外提供流量。
Pod的钩子函数就介绍到这里了,下期对Pod的生命周期做一个总结。
欢迎关注,学习不迷路!