Skip to content

01 - Pod:K8s 的最小调度单元

Pod 是什么?

Pod 是 K8s 中最小的可部署单元。一个 Pod 包含一个或多个容器,它们:

  • 共享网络命名空间(同一个 IP,通过 localhost 互相通信)
  • 共享存储卷
  • 共享 IPC 命名空间
  • 一起被调度到同一个节点
┌─────────────────────────────────┐
│           Pod                   │
│   IP: 10.244.0.5               │
│                                 │
│  ┌──────────┐  ┌──────────┐    │
│  │Container │  │Container │    │
│  │  (app)   │  │(sidecar) │    │
│  │ :8080    │  │ :9090    │    │
│  └────┬─────┘  └────┬─────┘    │
│       │              │          │
│       └──── localhost ────┘     │
│                                 │
│  ┌──────────────────────────┐   │
│  │   Shared Volume          │   │
│  └──────────────────────────┘   │
└─────────────────────────────────┘

为什么不直接管理容器?

Pod 的设计有深意:

  1. 协同容器:有些容器天然要紧密协作(如日志收集 sidecar)
  2. 共享上下文:同一 Pod 内的容器共享网络和存储
  3. 最小部署单元:K8s 调度器以 Pod 为粒度进行调度

实际生产中,绝大部分 Pod 只包含一个容器。多容器 Pod(sidecar 模式)是进阶用法。


Pod YAML 结构详解

yaml
apiVersion: v1           # API 版本
kind: Pod                # 资源类型
metadata:                # 元数据
  name: my-app           # Pod 名称
  namespace: default     # 命名空间
  labels:                # 标签(用于选择和筛选)
    app: my-app
    env: dev
  annotations:           # 注解(附加信息,不用于选择)
    description: "My demo app"
spec:                    # Pod 规格(期望状态)
  containers:            # 容器列表
  - name: app            # 容器名称
    image: nginx:alpine  # 镜像
    ports:
    - containerPort: 80  # 容器端口
    env:                 # 环境变量
    - name: APP_ENV
      value: "production"
    resources:           # 资源请求和限制
      requests:          # 最低保证
        memory: "64Mi"
        cpu: "250m"      # 250 毫核 = 0.25 CPU
      limits:            # 上限
        memory: "128Mi"
        cpu: "500m"
    livenessProbe:       # 存活探针
      httpGet:
        path: /health
        port: 80
      initialDelaySeconds: 5
      periodSeconds: 10
    readinessProbe:      # 就绪探针
      httpGet:
        path: /ready
        port: 80
      initialDelaySeconds: 3
      periodSeconds: 5
  restartPolicy: Always  # 重启策略:Always / OnFailure / Never

资源请求与限制(重要!)

字段含义不设置的后果
requests调度保证的最低资源量Pod 可能被调度到资源不足的节点
limits资源使用上限容器可能耗尽节点资源

CPU 单位:

  • 1 = 1 个 CPU 核
  • 500m = 0.5 CPU 核(m = millicores)
  • 250m = 0.25 CPU 核

内存单位:

  • Mi = 兆字节(MiB)
  • Gi = 千兆字节(GiB)
yaml
resources:
  requests:
    memory: "128Mi"   # 调度器保证至少有 128Mi 内存
    cpu: "250m"       # 至少 0.25 CPU
  limits:
    memory: "256Mi"   # 超过 256Mi → OOMKilled
    cpu: "500m"       # 超过 0.5 CPU → 被限流(不会被杀)

探针(Probes)—— 健康检查

K8s 用三种探针监控容器健康:

探针用途失败后果
livenessProbe容器还活着吗?重启容器
readinessProbe容器准备好接收流量了吗?从 Service 端点移除
startupProbe容器启动完成了吗?在完成前不执行 liveness/readiness

三种检测方式:

yaml
# HTTP GET
livenessProbe:
  httpGet:
    path: /health
    port: 8080

# TCP 端口检测
livenessProbe:
  tcpSocket:
    port: 3306

# 执行命令
livenessProbe:
  exec:
    command: ["cat", "/tmp/healthy"]

Pod 生命周期

Pending → Running → Succeeded/Failed
   │                      │
   └── 调度中/拉取镜像     └── 容器退出
阶段含义
Pending已被创建但未运行(等待调度或拉取镜像)
Running至少一个容器在运行
Succeeded所有容器正常退出(Job 类型)
Failed至少一个容器异常退出
Unknown无法获取状态(通常是节点通信问题)

实操练习

详见 ../manifests/ 目录中的 YAML 文件。


重要提醒

永远不要直接创建裸 Pod! 生产环境中应该使用 Deployment 等控制器来管理 Pod。 裸 Pod 没有自愈能力——被删除或节点故障后不会被重建。


下一步

02 - Deployment 与 ReplicaSet