钩子函数

钩子函数能够感知自身生命周期中的事件,并在相应的时刻到来时运行用户指定的程序代码。

kubernetes在主容器的启动之后(postStart)停止之前(preStop)提供了两个钩子函数:

  • postStart:容器初始化环境后容器启动命令执行前执行,注意由于是与启动命令异步执行,它无法保证一定在 ENTRYPOINT 之前运行完毕。如果失败,容器会被杀死,并根据 RestartPolicy 决定是 否重启
  • preStop :容器终止前执行,常用于资源清理。执行完成之后容器将成功终止,如果失败,容器同样也会被杀死。在其完成之前会阻塞删除容器的操作

钩子处理器支持使用下面三种方式定义动作:

  • Exec命令:在容器内执行一次命令

    1
    2
    3
    4
    5
    6
    7
    8
    ……
    lifecycle:
    postStart:
    exec:
    command:
    - cat
    - /tmp/healthy
    ……
  • TCPSocket:在当前容器尝试访问指定的socket

    1
    2
    3
    4
    5
    6
    ……      
    lifecycle:
    postStart:
    tcpSocket:
    port: 8080
    ……
  • HTTPGet:在当前容器中向某url发起http请求

    1
    2
    3
    4
    5
    6
    7
    8
    9
    ……
    lifecycle:
    postStart:
    httpGet:
    path: / #URI地址
    port: 80 #端口号
    host: 127.0.0.1 #主机地址
    scheme: HTTP #支持的协议,http或者https
    ……

接下来,以exec方式为例,演示下钩子函数的使用,创建pod-hook-exec.yaml文件,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: Pod
metadata:
name: pod-hook-exec
namespace: dev
spec:
containers:
- name: main-container
image: nginx:1.17.1
ports:
- name: nginx-port
containerPort: 80
lifecycle:
postStart:
exec: # 在容器启动的时候执行一个命令,修改掉nginx的默认首页内容
command: ["/bin/sh", "-c", "echo postStart... > /usr/share/nginx/html/index.html"]
preStop:
exec: # 在容器停止之前停止nginx服务
command: ["/usr/sbin/nginx","-s","quit"]
1
2
3
4
5
6
7
8
9
10
11
12
# 创建pod
[root@master ~]# kubectl create -f pod-hook-exec.yaml
pod/pod-hook-exec created

# 查看pod
[root@master ~]# kubectl get pods 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 22s 10.244.1.36 node1 <none> <none>

# 访问pod
[root@master ~]# curl 10.244.1.36
postStart...