一、前言
Pod 是 Kubernetes 中最小的部署单元,它可以包含一个或多个容器,以及共享的存储卷和网络命名空间,Pod 提供了一种抽象,用于组织和管理容器化的应用程序,并提供了一种灵活、轻量级的方式来部署和管理应用程序
二、生命周期
什么是生命周期,即pod从创建到终止的这段过程就叫生命周期,下面就来介绍以下pod的生命周期过程
初始化容器>主容器>容器启动后执行的钩子函数>就绪探针>存活探针>容器终止前执行的钩子函数
pod的生命周期可以使用以下的几种状态概括
Pending(等待中): Pod 已经被 Kubernetes 系统接受,但是容器尚未创建。这可能是因为调度器还未将 Pod 调度到节点上,或者正在等待其他资源的创建
Running(运行中): Pod 中的至少一个容器已经被创建,并且正在运行中。如果 Pod 中的所有容器都处于该状态,则整个 Pod 将被标记为运行中
Succeeded(已成功): Pod 中的所有容器都已经成功地完成了任务,并且已经退出。这通常在批处理作业完成后发生
Failed(失败): Pod 中的一个或多个容器已经以非正常状态退出。这通常表示应用程序出现了错误或故障
Terminating(终止中): Pod 已经接收到删除请求,正在被终止。这意味着 Pod 中的容器正在被停止,并且正在进行清理操作,例如释放资源
初始化容器
初始化容器(Init Container)是 Kubernetes 中的一个特殊类型的容器,它与主要的应用容器共同运行在同一个 Pod 内,并在应用容器启动之前执行一些初始化任务,只有当所有的初始化容器成功执行完毕并退出时,主要的应用容器才会启动,如果初始化容器中的任何一个执行失败(即退出状态码非零),整个 Pod 将处于错误状态,Kubernetes 会尝试重新启动整个 Pod,直到所有的初始化容器成功执行为止
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: api-gateway
name: api-gateway
namespace: java-service
spec:
replicas: 2
progressDeadlineSeconds: 600
minReadySeconds: 10
strategy:
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
type: RollingUpdate
selector:
matchLabels:
app: api-gateway
template:
metadata:
labels:
app: api-gateway
spec:
volumes:
- name: skywalking-agent
emptyDir: {}
initContainers: #定义初始化容器
- name: skywalking-agent-container
image: apache/skywalking-java-agent:8.7.0-alpine
volumeMounts:
- name: skywalking-agent
mountPath: /agent
command: ["/bin/sh"]
args: ["-c","cp -R /skywalking/agent /agent/"]
containers:
- name: api-gateway
image: harbor.apex.com/jdk/api-gateway:1.0.6
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8888
钩子函数
PostStart 钩子: 在容器创建后立即执行。这个钩子适合于一些初始化操作,如连接到外部服务、加载数据等
PreStop 钩子: 在容器终止之前执行。它允许容器在关闭之前执行清理任务,如保存状态、断开连接等
apiVersion: v1
kind: Pod
metadata:
name: example
spec:
containers:
- name: my-container
image: my-image
lifecycle:
postStart:
exec:
command: ["/bin/sh", "-c", "echo Hello from the postStart hook"]
preStop:
exec:
command: ["/bin/sh", "-c", "echo Hello from the preStop hook"]
三、重启策略
Always(始终重启): 当容器退出时,无论其退出状态是成功还是失败,Kubernetes 都会自动重启该容器。这是默认的重启策略
OnFailure(仅在失败时重启): 仅当容器以非零退出状态(即失败)退出时,Kubernetes 才会重启容器。如果容器以成功状态退出(即退出代码为 0),则不会触发重启
Never(永不重启): Kubernetes 永远不会重启 Pod 中的容器,即使容器失败也不会触发重启
四、pause
在 Kubernetes 中,Pause 容器是一个特殊的辅助容器,它经常与每个 Pod 一起运行。Pause 容器没有实际的应用程序逻辑,其主要作用是为 Pod 中的其他容器提供网络命名空间和存储卷的共享环境。Pause 容器实际上是一个轻量级的镜像,只包含一个小型的操作系统文件系统和网络配置,占用极少的资源,当创建一个 Pod 时,Kubernetes 会自动在 Pod 中创建一个 Pause 容器。这个 Pause 容器会一直运行,直到 Pod 被删除或终止。其他容器(也称为主容器)与 Pause 容器共享网络和存储卷空间,这意味着它们可以在同一网络命名空间中相互通信,共享文件系统卷