POD 资源钩子函数概念

在 Kubernetes 中,Pod 资源的钩子函数(Lifecycle Hooks)是一组可以在 Pod 的生命周期中插入自定义逻辑的回调函数。这些钩子函数允许你在 Pod 的不同阶段执行特定的操作,如在容器启动之前或之后运行脚本、发送通知等

Kubernetes 提供了以下四个钩子函数:

  1. PostStart:在容器启动之后立即执行的钩子函数。它可以用于执行一些初始化任务、加载配置或发送启动通知等操作。
  2. PreStop:在容器终止之前执行的钩子函数。它可以用于执行一些清理任务、保存状态或发送终止通知等操作。
  3. PreStartContainer:在容器启动之前执行的钩子函数。它可以用于在容器启动之前执行一些预处理任务,如配置检查、准备文件等操作。
  4. 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...