Kubernetes K8S之Pod 生命周期与postStart、preStop事件

Kubernetes 支持 postStart 和 preStop 事件。当一个主容器启动后,Kubernetes 将立即发送 postStart 事件;在主容器被终结之前,Kubernetes 将发送一个 preStop 事件。

主机配置规划

Kubernetes K8S之Pod 生命周期与postStart、preStop事件

Pod容器生命周期

Kubernetes K8S之Pod 生命周期与postStart、preStop事件

Pause容器说明

每个Pod里运行着一个特殊的被称之为Pause的容器,其他容器则为业务容器,这些业务容器共享Pause容器的网络栈和Volume挂载卷,因此他们之间通信和数据交换更为高效。在设计时可以充分利用这一特性,将一组密切相关的服务进程放入同一个Pod中;同一个Pod里的容器之间仅需通过localhost就能互相通信。

kubernetes中的pause容器主要为每个业务容器提供以下功能:

  • PID命名空间:Pod中的不同应用程序可以看到其他应用程序的进程ID。
  • 网络命名空间:Pod中的多个容器能够访问同一个IP和端口范围。
  • IPC命名空间:Pod中的多个容器能够使用SystemV IPC或POSIX消息队列进行通信。
  • UTS命名空间:Pod中的多个容器共享一个主机名;Volumes(共享存储卷)。
  • Pod中的各个容器可以访问在Pod级别定义的Volumes。
主容器生命周期事件的处理函数

Kubernetes 支持 postStart 和 preStop 事件。当一个主容器启动后,Kubernetes 将立即发送 postStart 事件;在主容器被终结之前,Kubernetes 将发送一个 preStop 事件。

postStart 和 preStop 处理函数示例

pod yaml文件

[root@k8s-master lifecycle]# pwd  /root/k8s_practice/lifecycle  [root@k8s-master lifecycle]# cat lifecycle-events.yaml  apiVersion: v1  kind: Pod  metadata:    name: lifecycle-demo-pod    namespace: default    labels:      test: lifecycle  spec:    containers:    - name: lifecycle-demo      image: registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17      imagePullPolicy: IfNotPresent      lifecycle:        postStart:          exec:            command: ["/bin/sh", "-c", "echo 'Hello from the postStart handler' >> /var/log/nginx/message"]        preStop:          exec:            command: ["/bin/sh", "-c", "echo 'Hello from the preStop handler'   >> /var/log/nginx/message"]      volumeMounts:         #定义容器挂载内容      - name: message-log   #使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的nginx-site这个存储卷        mountPath: /var/log/nginx/  #挂载至容器中哪个目录        readOnly: false             #读写挂载方式,默认为读写模式false    initContainers:    - name: init-myservice      image: registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24      command: ["/bin/sh", "-c", "echo 'Hello initContainers'   >> /var/log/nginx/message"]      volumeMounts:         #定义容器挂载内容      - name: message-log   #使用的存储卷名称,如果跟下面volume字段name值相同,则表示使用volume的nginx-site这个存储卷        mountPath: /var/log/nginx/  #挂载至容器中哪个目录        readOnly: false             #读写挂载方式,默认为读写模式false    volumes:              #volumes字段定义了paues容器关联的宿主机或分布式文件系统存储卷    - name: message-log   #存储卷名称      hostPath:           #路径,为宿主机存储路径        path: /data/volumes/nginx/log/    #在宿主机上目录的路径        type: DirectoryOrCreate           #定义类型,这表示如果宿主机没有此目录则会自动创建  

启动pod,查看pod状态

[root@k8s-master lifecycle]# kubectl apply -f lifecycle-events.yaml  pod/lifecycle-demo-pod created  [root@k8s-master lifecycle]# kubectl get pod -o wide  NAME                 READY   STATUS    RESTARTS   AGE   IP            NODE         NOMINATED NODE   READINESS GATES  lifecycle-demo-pod   1/1     Running   0          5s    10.244.2.30   k8s-node02   <none>           <none>  

查看pod详情

[root@k8s-master lifecycle]# kubectl describe pod lifecycle-demo-pod  Name:         lifecycle-demo-pod  Namespace:    default  Priority:     0  Node:         k8s-node02/172.16.1.112  Start Time:   Sat, 23 May 2020 22:08:04 +0800  Labels:       test=lifecycle  ………………  Init Containers:    init-myservice:      Container ID:  docker://1cfabcb60b817efd5c7283ad9552dafada95dbe932f92822b814aaa9c38f8ba5      Image:         registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24      Image ID:      docker-pullable://registry.cn-beijing.aliyuncs.com/ducafe/busybox@sha256:f73ae051fae52945d92ee20d62c315306c593c59a429ccbbdcba4a488ee12269      Port:          <none>      Host Port:     <none>      Command:        /bin/sh        -c        echo 'Hello initContainers'   >> /var/log/nginx/message      State:          Terminated        Reason:       Completed        Exit Code:    0        Started:      Sat, 23 May 2020 22:08:06 +0800        Finished:     Sat, 23 May 2020 22:08:06 +0800      Ready:          True      Restart Count:  0      Environment:    <none>      Mounts:        /var/log/nginx/ from message-log (rw)        /var/run/secrets/kubernetes.io/serviceaccount from default-token-v48g4 (ro)  Containers:    lifecycle-demo:      Container ID:   docker://c07f7f3d838206878ad0bfeaec9b4222ac7d6b13fb758cc1b340ac43e7212a3a      Image:          registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17      Image ID:       docker-pullable://registry.cn-beijing.aliyuncs.com/google_registry/nginx@sha256:7ac7819e1523911399b798309025935a9968b277d86d50e5255465d6592c0266      Port:           <none>      Host Port:      <none>      State:          Running        Started:      Sat, 23 May 2020 22:08:07 +0800      Ready:          True      Restart Count:  0      Environment:    <none>      Mounts:        /var/log/nginx/ from message-log (rw)        /var/run/secrets/kubernetes.io/serviceaccount from default-token-v48g4 (ro)  Conditions:    Type              Status    Initialized       True    Ready             True    ContainersReady   True    PodScheduled      True  Volumes:    message-log:      Type:          HostPath (bare host directory volume)      Path:          /data/volumes/nginx/log/      HostPathType:  DirectoryOrCreate    default-token-v48g4:      Type:        Secret (a volume populated by a Secret)      SecretName:  default-token-v48g4      Optional:    false  QoS Class:       BestEffort  Node-Selectors:  <none>  Tolerations:     node.kubernetes.io/not-ready:NoExecute for 300s                   node.kubernetes.io/unreachable:NoExecute for 300s  Events:    Type    Reason     Age        From                 Message    ----    ------     ----       ----                 -------    Normal  Scheduled  <unknown>  default-scheduler    Successfully assigned default/lifecycle-demo-pod to k8s-node02    Normal  Pulled     87s        kubelet, k8s-node02  Container image "registry.cn-beijing.aliyuncs.com/google_registry/busybox:1.24" already present on machine    Normal  Created    87s        kubelet, k8s-node02  Created container init-myservice    Normal  Started    87s        kubelet, k8s-node02  Started container init-myservice    Normal  Pulled     86s        kubelet, k8s-node02  Container image "registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17" already present on machine    Normal  Created    86s        kubelet, k8s-node02  Created container lifecycle-demo    Normal  Started    86s        kubelet, k8s-node02  Started container lifecycle-demo  

此时在k8s-node02查看输出信息如下:

[root@k8s-node02 log]# pwd  /data/volumes/nginx/log  [root@k8s-node02 log]# cat message  Hello initContainers  Hello from the postStart handler  

由上可知,init Container先执行,然后当一个主容器启动后,Kubernetes 将立即发送 postStart 事件。

停止该pod

[root@k8s-master lifecycle]# kubectl delete pod lifecycle-demo-pod  pod "lifecycle-demo-pod" deleted  

此时在k8s-node02查看输出信息如下:

[root@k8s-node02 log]# pwd  /data/volumes/nginx/log  [root@k8s-node02 log]# cat message  Hello initContainers  Hello from the postStart handler  Hello from the preStop handler  

由上可知,当在容器被终结之前, Kubernetes 将发送一个 preStop 事件。

完毕!

原文出处:zhangblog -> http://www.zhangblog.com/2020/08/18/kubernetes08/

本站所发布的一切资源仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如果侵犯你的利益,请发送邮箱到 [email protected],我们会很快的为您处理。
超哥软件库 » Kubernetes K8S之Pod 生命周期与postStart、preStop事件