Pod 是 Kubernetes 中最小的部署和调度单元,所有容器工作负载的基础
Pod 是 Kubernetes 中最小的可部署、调度和管理单元。一个 Pod 代表集群中一个运行的工作单元,可以包含一个或多个容器。
Pod 本质上是一组共享网络命名空间(Network Namespace)和存储卷(Volume)的容器集合。这组容器紧密耦合,协同完成一项任务。
Pod 内所有容器共享同一个 Network Namespace,拥有相同的 IP 和端口空间。容器间通过 localhost 通信,无需跨网络。
Pod 内容器可以挂载相同的 Volume,实现数据共享与持久化。Volume 的生命周期与 Pod 绑定,而非与单个容器绑定。
Pod 内所有容器同时创建、同时终止。Kubernetes 始终将 Pod 整体作为原子单元进行调度,不会拆开调度到不同 Node。
每个 Pod 启动时,Kubernetes 会首先创建一个特殊的 Pause 容器(镜像 pause:3.x)。
它的唯一职责是持有并维护 Pod 的 Network Namespace 和 IPC Namespace,
业务容器都 join 到它的 Namespace 中,从而实现共享网络与通信。
--net=container:pause 加入 Pause 的网络命名空间,共享同一套网卡和 IP。Pod 利用 Linux 内核 Namespace 实现隔离:
每个容器有独立的 cgroup,受 resources 字段控制:
在业务容器启动前顺序执行的初始化容器,全部成功后业务容器才启动。
与主容器并行运行的辅助容器,增强主容器能力而不侵入业务代码。
# Pod 资源清单示例 apiVersion: v1 kind: Pod metadata: name: demo-pod namespace: default labels: app: demo # 标签,供 Service/Deployment 选择器匹配 version: v1.0 spec: restartPolicy: Always # 重启策略:Always / OnFailure / Never # Init 容器(顺序执行,全部成功后业务容器才启动) initContainers: - name: init-db-wait image: busybox:1.36 command: ["sh", "-c", "until nc -z mysql 3306; do sleep 2; done"] # 业务容器列表 containers: # --- 主容器 --- - name: web image: nginx:1.25 ports: - containerPort: 80 # 声明性,实际由 Service 暴露 resources: requests: # 调度时的最低资源保证 cpu: "100m" memory: "128Mi" limits: # 运行时最大上限,超 memory 则 OOMKilled cpu: "500m" memory: "512Mi" volumeMounts: - name: shared-data mountPath: /data livenessProbe: # 存活探针,失败则重启容器 httpGet: path: /healthz port: 80 initialDelaySeconds: 15 periodSeconds: 10 readinessProbe: # 就绪探针,失败则从 Service 摘除 httpGet: path: /ready port: 80 periodSeconds: 5 lifecycle: preStop: # 删除 Pod 前执行,确保优雅退出 exec: command: ["/bin/sh", "-c", "sleep 5"] # --- Sidecar 容器(日志收集)--- - name: log-collector image: fluent/fluent-bit:latest volumeMounts: - name: shared-data mountPath: /data # 同一 Volume,读取主容器的日志 # Volume 定义 volumes: - name: shared-data emptyDir: {} # 随 Pod 生命周期的临时目录 # 调度控制 nodeSelector: disktype: ssd # 只调度到有此标签的 Node tolerations: # 容忍 taint,可调度到特殊节点 - key: "dedicated" operator: "Equal" value: "gpu" effect: "NoSchedule"
| 对比项 | Container(容器) | Pod(容器组) |
|---|---|---|
| 管理对象 | Docker 单个容器,直接操控 | Kubernetes 中最小调度单元,K8s 感知不到单个容器 |
| 网络 | 独立 IP,端口映射才可访问 | 共享 IP 和端口空间(同一 Network Namespace) |
| 存储 | 独立拥有,容器销毁即丢失 | 共享 Volume,生命周期由 Pod 控制 |
| 生命周期 | 独立创建和销毁 | 所有容器同时创建和销毁,原子调度 |
| 使用场景 | 单进程应用 | 多进程协作:Sidecar、Init Container、协同容器等 |
| 配置中心 | docker run 参数 / Compose 文件 | Pod Spec YAML(由 K8s API Server 管理) |
Nginx 主容器 + 日志采集 Sidecar,共享 /var/log Volume 实现无侵入日志收集。
日志收集文件同步代理注入Istio 自动向 Pod 注入 Envoy 代理容器,实现流量管理、熔断、mTLS 等,业务代码零感知。
IstioEnvoy服务网格启动主服务前,Init 容器自动完成:等待依赖就绪、拉取远程配置、执行数据库迁移等前置任务。
数据库迁移配置注入依赖等待业务容器旁注入 Prometheus Exporter Sidecar,通过 localhost 采集指标,无需修改业务代码。
Prometheus监控可观测性# 查看 Pod 列表 kubectl get pods -n default -o wide # 查看 Pod 详细信息(Events 排错必用) kubectl describe pod <pod-name> # 查看容器日志 kubectl logs <pod-name> -c <container-name> --tail=100 -f # 进入容器 Shell kubectl exec -it <pod-name> -c <container-name> -- /bin/sh # 从 YAML 创建 Pod kubectl apply -f pod.yaml # 删除 Pod(立即强制) kubectl delete pod <pod-name> --grace-period=0 --force # 端口转发(本地调试) kubectl port-forward pod/<pod-name> 8080:80 # 查看 Pod 资源占用 kubectl top pod <pod-name> --containers