第四篇:《Pod:K8s 中最小的部署单元》

在 Kubernetes 中,Pod 是你能创建和管理的最小、最简单的部署单元。Pod 不是一个容器,而是一个或多个容器的组合,共享网络和存储。理解 Pod 的设计哲学、生命周期、多容器模式,是掌握 K8s 的基础。本文将详细讲解 Pod 的定义、生命周期、多容器模式、资源限制,并通过大量 YAML 示例帮助你上手。

一、Pod 是什么?

Pod 是一组容器的集合,这些容器共享:

网络命名空间:同一个 Pod 内的容器共享 IP 地址和端口空间,可以通过 localhost 互相通信。

存储卷(Volume):Pod 可以定义多个卷,供内部容器共享。

IPC 命名空间:进程间通信(如 SystemV 信号量)共享。

UTS 命名空间:主机名共享。

Pod 是原子调度单位:要么 Pod 整体调度到一个节点上,要么不调度。Pod 内的容器始终一起运行、一起停止。

类比:Pod 类似于"逻辑主机",容器是"主机上的进程"。最典型的例子是 Web 服务器 + 日志收集 Sidecar。

二、Pod 的 YAML 定义

最小 Pod 定义示例(nginx-pod.yaml):

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
    env: test
spec:
  containers:
  - name: nginx
    image: nginx:1.25
    ports:
    - containerPort: 80

创建 Pod:

bash 复制代码
kubectl apply -f nginx-pod.yaml
kubectl get pods -o wide
kubectl describe pod nginx-pod

三、Pod 生命周期

Pod 的状态存储在 status.phase 字段,主要阶段:

3.1 容器状态

Pod 中每个容器都有状态:Waiting、Running、Terminated。使用 kubectl describe pod 查看容器状态及原因。

3.2 重启策略

Pod spec.restartPolicy 控制容器退出后的行为:

Always(默认):无论退出码如何,总是重启。

OnFailure:仅当退出码非 0 时重启。

Never:从不重启。

注意:重启策略适用于 Pod 内的所有容器。对于 Job、CronJob 等控制器,其策略略有不同。

四、多容器 Pod 设计模式

多个容器协同完成一个任务,是 Pod 的核心设计理念。常见模式:

4.1 Sidecar 模式

增强主容器的功能,如日志收集、监控、安全代理。

示例:Nginx + Filebeat 日志收集

yaml 复制代码
apiVersion: v1
kind: Pod
metadata:
  name: web-with-sidecar
spec:
  containers:
  - name: nginx
    image: nginx
    volumeMounts:
    - name: logs
      mountPath: /var/log/nginx
  - name: filebeat
    image: elastic/filebeat:7.17
    volumeMounts:
    - name: logs
      mountPath: /var/log/nginx
  volumes:
  - name: logs
    emptyDir: {}

4.2 Ambassador 模式

代理主容器的网络连接,例如连接外部数据库的 sidecar 代理。

4.3 Adapter 模式

转换主容器输出的格式,使之符合外部系统的要求(如 Prometheus metrics 标准化)。

五、Pod 的资源管理

可以在 Pod 级别为每个容器指定 requests(请求)和 limits(限制):

yaml 复制代码
spec:
  containers:
  - name: app
    image: myapp
    resources:
      requests:
        memory: "128Mi"
        cpu: "250m"
      limits:
        memory: "256Mi"
        cpu: "500m"

requests:调度器保证分配的资源量。

limits:容器允许使用的最大资源,超出会触发 OOM 或 CPU 节流。

六、Pod 的健康检查

通过探针(Probe)检测容器状态,将在后续文章中详述,简单示例:

yaml 复制代码
spec:
  containers:
  - name: web
    image: nginx
    livenessProbe:
      httpGet:
        path: /
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 10

七、Pod 的常见操作

7.1 创建 Pod

bash 复制代码
# 命令式
kubectl run my-nginx --image=nginx --restart=Never

# 声明式
kubectl apply -f pod.yaml

7.2 删除 Pod

bash 复制代码
kubectl delete pod my-nginx
kubectl delete -f pod.yaml

7.3 获取 Pod 日志(多容器)

bash 复制代码
kubectl logs my-pod -c sidecar-container

7.4 执行命令(多容器)

bash 复制代码
kubectl exec my-pod -c sidecar-container -- ls /tmp

7.5 编辑 Pod 定义(部分字段可修改,但 Pod 规范大多不可变)

bash 复制代码
kubectl edit pod my-nginx

八、静态 Pod

静态 Pod 不通过 API Server 管理,而是由 kubelet 直接根据本地磁盘上的清单文件运行。一般用于控制平面组件(如 kube-apiserver 自身)。通常位于 /etc/kubernetes/manifests/。

九、Pod 与 Deployment 的关系

Pod 本身是"裸奔"的,不会自动重启(除非设置 restartPolicy: Always),也不会自愈。在生产环境中,几乎不直接创建 Pod,而是使用 Deployment、StatefulSet、DaemonSet 等控制器来管理 Pod 的生命周期。

直接创建 Pod 仅适用于临时测试或不需要管理功能的任务。

十、调试 Pod 故障

十一、最佳实践

不要直接运行裸 Pod(除非是测试)。使用 Deployment、ReplicaSet 等控制器。

合理设置资源 requests/limits,避免资源争抢和 OOM。

使用多容器 Pod 时,确保容器能正常退出(或设置合适的重启策略)。

为 Pod 添加标签,便于后续通过选择器管理。

利用 initContainer:在主容器启动前执行初始化(如等待数据库、生成配置)。

Pod 应该设计为可替换、无状态(除非使用 StatefulSet)。

十二、小结

Pod 是 Kubernetes 的原子调度单元,掌握 Pod 的定义、生命周期、多容器模式是进阶的基础。虽然生产环境通常不直接管理 Pod,但理解 Pod 对于调试和理解控制器至关重要。

相关推荐
阿里云云原生14 小时前
Higress v2.2.3 发布:正式入驻 CNCF Sandbox,AI Gateway 与 Ingress 迁移能力双向加固
云原生
lichenyang45319 小时前
Docker 学习笔记(四):Dockerfile,把项目打成自己的镜像
docker·容器
lichenyang45319 小时前
Docker 学习笔记(三):Docker 网络、bridge、子网和容器互通
docker·容器
lichenyang45319 小时前
Docker 学习笔记(二):docker run 的参数到底在控制什么?
docker·容器
阿里云云原生1 天前
香港站【企业 AI Agent 工程化实战专场】来啦,邀您7月9日见!
云原生·agent
阿里云云原生2 天前
研发域与运维域的“数字握手”:通过 Agentic Skills 实现 DevOps 全链路自动化
云原生
运维开发故事4 天前
基于 Arthas 的多集群在线诊断系统设计与实现
kubernetes
Patrick_Wilson5 天前
从「改个端口」到 502:Next.js on k8s 的容器端口、Service 映射与 env 覆盖
docker·kubernetes·next.js
阿里云云原生6 天前
AI 开发新常态:当 Cursor、Claude、Codex 并行,如何统一管理散落的 Skill 资产?
云原生·ai编程
探索云原生6 天前
K8s 1.36 这个 GA 特性,把 initContainer 拉模型的 hack 干掉了
ai·云原生·kubernetes