顾名思义,这个钩子允许你在容器 启动后 ,执行一些逻辑
有三点需要重点解释
- postStart 和 容器的主线程 是 异步执行的,并不是 在主线程启动之后,它们是 同时启动的
- postStart 运行结束以前,容器会处于pending状态
- 钩子的语义中含有 “至少执行一次” 的意思,所以如果 重复 执行钩子会对系统造成影响,需要慎重考虑
对于第一个问题
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
lifecycle:
postStart:
exec:
command:
- sh
- -c
- date "+%Y-%m-%d %H:%M:%S" > /datetmp.txt && sleep 30
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
readinessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 30
可以看到 postStart的启动时间和容器的启动时间是相同的
因为我当前系统时间是 utc+8,所以 datetmp 中是 9点23,Nginx控制台日志中是 17点23,但是它们确实同一时间启动,而不是等到主线程之后启动
对于第二个问题
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
lifecycle:
postStart:
exec:
command:
- sh
- -c
- echo "postStart postStart postStart" && sleep infinity
ports:
- containerPort: 80
livenessProbe:
httpGet:
path: /
port: 80
initialDelaySeconds: 30
readinessProbe:
httpGet:
path: /
port: 80
scheme: HTTP
initialDelaySeconds: 30
PostStart 钩子 的 等待状态 和 就绪探针的区别在于
它并不承认 容器已经 启动
注意启动状态 started 是 false , 而就绪探针的 started 状态是 true
单Pod装在3个container的情况下,这3个container的PostStart钩子和容器的3个主线,6个脚本,会同时启动
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 1
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
lifecycle:
postStart:
exec:
command:
- sh
- -c
- echo "postStart postStart postStart" && sleep 30
- name: u1
command:
- sleep
- infinity
image: ubuntu
lifecycle:
postStart:
exec:
command:
- sh
- -c
- date "+%Y-%m-%d %H:%M:%S" >> /datetmp.txt
- name: u2
command:
- sleep
- infinity
image: ubuntu
lifecycle:
postStart:
exec:
command:
- sh
- -c
- date "+%Y-%m-%d %H:%M:%S" >> /datetmp.txt
这里 ubuntu 容器阻塞30秒,但是Nginx阻塞永远,结果是这个Pod上的3个容器,同时,都无法成功启动
所以说,postStart钩子虽然是作用在容器上的,但是它会影响到所在pod上的其他容器
将Nginx阻塞改为30秒,ubuntu改为5秒
可以看到在5秒过后,10秒左右的时候,三个容器仍为starting状态
还可以看到,2个ubuntu上,postStart钩子是异步,同时启动的