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

image

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

主机配置规划

服务器名称(hostname) 系统版本 配置 内网IP 外网IP(模拟)
k8s-master CentOS7.7 2C/4G/20G 172.16.1.110 10.0.0.110
k8s-node01 CentOS7.7 2C/4G/20G 172.16.1.111 10.0.0.111
k8s-node02 CentOS7.7 2C/4G/20G 172.16.1.112 10.0.0.112

Pod容器生命周期

image

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文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
[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状态

1
2
3
4
5
[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详情

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
[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查看输出信息如下:

1
2
3
4
5
[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

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

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

1
2
3
4
5
6
[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 事件。

完毕!


<-------------the end------------->
lightzhang wechat
欢迎扫一扫,订阅我的微信公众号!
坚持原创分享,你的支持就是我最大的动力!