Pod 是什么
Pod 是调度与运行的最小单元:一个或多个容器共享网络命名空间、存储卷与生命周期,因此它们之间可以用本地地址直接互相访问,但也意味着端口不能重复。生产环境的实例一律由控制器管理,直接创建的裸实例一旦被删除或被驱逐就不会自动重建。
基本信息
| 共享内容 | 网络命名空间、存储卷、生命周期与调度边界 |
|---|---|
| 端口约束 | 同一实例内的容器共用一个地址,端口不能重复监听 |
| 重启策略 | 始终重启、仅失败时重启、从不重启三种取值 |
| 管理方式 | 由控制器维护副本数,裸实例只适合调试与一次性任务 |
| 通信方式 | 同实例内用本地地址互通,跨实例走服务名 |
| 常用字段 | 容器列表、端口、资源请求与上限、探针、卷挂载 |
典型使用场景
- 运行单一进程的服务:最常见的形态,一个容器跑一个应用
- 边车模式:主容器旁边挂日志采集、代理或配置同步容器
- 初始化容器:在主容器启动前完成依赖准备与数据预热
- 临时调试:起一个带工具的实例排查网络与存储问题
- 一次性任务:配合任务类资源运行批处理,结束即退出
- 检查环境一致性:用同样的镜像与配置起实例,复现线上行为
关键字段速查
| 字段 | 作用 | 注意点 |
|---|---|---|
| containers | 容器列表 | 同一实例内端口不能重复 |
| restartPolicy | 重启策略 | 默认始终重启,与控制器配合使用 |
| resources | 资源请求与上限 | 请求影响调度,上限影响运行行为 |
| probes | 健康检查 | 就绪检查决定是否接收流量 |
| volumes | 卷定义 | 配置与密钥通常以卷形式挂载 |
| nodeSelector | 节点选择 | 与亲和、容忍一起影响调度结果 |
Pod 示例
Pod 示例
apiVersion: v1
kind: Pod
metadata:
name: web-1
labels:
app: web
spec:
containers:
- name: web
image: nginx:1.27-alpine
ports:
- containerPort: 80
resources:
requests: { cpu: 100m, memory: 128Mi }
limits: { cpu: 500m, memory: 256Mi }
# 裸实例仅用于调试,生产交给控制器管理同一实例内的容器用本地地址互访:这也解释了为什么端口必须错开,两个容器同时监听同一端口时后启动的会直接失败。
跨实例通信一律走服务名:直接写实例地址会在实例重建后失效,因为地址与名称都会变化。
裸实例不会自动重建:删除或被节点驱逐后就消失了,误以为集群会拉起是最常见的认知偏差。
资源请求影响调度结果:不写请求时调度器按零计算,节点可能被超额分配,运行高峰期才开始互相抢占。
日常使用的注意点
- 按职责拆分容器,不要把多个无关进程塞进同一个容器
- 初始化容器只做前置准备,不要在里面启动常驻服务
- 边车容器与主容器共享生命周期,退出策略要一起考虑
- 资源请求按实测值设置,避免调度水位被虚高占用
- 标签要与服务选择器保持一致,否则流量进不来
- 调试用的裸实例用完及时删除,避免资源长期闲置
把实例定义纳入配置仓库,而不是靠临时执行命令创建:环境之间才能保持结构一致,迁移与重建也才有依据。
标签要在创建时就规划好:它是选择器、调度约束与监控分组的共同基础,事后补加的改造成本远高于一开始就设计。