跳到主要内容

第6章 Pod生命周期

1.什么是Pod的生命周期

1724739726184-3921171a-8453-46d9-b142-3d57808f6ff2.png

相关概念:

init container(初始化容器):

初始化容器是指在主容器启动之前,先启动一个容器来做一些准备工作,比如两个容器做了共享volum,然后可以先启动一个容器来对目录进行更改用户授权。

比如主容器需要连接数据库,可以先使用初始化容器测试可否正常连接数据库,如果可以正常连接再启动主容器。

hook(钩子):

PostStart:在容器启动创建后立刻执行,但是时间不能太长,否则容器将不会是running状态

PreStop:在容器停止被删除前执行,主要用于优雅的关闭应用程序。

liveness probe(存活性探针):

存活性探针,用于确定容器内的应用是否还活着

readiness probe(就绪性探针):

就绪性探针,用于确定容器是否已经准备就绪可以干活了,比如扩容一个Pod,只有等这个Pod里面的应用完全启动了,才会将流量进入。

2.Pod的运行状态

1724739823239-28d38063-23e4-4c24-bd3b-37d8dde6a0eb.png

相关概念:

Pending(挂起):

Pod 已被Kubernetes 系统接受,但有一个或者多个容器尚未创建亦未运行。此阶段包括等待 Pod 被调度的时间和通过网络下载镜像的时间

Running(运行中):

Pod 已经绑定到了某个节点,Pod 中所有的容器都已被创建。至少有一个容器仍在运行,或者正处于启动或重启状态。

Succeeded(成功):

Pod 中的所有容器都已成功终止,并且不会再重启。

Failed(失败):

Pod 中的所有容器都已终止,并且至少有一个容器是因为失败终止。也就是说,容器以非 0 状态退出或者被系统终止。

Unknown(未知):

因为某些原因无法取得 Pod 的状态。这种情况通常是因为与 Pod 所在主机通信失败。

3.Pod生命周期--初始化容器

1)初始化容器作用

Init 容器是一种特殊容器,在 Pod 内的应用容器启动之前运行。Init 容器可以包括一些应用镜像中不存在的实用工具和安装脚本。

2)举例

apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
initContainers:
- name: init-busybox
image: busybox:1.28
command: ['sh', '-c', "sleep 10;echo ok > /cache/index.html"]
volumeMounts:
- mountPath: /cache
name: cache-volume

containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
volumeMounts:
- mountPath: /cache
name: cache-volume

volumes:
- name: cache-volume
emptyDir: {}

4.Pod生命周期--启动函数

1)PostStart和initContainers区别

容器上:

initContainers是新的一个容器

PostStart就是业务容器,只不过是业务容器创建时同时执行的命令

存活性:

initContainers执行完就删了

PostStart是业务容器执行的命令,不会退出或删除

执行时机:

initContainers是在业务容器启动前执行的

PostStart和业务容器同时立刻执行

2)举例

apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello k8s > /usr/share/nginx/html/index.html;sleep 30"]

5.Pod生命周期--停止函数

1)preStop介绍

Kubernetes 在容器结束前立即发送 preStop 事件。除非 Pod 宽限期限超时,Kubernetes 的容器管理逻辑会一直阻塞等待 preStop 处理函数执行完毕。

2)举例

apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
lifecycle:
postStart:
exec:
command: ["/bin/sh","-c","echo Hello k8s > /usr/share/nginx/html/index.html;sleep 10"]
preStop:
exec:
command: ["/bin/sh","-c","sleep 10;nginx -s quit"]

6.Pod生命周期--存活性探针

1)存活性探针检查机制

exec

在容器内执行指定命令。如果命令退出时返回码为 0 则认为诊断成功。

httpGet

对容器的 IP 地址上指定端口和路径执行 HTTP GET 请求。如果响应的状态码大于等于 200 且小于 400,则诊断被认为是成功的。

tcpSocket

对容器的 IP 地址上的指定端口执行 TCP 检查。如果端口打开,则诊断被认为是成功的。 如果远程系统(容器)在打开连接后立即将其关闭,这算作是健康的。

2)exec探针举例

apiVersion: v1
kind: Pod
metadata:
labels:
test: liveness
name: liveness-exec
spec:
containers:
- name: liveness
image: busybox
args:
- /bin/sh
- -c
- touch /tmp/healthy; sleep 30; rm -f /tmp/healthy; sleep 600
livenessProbe:
exec:
command:
- cat
- /tmp/healthy
initialDelaySeconds: 5
periodSeconds: 5

3)http探针举例

apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
httpGet:
path: /index.html
port: 80
initialDelaySeconds: 3
periodSeconds: 3

4)tcp探针举例

apiVersion: v1
kind: Pod
metadata:
name: nginx
labels:
app: nginx
spec:
containers:
- name: redis
image: redis
imagePullPolicy: IfNotPresent

- name: nginx
image: nginx
imagePullPolicy: IfNotPresent
livenessProbe:
tcpSocket:
port: 80
initialDelaySeconds: 3
periodSeconds: 1

7.Pod生命周期--就绪性探针

1)就绪性探针介绍

有时候,应用会暂时性地无法为请求提供服务。 例如,应用在启动时可能需要加载大量的数据或配置文件,或是启动后要依赖等待外部服务。 在这种情况下,既不想杀死应用,也不想给它发送请求。 Kubernetes 提供了就绪探针来发现并缓解这些情况。 容器所在 Pod 上报还未就绪的信息,并且不接受通过 Kubernetes Service 的流量。

2)举例

apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx-pod
spec:
containers:
- image: nginx
name: nginx-pod
imagePullPolicy: IfNotPresent
readinessProbe:
httpGet:
path: /bro.html
port: 80
initialDelaySeconds: 30
periodSeconds: 3
---
apiVersion: v1
kind: Service
metadata:
name: nginx-svc
spec:
selector:
app: nginx-pod
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30000
type: NodePort

更新: 2024-08-27 14:47:59