4. Pod 模板详解:containers 配置、image、ports、command、args、env、resources
Pod 是 Kubernetes 中可调度的最小单元,而 Pod 模板(PodTemplate)是 Deployment、StatefulSet、DaemonSet 等工作负载资源的核心定义。Deployment 通过 Pod 模板声明期望运行的 Pod 规格,控制器负责将实际状态收敛到模板定义。本章深入解析 Pod 模板中 containers 字段的七个关键配置项,这些配置直接决定了容器的运行行为、网络暴露、启动参数、环境注入与资源保障。
4.1 containers 配置:核心字段概览
spec.containers 是一个数组,每个元素定义一个容器的完整配置。以下表格列出最常用的字段及其作用:
| 字段 | 类型 | 是否必填 | 说明 |
|---|---|---|---|
name |
string | 是 | 容器名称,在 Pod 内唯一 |
image |
string | 是 | 容器镜像地址,包含仓库、名称与标签 |
ports |
[]ContainerPort | 否 | 声明容器监听的端口,用于服务发现与网络策略 |
command |
[]string | 否 | 覆盖 Dockerfile 中的 ENTRYPOINT |
args |
[]string | 否 | 覆盖 Dockerfile 中的 CMD,或传递给 command 的参数 |
env |
[]EnvVar | 否 | 设置容器内的环境变量,支持静态值或引用其他资源 |
resources |
ResourceRequirements | 否 | 定义 CPU 和内存的 requests 与 limits,是容量规划的核心 |
resources 和 ports,以提升集群的可观测性与调度确定性。
4.2 image:镜像拉取策略与版本管理
image 字段指定容器运行时的镜像来源。格式通常为 [仓库地址/]镜像名[:标签],例如 nginx:1.25 或 registry.example.com/app:v2.1.0。
Kubernetes 通过 imagePullPolicy 控制镜像拉取行为,该字段虽不属于 image 本身,但与之紧密关联:
- Always:每次启动 Pod 都从仓库拉取镜像。适用于
:latest标签或需要确保最新补丁的场景。 - IfNotPresent:仅当节点本地不存在镜像时才拉取。默认策略(当标签为
:latest或:<digest>时除外)。 - Never:仅使用本地镜像,不主动拉取。适用于离线环境或预加载场景。
Always 策略会增加镜像仓库负载和 Pod 启动延迟。在节点扩容或滚动更新时,大量并发拉取可能耗尽节点磁盘 I/O 或网络带宽。建议为生产环境使用确定性标签(如 Git commit SHA 或语义化版本),并配合 IfNotPresent 策略。
4.3 ports:声明式端口暴露
ports 字段用于声明容器监听的端口,它不会自动打开防火墙或创建 Service,而是提供元数据供其他组件(如 Service、网络策略、监控系统)使用。
ports:
- containerPort: 8080
protocol: TCP
name: http
- containerPort: 8443
protocol: TCP
name: https
每个端口条目包含三个关键属性:
- containerPort:容器内部监听的端口号(必填)。
- protocol:传输层协议,支持 TCP、UDP、SCTP,默认为 TCP。
- name:端口名称,在 Service 中可通过名称引用,提升可读性。
4.4 command 与 args:覆盖容器入口与参数
Kubernetes 允许通过 command 和 args 覆盖 Dockerfile 中定义的 ENTRYPOINT 和 CMD。其对应关系如下:
| Dockerfile 指令 | Kubernetes 字段 | 行为 |
|---|---|---|
| ENTRYPOINT | command |
完全替换 ENTRYPOINT |
| CMD | args |
完全替换 CMD;若同时设置 command,则 args 作为 command 的参数 |
典型用法示例:
command: ["/app/start.sh"]
args: ["--config", "/etc/app/config.yaml", "--log-level", "debug"]
command 为 ["sleep", "3600"] 来保持容器运行,方便进入容器内检查文件系统或配置。
4.5 env:环境变量注入的三种方式
env 字段为容器注入环境变量,支持静态值、引用 Pod 字段、引用 Secret/ConfigMap 三种模式:
- 静态值:直接指定 key-value。
- 字段引用:通过
fieldRef获取 Pod 元数据(如 Pod IP、节点名称)。 - 资源引用:通过
configMapKeyRef或secretKeyRef从 ConfigMap/Secret 中取值。
env:
- name: APP_ENV
value: "production"
- name: POD_IP
valueFrom:
fieldRef:
fieldPath: status.podIP
- name: DB_PASSWORD
valueFrom:
secretKeyRef:
name: db-secret
key: password
secretKeyRef 引用 Kubernetes Secret 对象,并配合 RBAC 限制 Secret 的访问权限。
4.6 resources:容量规划的基石
resources 字段定义容器对 CPU 和内存的资源请求(requests)与限制(limits),是集群节点扩容与资源分配决策的核心依据。
| 属性 | 含义 | 调度影响 | 运行时影响 |
|---|---|---|---|
requests.cpu |
容器保证可用的 CPU 量 | 节点必须满足所有 Pod 的 requests 总和 ≤ 节点可分配量 | CFS 调度器按 requests 分配 CPU 时间片 |
requests.memory |
容器保证可用的内存量 | 节点必须满足所有 Pod 的 requests 总和 ≤ 节点可分配量 | Kubelet 在内存压力时优先驱逐超出 requests 的 Pod |
limits.cpu |
容器可使用的 CPU 上限 | 不影响调度 | CFS 配额限制 CPU 使用,超过则节流 |
limits.memory |
容器可使用的内存上限 | 不影响调度 | 超过则触发 OOM Kill |
典型配置示例:
resources:
requests:
cpu: "500m" # 0.5 个 CPU 核心
memory: "256Mi" # 256 Mebibytes
limits:
cpu: "1000m" # 1 个 CPU 核心
memory: "512Mi" # 512 Mebibytes
4.7 Pod 模板配置与节点扩容的关系
下图展示了 Pod 模板中 resources 配置如何影响节点扩容决策:
4.8 完整 Pod 模板示例
以下是一个生产级别的 Deployment Pod 模板片段,整合了上述所有配置项:
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-server
spec:
replicas: 3
selector:
matchLabels:
app: server
template:
metadata:
labels:
app: server
spec:
containers:
- name: server
image: registry.example.com/app-server:v2.1.0
imagePullPolicy: IfNotPresent
ports:
- containerPort: 8080
protocol: TCP
name: http
- containerPort: 9090
protocol: TCP
name: metrics
command: ["/app/server"]
args: ["--config", "/etc/server/config.yaml"]
env:
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: LOG_LEVEL
value: "info"
- name: DB_CONN_STRING
valueFrom:
secretKeyRef:
name: db-secret
key: connection-string
resources:
requests:
cpu: "500m"
memory: "256Mi"
limits:
cpu: "1000m"
memory: "512Mi"