LabHub
学习 学习路径 课程

CKAD — Kubernetes 应用开发者

Pod 设计 — 标签、命令、Job、CronJob

在 LabHub 中继续学习

目标

能够亲自指定 Pod 的元数据(标签、注解)与运行方式(command/args/env/restartPolicy),并填写批处理工作负载 Job 和 CronJob 的核心字段。

为什么重要

CKAD 题目中有一半归根结底是在问“这个值应该写在哪个字段”。标签和注解虽然都是 metadata 下的字符串映射,但用途完全相反。标签是供选择器筛选的值,Service、Deployment、NetworkPolicy 都会查看它。注解则是选择器绝不会查看的备注,用于存放工具读取的配置(change-cause、控制器提示)。混淆两者会导致 Service 无法关联 Endpoint。

commandargs 也是如此。它们分别覆盖镜像中的 ENTRYPOINT/CMD,并不等同于通常意义上的“命令和参数”。只修改 command 时,CMD 仍会原样附加,可能形成奇怪组合;只修改 args 时,新参数会附加到原 ENTRYPOINT。

Job 是“统计成功次数”的控制器。Deployment 维持“当前运行多少个”,而 Job 统计“到目前为止成功了多少次”。因此,如果 Pod 的 restartPolicy 设为 Always,Pod 将永远不会结束,Job 也无法完成。

步骤

  1. 创建命名空间 ckad-design,并在其中创建 Pod web。镜像 nginx:1.27,标签为 app=webtier=frontend
  2. 为 Pod web 添加注解 owner=platform-team。在同一命名空间中创建 Pod api——镜像 nginx:1.27,标签为 app=apitier=backend
  3. 创建 Pod runner。镜像 busybox:1.36command["/bin/sh"]args["-c", "sleep 3600"]
  4. 创建 Pod envtest。镜像 busybox:1.36,标签 tier=backend。将环境变量 APP_ENV=productionAPP_TIER=backend 设为固定值,并让 POD_NAME 通过 Downward API 引用 metadata.namecommand["/bin/sh","-c","sleep 3600"]
  5. 创建 Pod oneshot。镜像 busybox:1.36restartPolicyNevercommand["/bin/sh","-c","echo done"]
  6. 创建 Job batch-sumcompletions: 4parallelism: 2backoffLimit: 3,Pod 的 restartPolicyOnFailure,容器镜像为 busybox:1.36
  7. 创建 CronJob nightly-reportschedule: "17 3 * * *"concurrencyPolicy: ForbidstartingDeadlineSeconds: 120successfulJobsHistoryLimit: 3,容器镜像 busybox:1.36,Pod 的 restartPolicyOnFailure
  8. ckad-design 命名空间中,将标签为 tier=backend 的 Pod 名称逐行保存到 /root/ckad-design/backend-pods.txt(只保留名称,不含 pod/ 前缀)。

参考

命名空间与第一个 Pod

创建命名空间 ckad-design,并在其中创建 Pod web。镜像 nginx:1.27,标签为 app=webtier=frontend

先创建命名空间,再在其中创建 Pod。标签应放在 metadata.labels 中。可以为 kubectl run 提供 --labels,或使用 --dry-run=client -o yaml 生成骨架后修改,这样更快。

区分标签与注解

为 Pod web 添加注解 owner=platform-team。在同一命名空间中创建 Pod api——镜像 nginx:1.27,标签为 app=apitier=backend

标签是供选择器筛选的值,注解则是选择器不会查看的备注。可以使用 kubectl labelkubectl annotate 为已经创建的 Pod 补充它们。

使用 command 和 args 覆盖镜像默认值

创建 Pod runner。镜像 busybox:1.36command["/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=productionAPP_TIER=backend 设为固定值,并让 POD_NAME 通过 Downward API 引用 metadata.namecommand["/bin/sh","-c","sleep 3600"]

固定值使用 env[].value,Pod 自身的元数据通过 env[].valueFrom.fieldRef.fieldPath 获取。Pod 名称的字段路径以 metadata. 开头。

使用 restartPolicy 创建一次性 Pod

创建 Pod oneshot。镜像 busybox:1.36restartPolicyNevercommand["/bin/sh","-c","echo done"]

spec.restartPolicy 是 Pod 层级字段。默认值 Always 用于长期运行;只运行一次便结束的任务应使用其他值。该字段创建后不可修改,因此需要删除并重新创建。

Job 的完成次数与并行度

创建 Job batch-sumcompletions: 4parallelism: 2backoffLimit: 3,Pod 的 restartPolicyOnFailure,容器镜像为 busybox:1.36

completions 指总共成功多少次才算结束,parallelism 指同时运行多少个。backoffLimit 是失败重试上限,默认值为 6。Job Pod 的 restartPolicy 只能使用两个值。

CronJob 调度与并发策略

创建 CronJob nightly-reportschedule: "17 3 * * *"concurrencyPolicy: ForbidstartingDeadlineSeconds: 120successfulJobsHistoryLimit: 3,容器镜像 busybox:1.36,Pod 的 restartPolicyOnFailure

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/이름 形式,因此必须去掉前缀。文件中每行只能包含一个名称。