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 的设计有深意:
- 协同容器:有些容器天然要紧密协作(如日志收集 sidecar)
- 共享上下文:同一 Pod 内的容器共享网络和存储
- 最小部署单元: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 没有自愈能力——被删除或节点故障后不会被重建。
