【原文链接】
一、钩子函数简介
1.1 钩子函数简介
钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码
kubernetes在主容器的启动之后和停止之前提供了两个钩子函数
- post start:容器创建之后执行,如果失败了会重启容器
- pre stop:容器停止之前执行,执行完成之后容器将成功停止,再完成之前会阻塞删除容器的操作
1.2 钩子函数的方式
钩子处理器支持使用如下三种方式定义动作:
- exec命令:在容器内执行一次命令
lifecycle:
postStart:
exec:
command:
- cat
- /var/lib/redis.conf
- tcpSocket: 在当前容器尝试访问指定的socket
lifecycle:
postStart:
tcpSocket:
port: 8000
- 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
以上三种方式第一种使用的比较多,其次是第三种,第二种使用的很少
二、钩子函数的使用
2.1 执行命令方式
编辑pod_hook_command.yaml文件,设置钩子函数,如下:
apiVersion: v1
kind: Namespace
metadata:
name: dev
---
apiVersion: v1
kind: Pod
metadata:
name: nginx
namespace: dev
labels:
user: redrose2100
spec:
containers:
- name: nginx
image: nginx:1.17.1
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","echo 'hello world...' > /opt/demo.txt"]
preStop:
exec:
command: ["/usr/sbin/nginx","-s","quit"]
使用如下命令创建资源
[root@master pod]# kubectl apply -f pod_hook_command.yaml
namespace/dev created
pod/nginx created
[root@master pod]#
这里可以登录容器中查看 /opt/demo.txt文件内容,如下表示已经成功写入
[root@master pod]# kubectl get pod -n dev
NAME READY STATUS RESTARTS AGE
nginx 1/1 Running 0 26m
[root@master pod]#
[root@master pod]#
[root@master pod]# kubectl exec nginx -n dev -it -c nginx /bin/sh
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
# cat /opt/demo.txt
hello world...
#
使用如下命令删除资源
[root@master pod]# kubectl delete -f pod_hook_command.yaml
namespace "dev" deleted
pod "nginx" deleted
[root@master pod]#
验证socket和http的方式与命令方式类似,使用最多的就是使用命令的方式,其次是http的方式,socket的方式使用的场景比较少