Pod 什么时候被销毁?
When does a Pod get destroyed?
Pod 生命周期由数据平面中的 Kubelet 管理。
根据定义:如果 liveness 探测失败,kubelet 将杀死容器
Pod 只是一个带有专用网络命名空间和 IPC 命名空间的容器,带有一个沙箱容器。
比如说,如果 Pod 是单个应用程序容器 Pod,那么在活动失败时:
- kubelet 会杀死 Pod 吗?
或
- kubelet 是否会(仅)杀死 Pod 中的容器?
pod 确实是 Kubernetes 中最小的元素,但这并不意味着它实际上是没有容器的“空”。
为了生成一个 pod 以及附加更多容器所需的容器元素,使用 pause
图像创建了一个非常小的容器。
这用于分配一个 IP,然后用于 Pod。
之后启动为 pod 声明的初始容器或运行时容器。
如果lifeness探测失败,容器会重启。 pod 幸免于难。这甚至很重要:之后您可能想获取 crashed/restarted 容器的日志。如果 pod 被销毁并重新创建,这是不可能的。
kubelet 使用 liveness 探测器来了解何时重启容器(不是 整个 Pod)。如果 liveness 探测失败,kubelet 会杀死容器,然后容器可能会重新启动,但这取决于它的 restart policy.
我创建了一个简单示例来演示其工作原理。
首先,我创建了一个带有两个容器(web
和 db
)的 app-1
Pod。
web
容器配置了 liveness 探测,总是失败,因为 /healthz
路径没有配置。
$ cat app-1.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: app-1
name: app-1
spec:
containers:
- image: nginx
name: web
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
- image: postgres
name: db
env:
- name: POSTGRES_PASSWORD
value: example
应用上述清单并等待一段时间后,我们可以描述 app-1
Pod 以检查是否只有 web
容器已重启,db
容器 运行 不间断:
注意: 我只提供了来自 kubectl describe pod app-1
命令的重要信息,而不是整个输出。
$ kubectl apply -f app-1.yml
pod/app-1 created
$ kubectl describe pod app-1
Name: app-1
...
Containers:
web:
...
Restart Count: 4 <--- Note that the "web" container was restarted 4 times
Liveness: http-get http://:8080/healthz delay=0s timeout=1s period=10s #success=1 #failure=3
...
db:
...
Restart Count: 0 <--- Note that the "db" container works fine
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
...
Normal Killing 78s (x2 over 108s) kubelet Container web failed liveness probe, will be restarted
...
我们可以连接到db
容器看看是不是运行:
注意:即使重新启动 web
容器,我们也可以使用db
容器。
$ kubectl exec -it app-1 -c db -- bash
root@app-1:/#
相比之下,连接到web
容器后,我们可以观察到liveness probe重启了这个容器:
$ kubectl exec -it app-1 -c web -- bash
root@app-1:/# command terminated with exit code 137
Pod 生命周期由数据平面中的 Kubelet 管理。
根据定义:如果 liveness 探测失败,kubelet 将杀死容器
Pod 只是一个带有专用网络命名空间和 IPC 命名空间的容器,带有一个沙箱容器。
比如说,如果 Pod 是单个应用程序容器 Pod,那么在活动失败时:
- kubelet 会杀死 Pod 吗?
或
- kubelet 是否会(仅)杀死 Pod 中的容器?
pod 确实是 Kubernetes 中最小的元素,但这并不意味着它实际上是没有容器的“空”。
为了生成一个 pod 以及附加更多容器所需的容器元素,使用 pause
图像创建了一个非常小的容器。
这用于分配一个 IP,然后用于 Pod。
之后启动为 pod 声明的初始容器或运行时容器。
如果lifeness探测失败,容器会重启。 pod 幸免于难。这甚至很重要:之后您可能想获取 crashed/restarted 容器的日志。如果 pod 被销毁并重新创建,这是不可能的。
kubelet 使用 liveness 探测器来了解何时重启容器(不是 整个 Pod)。如果 liveness 探测失败,kubelet 会杀死容器,然后容器可能会重新启动,但这取决于它的 restart policy.
我创建了一个简单示例来演示其工作原理。
首先,我创建了一个带有两个容器(web
和 db
)的 app-1
Pod。
web
容器配置了 liveness 探测,总是失败,因为 /healthz
路径没有配置。
$ cat app-1.yml
apiVersion: v1
kind: Pod
metadata:
labels:
run: app-1
name: app-1
spec:
containers:
- image: nginx
name: web
livenessProbe:
httpGet:
path: /healthz
port: 8080
httpHeaders:
- name: Custom-Header
value: Awesome
- image: postgres
name: db
env:
- name: POSTGRES_PASSWORD
value: example
应用上述清单并等待一段时间后,我们可以描述 app-1
Pod 以检查是否只有 web
容器已重启,db
容器 运行 不间断:
注意: 我只提供了来自 kubectl describe pod app-1
命令的重要信息,而不是整个输出。
$ kubectl apply -f app-1.yml
pod/app-1 created
$ kubectl describe pod app-1
Name: app-1
...
Containers:
web:
...
Restart Count: 4 <--- Note that the "web" container was restarted 4 times
Liveness: http-get http://:8080/healthz delay=0s timeout=1s period=10s #success=1 #failure=3
...
db:
...
Restart Count: 0 <--- Note that the "db" container works fine
...
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
...
Normal Killing 78s (x2 over 108s) kubelet Container web failed liveness probe, will be restarted
...
我们可以连接到db
容器看看是不是运行:
注意:即使重新启动 web
容器,我们也可以使用db
容器。
$ kubectl exec -it app-1 -c db -- bash
root@app-1:/#
相比之下,连接到web
容器后,我们可以观察到liveness probe重启了这个容器:
$ kubectl exec -it app-1 -c web -- bash
root@app-1:/# command terminated with exit code 137