10.postStart和preStop

使用postStart和preStop的案例代码如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17

apiVersion: v1
kind: Pod
metadata:
  name: lifecycle-demo
spec:
  containers:
  - name: lifecycle-demo-container
    image: nginx
    lifecycle:
      postStart:
        exec:
          command: ["/bin/sh", "-c", "echo Hello from the postStart handler > /usr/share/message"]
      preStop:
        exec:
          command: ["/bin/sh","-c","nginx -s quit; while killall -0 nginx; do sleep 1; done"]

相关实验代码如下:

1
2
3
4
5
6
7
8

kubectl apply -f lifecycle-demo.yaml
kubectl get pod lifecycle-demo
kubectl exec -it lifecycle-demo -- /bin/bash

# 在容器内执行
cat /usr/share/message

注意事项:

  1. Kubernetes在容器启动后立刻发送postStart事件,并不确保postStart事件处理程序在容器的EntryPoint之前执行
  2. postStart事件处理程序相对于容器中的进程来说是异步的
  3. Kubernetes在管理容器时,将一直等到postStart事件处理程序结束之后,才会将容器的状态标记为Running
  4. Kubernetes在决定关闭容器时,立刻发送preStop事件,并且,将一直等到preStop事件处理程序结束或者Pod 的--grace-period超时,才删除容器。

小结

其实相关技术我可能用的会比较少,我目前并没有使用postStart和preStop的需求。