k8s 使用 pod hook 钩子函数

警告
本文最后更新于 2022-11-10 14:04,文中内容可能已过时。

这个钩子在创建容器之后立即执行。 但是,并不能保证钩子在容器本身的初始命令 (ENTRYPOINT) 之前运行。 主要用于资源部署、环境准备等。不过需要注意的是如果钩子花费时间过长以及于不能运行或者挂起,容器将不能达到 Running 状态。

yaml 举例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
  name: start-hook
  labels:
    app: test
spec:
  containers:
  - name: start-hook
    image: nginx
    ports:
    - name: nginx-port
      containerPort: 80
    lifecycle:
      postStart:
        exec:
          command: ["/bin/bash", "-c", "echo before running > /postStart.txt"]

在容器终止之前立即调用此钩子。 它是阻塞的,所以只有此钩子执行完后,才会执行删除容器的操作

主要用于优雅关闭应用程序、通知其他系统等。如果钩子在执行期间挂起,Pod 阶段将停留在 Running 状态并且不会达到 failed 状态

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
apiVersion: v1
kind: Pod
metadata:
  name: stop-hook
  labels:
    app: test
spec:
  containers:
  - name: stop-hook
    image: nginx
    ports:
    - name: nginx-port
      containerPort: 80
    lifecycle:
      preStop:
        exec:
          command: ["/usr/sbin/nginx", "-s", "quit"]

优雅退出: 当 pod 被删除时,会处于 Terminating 状态,同时会将他从 ep 中摘除,kube-proxy 更新 ipvs 规则摘除流量,也就是说这个 pod 就不会再有新的请求进来了。那么如果 preStop 使用了 sleep 30,会等待 30 秒后真正删除 pod,这 30 秒可以用来处理没有处理完的请求

请我喝杯水
SoulChild 微信号 微信号
SoulChild 微信打赏 微信打赏
0%