亲眼看应用真实活着的样子
本实验在应用会真实运行的集群中进行
VM 中运行着真正的 k3s。kubelet 会真正执行探针,Job 会真正完成,ConfigMap 也会真正挂载。
CKAD 课程其他实验使用的模拟集群中,**这些行为一个都不会发生。**即使配置探针也不会运行,创建 Job 也不会完成。
环境首次启动大约需要 2 分钟。
目标
通过实际行为验证三类探针、Job 与 CronJob、QoS 以及配置注入。
为什么重要
CKAD 中常见的错误并非语法问题,而是对行为差异理解不足。
- 只有为启动缓慢的应用配置较短的 liveness,才能理解为什么需要
startupProbe。应用会在完全启动前被终止,然后重新启动,如此无限循环。 completions和parallelism分别表示“需要成功多少次”和“同时运行多少个”。混淆两者会使 Job 永远无法结束,或运行超过需要的实例。- 以卷的方式注入 ConfigMap 时,值改变后文件会更新;以环境变量注入时,则必须重新创建 Pod。
步骤
所有资源都创建在 ckad 命名空间中。
slow-start——为启动约需 20 秒的容器同时配置较短的livenessProbe和startupProbe,并将其不发生重启即可就绪的结果保存到/root/ckad/startup.txt。- 创建
apiDeployment(副本数 3)和 Service,但让其中一个 Pod 的 readiness 失败,并将它从 Endpoint 中移除的结果保存到/root/ckad/endpoints.txt。 - 创建
batchJob(completions: 3,指定parallelism),并将其实际完成的结果保存到/root/ckad/job.txt。 - 让
doomedJob 耗尽backoffLimit并进入Failed,将结果保存到/root/ckad/backoff.txt。 - 创建
tickCronJob,使其实际运行至少一次,并将结果保存到/root/ckad/cronjob.txt。同时设置concurrencyPolicy。 - 使用
qos-guaranteed、qos-burstable、qos-besteffort三个 Pod 创建三种 QoS 等级,并将结果保存到/root/ckad/qos.txt。 - 使用
cfg-pod同时以卷和环境变量两种方式注入 ConfigMap,并将它们在 Pod 内的呈现方式保存到/root/ckad/config.txt。 - 在
/root/ckad/report.md中写入startup_restarts=、job_completions=、evicted_first=三行及其说明。
参考
startupProbe成功前,livenessProbe和readinessProbe不会启动。因此它适用于启动缓慢的应用。- 使用
kubectl -n ckad get job batch -o jsonpath='{.status}'查看 Job 状态。 - QoS 位于
kubectl get pod <이름> -o jsonpath='{.status.qosClass}',它不能直接指定,而是由 requests/limits 决定。 - CronJob 的
schedule写法类似*/1 * * * *。每分钟运行一次,实验期间至少会执行一次。 - 常见错误 1:只配置
startupProbe,却没有配置livenessProbe。startupProbe 只是推迟 liveness 的机制,单独使用没有意义。 - 常见错误 2:为了创建 QoS
Guaranteed而只设置requests。所有资源的 requests 与 limits 必须完全相等。
启动缓慢时
为 slow-start 中启动约需 20 秒的容器同时配置较短的 livenessProbe 和 startupProbe,并将其不发生重启即可就绪的结果保存到 /root/ckad/startup.txt。
只配置较短的 liveness 时,应用会在完全启动前被终止。startupProbe 会推迟该检查。
未就绪的 Pod 会被移除
创建 api Deployment(副本数 3)和 Service,但让其中一个 Pod 的 readiness 失败,并将它从 Endpoint 中移除的结果保存到 /root/ckad/endpoints.txt。
让 ReplicaSet 中仅有一个 Pod 的 readiness 失败,然后查看 EndpointSlice。
completions 与 parallelism
创建 batch Job(completions: 3,指定 parallelism),并将其实际完成的结果保存到 /root/ckad/job.txt。
completions 表示需要成功多少次,parallelism 表示同时运行多少个。
Job 何时放弃
让 doomed Job 耗尽 backoffLimit 并进入 Failed,将结果保存到 /root/ckad/backoff.txt。
在按 backoffLimit 重试后,会添加 Failed 条件。将该值设小,避免等待过久。
执行发生重叠时
创建 tick CronJob,使其实际运行至少一次,并将结果保存到 /root/ckad/cronjob.txt。同时设置 concurrencyPolicy。
使用 */1 * * * * 使其每分钟运行一次,并等待至少执行一次。同时设置 concurrencyPolicy。
资源不足时谁会最先被驱逐
使用 qos-guaranteed、qos-burstable、qos-besteffort 三个 Pod 创建三种 QoS 等级,并将结果保存到 /root/ckad/qos.txt。
QoS 不能直接指定,而是由 requests/limits 的组合决定。
卷与环境变量有所不同
使用 cfg-pod 同时以卷和环境变量两种方式注入 ConfigMap,并将它们在 Pod 内的呈现方式保存到 /root/ckad/config.txt。
用两种方式注入同一个 ConfigMap,并比较它们在 Pod 内的呈现方式。
总结学到了什么
在 /root/ckad/report.md 中写入 startup_restarts=、job_completions=、evicted_first= 三行及其说明。
写入 startup_restarts=、job_completions=、evicted_first= 三行及其说明。