持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第17天,点击查看活动详情
钩子
pod hook(钩子) 是有k8s管理的kubelet发起的. 当容器中的进程启动前或者终止前运行. 这时包含在容器的生命周期之中的,可以同时为pod中的所有容器配置hook
1. 钩子的类型
1) exec: 执行一段命令
2) http: 发送http请求
2. 钩子的案例分析
第一步: 准备资源清单
apiVersion: v1
kind: Pod
metadata:
name: lifecycle-hook-pod
spec:
containers:
- name: lifecycle-hook-container
image: wangyanglinux/myapp:v1
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo Hello from the poststop handler > /usr/share/message"]
解析一下这个资源清单
-
spec中创建了一个容器,容器名是lifecycle-hook-container, 使用的镜像是wangyanglinux/myapp:v1, 镜像的策略是IfNotPresent
-
lifecycle定义了lifecycle-hook-container这个容器的生命周期
-
postStart: 开始前钩子函数
-
exec: 代表执行脚本
- command: 执行脚本的命令. 命令是像/usr/share/message文件中打印一句话"echo Hello from the postStart handler"
-
-
preStop: 停止前钩子函数
-
exec: 表示结束前使用的钩子函数也是脚本
- command: 表示执行的脚本明星. 命令是想/usr/share/message中打印一句话, 内容是"echo Hello from the poststop handler"
-
-
-
资源清单分析: 这个pod创建以后, 会创建一个应用容器, 这个容器有一个开始前钩子和结束前钩子. 钩子的内容都是像文件中打印一段文本.
第二步: 创建pod
kubectl create -f lifecycle-hook-pod.yaml
然后进入到pod的容器里面,可以看到文件中已经打印了启动前的脚本内容
kubectl exec lifecycle-hook-pod -c lifecycle-hook-container -it -- /bin/sh
可以看到启动前脚本已经执行了. 对于启动后脚本,我们可以通过无限循环打印文件内容来看效果.
while 2>1;
do
cat /usr/share/message
done
另起一个终端, 执行delete pod的命令
kubectl delete lifecycle-hook-pod
这时看另一个终端的情况
终端可以看到, 在终止之前打印了终止前脚本. 因为是无限循环打印未见, 所以会看到打印了很多次.
\