PostStart 钩子

顾名思义,这个钩子允许你在容器 启动后 ,执行一些逻辑

有三点需要重点解释

  1. postStart 和 容器的主线程 是 异步执行的,并不是 在主线程启动之后,它们是 同时启动的
  2. postStart 运行结束以前,容器会处于pending状态
  3. 钩子的语义中含有 “至少执行一次” 的意思,所以如果 重复 执行钩子会对系统造成影响,需要慎重考虑

对于第一个问题

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钩子是异步,同时启动的

Send a Message