Pod 基础
Pod 是 Kubernetes 中能够创建和管理的最小单位。Kubernetes 直接管理的是 Pod,而不是容器。
Pod 的组成
-
Pause 容器(基础容器、父容器、根容器)
- 作用:
- 作为 Linux 命名空间共享的基础,为 Pod 内的其他容器提供网络、存储等资源的共享。
- 作为 PID=1 的 init 进程,管理整个 Pod 容器组的生命周期。
- 特性:
- Pod 中第一个启动的容器。
- 为其他容器提供共享的环境。
- 作用:
-
应用容器(业务容器、用户容器、Main Container)
- 作用:
- 运行应用程序。
- 作为边车容器(Sidecar),为主应用容器提供紧密相关的业务功能支持。
- 特性:
- 在 Pause 容器之后启动。
- 如果 Pod 中有多个应用容器,它们会并行启动。
- 作用:
-
Init 容器(初始化容器)
- 作用:
- 在应用容器启动前,基于共享存储卷为应用容器提供依赖环境或工具包。
- 可以阻塞或延迟应用容器的启动。
- 特性:
- 在 Pause 容器之后启动。
- 如果 Pod 中有多个 Init 容器,它们会串行启动(一个完成后才会启动下一个)。
- 作用:
Pod 的特性
-
共享资源:
- 同一个 Pod 中的容器运行在同一个 Node 节点上。
- 容器之间通过
localhost
互相通信,共享同一个 IP 和端口范围。 - 共享同一个存储卷(Volume),实现容器间的数据共享。
-
Pod 的 3 种类型:
-
自主式 Pod:
- 由 Scheduler 调度到 Node 节点部署。
- 不被控制器管理,没有自愈能力(Pod 挂了不会被重建)。
- 没有副本管理能力,不支持滚动更新。
- 配置信息存储在 etcd 中。
- 创建命令:
kubectl run ...
-
控制器管理的 Pod:
- 由 Scheduler 调度到 Node 节点部署。
- 被控制器(如 Deployment、StatefulSet)管理。
- 具有自愈能力(Pod 挂了会被重建)。
- 支持副本管理和滚动更新。
- 配置信息存储在 etcd 中。
- 创建命令:
kubectl create deployment ...
-
静态 Pod:
- 不由 Scheduler 调度,也不通过 API Server 创建。
- 由 Kubelet 自行创建和管理。
- 配置信息存储在 Node 节点的
/etc/kubernetes/manifests/
目录中。 - Kubelet 会自动根据该目录中的 YAML 文件创建静态 Pod。
- 删除 YAML 文件后,Kubelet 会自动删除静态 Pod。
-
Pod 容器的镜像拉取策略
通过 imagePullPolicy
字段定义:
-
IfNotPresent:
- 优先使用 Node 节点本地已存在的镜像。
- 如果本地没有,则从仓库拉取镜像。
- 默认策略:适用于标签为非
latest
的镜像。
-
Always:
- 总是从仓库拉取镜像,无论本地是否已存在。
- 默认策略:适用于标签为
latest
或无标签的镜像。
-
Never:
- 仅使用 Node 节点本地的镜像,总是不从仓库拉取镜像。
Pod 容器的重启策略
通过 restartPolicy
字段定义:
-
Always:
- 当容器退出时,总是重启容器(无论退出状态码如何)。
- 默认策略:适用于 Deployment、StatefulSet、DaemonSet 等控制器管理的 Pod。
-
OnFailure:
- 仅当容器异常退出时(退出状态码为非 0),重启容器。
- 正常退出的容器(退出状态码为 0)不会重启。
-
Never:
- 当容器退出时,总是不重启容器(无论退出状态码如何)。
注:deployment、statefulset、daemonset 控制器的Pod容器重启策略只能设置为 Always
示例
# pod3.yaml
apiVersion: v1
kind: Pod
metadata:
name: foo
spec:
containers:
- name: busybox
image: busybox
args:
- /bin/sh
- -c
- sleep 30; exit 3 # 命令让容器睡眠30秒后退出,退出状态码为3
# 默认情况下,如果不指定restartPolicy,Pod的重启策略为Always(仅适用于单独的Pod定义,不适用于由控制器管理的Pod)
# 但在这里我们稍后会显式设置restartPolicy为Never来演示其效果
# 应用YAML文件创建Pod
# kubectl apply -f pod3.yaml
# 查看Pod状态,初始时Pod应该是Running状态
# 等容器