pod中钩子函数
参考:https://www.jianshu.com/p/a329a73f3296
http://blog.redrose2100.com/article/263
1.钩子函数介绍
钩子函数对于程序员来说并不陌生,比如我们java中常用的过滤器、拦截器都可以称作为一个钩子函数。指在自身生命周期过程中需要做的事情。
K8s对于Pod中的主容器提供了两个钩子函数
post start:容器创建之后执行,如果失败了会重启容器
pre stop:容器停止之前执行,执行完成之后容器将成功停止,再完成之前会阻塞删除容器的操作
与Pod的健康检查一样。可以使用 exec、tcpSocket、httpGet
2. 钩子函数的使用方式
钩子处理器支持使用如下三种方式定义动作:
2.1 exec命令:在容器内执行一次命令
lifecycle: postStart: exec: command: - cat - /var/lib/redis.conf
2.2 tcpSocket: 在当前容器尝试访问指定的socket
lifecycle: postStart: tcpSocket: port: 8000
2.3 httpGet: 在当前容器中向某url发起http请求
如下,为访问 http://192.168.2.150:80/users
lifecycle: postStart: httpGet: path: /users port: 80 host: 192.168.2.150 scheme: HTTP # 或者HTTPS
以上三种方式第一种使用的比较多,其次是第三种,第二种使用的很少
下面我们来使用一下钩子函数。
案例
在生产环境中,应用启动后通常需要将服务注册才能使用。应用终止前,由于可能有大量的用户正在办理业务。需要等他们办理完才能停止。这段期间需要阻止有新的业务进来。通常我们把它叫做优雅停机。
在这里就不写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,不在对外提供流量。