Pod 设计 — 标签、命令、Job、CronJob
目标
能够亲自指定 Pod 的元数据(标签、注解)与运行方式(command/args/env/restartPolicy),并填写批处理工作负载 Job 和 CronJob 的核心字段。
为什么重要
CKAD 题目中有一半归根结底是在问“这个值应该写在哪个字段”。标签和注解虽然都是 metadata 下的字符串映射,但用途完全相反。标签是供选择器筛选的值,Service、Deployment、NetworkPolicy 都会查看它。注解则是选择器绝不会查看的备注,用于存放工具读取的配置(change-cause、控制器提示)。混淆两者会导致 Service 无法关联 Endpoint。
command 和 args 也是如此。它们分别覆盖镜像中的 ENTRYPOINT/CMD,并不等同于通常意义上的“命令和参数”。只修改 command 时,CMD 仍会原样附加,可能形成奇怪组合;只修改 args 时,新参数会附加到原 ENTRYPOINT。
Job 是“统计成功次数”的控制器。Deployment 维持“当前运行多少个”,而 Job 统计“到目前为止成功了多少次”。因此,如果 Pod 的 restartPolicy 设为 Always,Pod 将永远不会结束,Job 也无法完成。
步骤
- 创建命名空间
ckad-design,并在其中创建 Podweb。镜像nginx:1.27,标签为app=web和tier=frontend。 - 为 Pod
web添加注解owner=platform-team。在同一命名空间中创建 Podapi——镜像nginx:1.27,标签为app=api和tier=backend。 - 创建 Pod
runner。镜像busybox:1.36,command为["/bin/sh"],args为["-c", "sleep 3600"]。 - 创建 Pod
envtest。镜像busybox:1.36,标签tier=backend。将环境变量APP_ENV=production、APP_TIER=backend设为固定值,并让POD_NAME通过 Downward API 引用metadata.name。command为["/bin/sh","-c","sleep 3600"]。 - 创建 Pod
oneshot。镜像busybox:1.36,restartPolicy为Never,command为["/bin/sh","-c","echo done"]。 - 创建 Job
batch-sum。completions: 4、parallelism: 2、backoffLimit: 3,Pod 的restartPolicy为OnFailure,容器镜像为busybox:1.36。 - 创建 CronJob
nightly-report。schedule: "17 3 * * *"、concurrencyPolicy: Forbid、startingDeadlineSeconds: 120、successfulJobsHistoryLimit: 3,容器镜像busybox:1.36,Pod 的restartPolicy为OnFailure。 - 在
ckad-design命名空间中,将标签为tier=backend的 Pod 名称逐行保存到/root/ckad-design/backend-pods.txt(只保留名称,不含pod/前缀)。
参考
- 使用
kubectl run web --image=nginx:1.27 -n ckad-design --labels=app=web,tier=frontend --dry-run=client -o yaml > web.yaml生成骨架后再修改会更快。 kubectl create job/kubectl create cronjob也支持--dry-run=client -o yaml。Job 规范中的completions、parallelism没有对应标志,需要直接修改 YAML。- 常见错误 1:把
restartPolicy写在容器下。它是 Pod 层级(spec.restartPolicy)字段(原生 Sidecar 除外)。 - 常见错误 2:在
args中放入一个字符串"-c sleep 3600"。必须按数组元素拆分。 - 第 8 步中,
kubectl get pods -l tier=backend -o name会输出类似pod/api。使用cut -d/ -f2或-o jsonpath='{.items[*].metadata.name}'只保留名称。
命名空间与第一个 Pod
创建命名空间 ckad-design,并在其中创建 Pod web。镜像 nginx:1.27,标签为 app=web 和 tier=frontend。
先创建命名空间,再在其中创建 Pod。标签应放在 metadata.labels 中。可以为 kubectl run 提供 --labels,或使用 --dry-run=client -o yaml 生成骨架后修改,这样更快。
区分标签与注解
为 Pod web 添加注解 owner=platform-team。在同一命名空间中创建 Pod api——镜像 nginx:1.27,标签为 app=api 和 tier=backend。
标签是供选择器筛选的值,注解则是选择器不会查看的备注。可以使用 kubectl label、kubectl annotate 为已经创建的 Pod 补充它们。
使用 command 和 args 覆盖镜像默认值
创建 Pod runner。镜像 busybox:1.36,command 为 ["/bin/sh"],args 为 ["-c", "sleep 3600"]。
command 覆盖 Dockerfile 的 ENTRYPOINT,args 覆盖 CMD。二者都是 YAML 字符串数组;如需使用 Shell 语法(;、&&),必须显式调用 Shell。
环境变量与 Downward API
创建 Pod envtest。镜像 busybox:1.36,标签 tier=backend。将环境变量 APP_ENV=production、APP_TIER=backend 设为固定值,并让 POD_NAME 通过 Downward API 引用 metadata.name。command 为 ["/bin/sh","-c","sleep 3600"]。
固定值使用 env[].value,Pod 自身的元数据通过 env[].valueFrom.fieldRef.fieldPath 获取。Pod 名称的字段路径以 metadata. 开头。
使用 restartPolicy 创建一次性 Pod
创建 Pod oneshot。镜像 busybox:1.36,restartPolicy 为 Never,command 为 ["/bin/sh","-c","echo done"]。
spec.restartPolicy 是 Pod 层级字段。默认值 Always 用于长期运行;只运行一次便结束的任务应使用其他值。该字段创建后不可修改,因此需要删除并重新创建。
Job 的完成次数与并行度
创建 Job batch-sum。completions: 4、parallelism: 2、backoffLimit: 3,Pod 的 restartPolicy 为 OnFailure,容器镜像为 busybox:1.36。
completions 指总共成功多少次才算结束,parallelism 指同时运行多少个。backoffLimit 是失败重试上限,默认值为 6。Job Pod 的 restartPolicy 只能使用两个值。
CronJob 调度与并发策略
创建 CronJob nightly-report。schedule: "17 3 * * *"、concurrencyPolicy: Forbid、startingDeadlineSeconds: 120、successfulJobsHistoryLimit: 3,容器镜像 busybox:1.36,Pod 的 restartPolicy 为 OnFailure。
schedule 是五段式 Cron 表达式(分、时、日、月、星期)。concurrencyPolicy 决定上一次运行尚未结束时如何处理;startingDeadlineSeconds 指错过计划时间后,最多允许延迟多少秒启动。
综合:使用标签选择器导出列表
在 ckad-design 命名空间中,将标签为 tier=backend 的 Pod 名称逐行保存到 /root/ckad-design/backend-pods.txt(只保留名称,不含 pod/ 前缀)。
使用 kubectl get pods -l key=value 筛选,再用 -o name 或 -o jsonpath 只保留名称。-o name 会输出 pod/이름 形式,因此必须去掉前缀。文件中每行只能包含一个名称。