PostStart
容器生命週期鉤子(Container Lifecycle Hooks
)監聽容器生命週期的特定事件,並在事件發生時
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: ["/usr/sbin/nginx","-s","quit"]
執行已註冊的回調函數。支持兩種鉤子:
postStart
: 容器啓動後執行,注意由於是異步執行,它無法保證一定在ENTRYPOINT之後運行。如果失敗,容器會被殺死,並根據RestartPolicy決定是否重啓preStop
:容器停止前執行,常用於資源清理。如果失敗,容器同樣也會被殺死
而鉤子的回調函數支持兩種方式:
exec
:在容器內執行命令httpGet
:向指定URL發起GET請求
關於postStart
異步執行測試
apiVersion: v1
kind: Pod
metadata:
name: test-post-start
spec:
containers:
- name: test-post-start-container
image: busybox
command: ["/bin/sh", "-c", "sleep 5 && echo $(date) 'written by entrypoint' >> log.log && sleep 600"]
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "sleep 10 && echo $(date) 'written by post start' >> log.log"]
創建上面的pod
,通過進入pod
,查看log.log
打印日誌,證明:
- PostStart是否會擋住主進程的啓動
- PostStart是否是異步執行
如果 PostStart 會阻擋 ENTRYPOINT 的啓動,則日誌文件內容應該是:
(時間點 T)written by post start
(時間點 T + 約 10 秒)written by entrypoint
否則內容應該是:
(時間點 T)written by entrypoint
(時間點 T + 約 5 秒)written by post start
```log
實驗結果:
```log
/ # cat log.log
Thu Jun 4 06:14:50 UTC 2020 written by entrypoint
Thu Jun 4 06:14:55 UTC 2020 written by post start
修改YML
apiVersion: v1
kind: Pod
metadata:
name: test-post-start
spec:
containers:
- name: test-post-start-container
image: busybox
command: ["/bin/sh", "-c", "sleep 15 && echo $(date) 'written by entrypoint' >> log.log && sleep 600"]
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "sleep 10 && echo $(date) 'written by post start' >> log.log"]
如果 PostStart 不是異步執行,則日誌文件內容應該是:
(時間點 T)written by entrypoint
(時間點 T + 約 5 秒)written by post start
```log
否則內容應該是:
```log
(時間點 T)written by post start
(時間點 T + 約 5 秒)written by entrypoint
實驗結果:
[root@master k8s]# kubectl exec -it test-post-start sh
/ # cat log.log
Thu Jun 4 06:17:54 UTC 2020 written by post start
Thu Jun 4 06:17:59 UTC 2020 written by entrypoint
/ #
實驗結論
- PostStart不會擋住主進程的啓動
- PostStart是異步執行