POD 资源钩子函数概念
在 Kubernetes 中,Pod 资源的钩子函数(Lifecycle Hooks)是一组可以在 Pod 的生命周期中插入自定义逻辑的回调函数。这些钩子函数允许你在 Pod 的不同阶段执行特定的操作,如在容器启动之前或之后运行脚本、发送通知等
Kubernetes 提供了以下四个钩子函数:
- PostStart:在容器启动之后立即执行的钩子函数。它可以用于执行一些初始化任务、加载配置或发送启动通知等操作。
- PreStop:在容器终止之前执行的钩子函数。它可以用于执行一些清理任务、保存状态或发送终止通知等操作。
- PreStartContainer:在容器启动之前执行的钩子函数。它可以用于在容器启动之前执行一些预处理任务,如配置检查、准备文件等操作。
- PostStartContainer:在容器启动之后执行的钩子函数。它可以用于在容器启动后执行一些操作,如健康检查、注册服务等。
这些钩子函数可以在 Pod 的配置中的 lifecycle
字段中定义。下面是一个示例:
钩子函数配置语法
[root@k8s-master ~]# kubectl explain pod.spec.containers.lifecycle
[root@k8s-master ~]# kubectl explain pod.spec.containers.lifecycle.postStart
[root@k8s-master ~]# kubectl explain pod.spec.containers.lifecycle.preStop
KIND: Pod
VERSION: v1
RESOURCE: lifecycle <Object>
FIELDS:
postStart <Object> //定义容器启动后执行的钩子函数
exec <Object> //exec命令方式,在容器里面执行相应的命令
command <[]string> //指定运行的命令
httpGet <Object> //httpGet方式,探测容器应用的url
host <string> //主机地址,一般就是pod地址
path <string> //请求的url路径
port <string> //应用端口号
scheme <string> //协议
tcpSocket <Object> //tcpSocket方式,访问容器指定的socket
host <string> //pod地址
port <string> //端口号
preStop <Object> //定期容器关闭前执行的钩子函数
exec <Object> //exec命令方式,在容器里面执行相应的命令
·····
httpGet <Object> //httpGet方式,探测容器应用的url
·····
tcpSocket <Object> //tcpSocket方式,访问容器指定的socket
·····
postStart 和 preStop的子配置语法都一致
钩子处理器支持命令
exec 命令:在容器内执行一次命令
lifecycle:
postStart:
exec:
command:
- cat #命令和参数可以写在一行也可以分开写
- /tmp/healthy
TCPSocket:在当前容器尝试访问指定的 socket
lifecycle:
postStart:
tcpSocket:
port: 8080
HTTPGet:在当前容器中向某个 url 发起 http 请求
lifecycle:
postStart:
httpGet:
path: /
port: 80
host: 192.168.10.111
scheme: HTTP
案例
配置钩子函数在 nginx 容器启动后创建一个首页文件,并在关闭时正确退出nginx
1.编写yaml
[root@k8s-master ~]# vim pod-hook-exec.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-hook-exec
namespace: dev
labels:
app: base
spec:
containers:
- name: main-container
image: nginx:1.18
ports:
- name: nginx-port
containerPort: 80
protocol: TCP
lifecycle: #定义钩子配置
postStart: #定义容器启动后的钩子函数
exec: #采用exec命令方式
command: ["/bin/sh","-c","echo postStart... > /usr/share/nginx/html/index.html"] #创建一个首页文件
preStop: #定义容器退出前的钩子函数
exec: #采用exec命令方式
command: ["/usr/sbin/nginx","-s","quit"] #退出nginx
2.创建pod
[root@k8s-master ~/k8s_1.19_yaml]# kubectl create -f pod-hook-exec.yaml
pod/pod-hook-exec created
3.查看pod是否运行
[root@k8s-master ~/k8s_1.19_yaml]# kubectl get pod pod-hook-exec -n dev -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
pod-hook-exec 1/1 Running 0 23s 10.244.3.22 k8s-node2 <none> <none>
4.访问容器中的nginx查看首页是否是容器启动后执行的钩子函数
[root@k8s-master ~]# curl 10.244.3.22
postStart...