kubernetes(K8s)学习笔记:第五期与第六期核心知识点学习自测与详解
本自测解析针对 Kubernetes 系列第五期(存储与配置管理)和第六期(控制器管理)的核心内容。共 10 题,每题包含题目回顾、考查知识点、详细解答与分析,帮助读者巩固存储、配置与控制器管理技能。
第五期:存储与配置管理(5 题)
题目一:emptyDir、hostPath、NFS 三种 Volume 的区别
题目:请对比 Kubernetes 中 emptyDir、hostPath 和 NFS 三种 Volume 类型的特性,包括:数据持久性、跨节点共享能力、适用场景。并说明为什么 hostPath 不适合生产环境多节点集群?
考查知识点
- Volume 类型对比 ------ 第五期 §2、§3、§4
- 各类型适用场景
详细解答
| 特性 | emptyDir | hostPath | NFS |
|---|---|---|---|
| 数据持久性 | Pod 删除即清除 | 宿主机保留 | 服务端保留 |
| 跨节点共享 | ❌ 不共享 | ❌ 不共享(各节点独立) | ✅ 共享 |
| 适用场景 | 容器间临时数据共享 | 单节点测试、访问宿主机文件 | 跨节点共享存储 |
| 生产环境推荐 | 中等 | ❌ 低 | ✅ 高 |
| 数据安全性 | 低(随 Pod 删除) | 中(宿主机保留,但依赖节点) | 高(集中存储) |
hostPath 不适合多节点集群的原因:
- 数据不跨节点:Pod 被调度到不同节点时,数据不可见
- 节点故障数据丢失:节点宕机后,本地数据可能无法恢复
- 权限问题:不同节点上目录权限可能不一致
- 安全风险:Pod 可能访问宿主机敏感目录
题目二:PV 与 PVC 架构及访问模式
题目:请解释 Kubernetes 中 PV 和 PVC 的概念及其关系。PV 的访问模式有哪些?每种访问模式的缩写是什么?NFS 支持哪些访问模式?
考查知识点
- PV/PVC 架构 ------ 第五期 §5.1
- 访问模式(accessModes)------ 第五期 §5.5
详细解答
PV(PersistentVolume):集群级别的存储资源,由管理员预先创建,描述后端存储的容量、类型和访问方式。
PVC(PersistentVolumeClaim):命名空间级别的存储申请,由用户创建,声明所需的存储容量和访问模式。
绑定关系:Kubernetes 控制平面根据 PVC 的请求(容量、访问模式、存储类)自动匹配合适的 PV 并进行绑定。
访问模式:
| 模式 | 缩写 | 含义 | NFS 支持 |
|---|---|---|---|
ReadWriteOnce |
RWO | 单节点读写 | ✅ |
ReadOnlyMany |
ROX | 多节点只读 | ✅ |
ReadWriteMany |
RWX | 多节点读写 | ✅ |
ReadWriteOncePod |
RWOP | 单 Pod 读写 | 取决于驱动 |
关键理解:NFS 是少数同时支持 RWO、ROX、RWX 三种访问模式的存储类型,因此非常适合作为 Kubernetes 共享存储的后端。
题目三:PV 回收策略
题目 :PV 支持哪几种回收策略?请解释 Retain 策略的工作流程。当一个 PV 处于 Released 状态时,如何使其重新可用?
考查知识点
- PV 回收策略 ------ 第五期 §5.6
- Retain 策略
详细解答
PV 回收策略:
| 策略 | 行为 | 状态 |
|---|---|---|
| Retain(默认) | PVC 删除后,PV 保留数据,状态变为 Released | ✅ 当前支持 |
| Recycle | 自动清理数据后重新可用 | ❌ 已废弃 |
| Delete | 删除 PV 和关联的后端存储 | ✅ 当前支持 |
Retain 策略工作流程:
- PVC 被删除
- PV 状态变为
Released - PV 仍保留后端的实际数据
- PV 中的
claimRef保留原 PVC 的引用信息 - 新的 PVC 无法自动绑定该 PV(因为
claimRef残留)
使 Released PV 重新可用:
bash
# 1. 查看 PV 状态
kubectl get pv
# 状态为 Released
# 2. 编辑 PV,删除 claimRef 部分
kubectl edit pv web
# 删除 spec.claimRef 整个段落
# 3. 保存后,PV 状态变为 Available
kubectl get pv
# 状态为 Available
# 4. 新的 PVC 可以绑定该 PV
题目四:ConfigMap 与 Secret 的区别
题目:请从用途、数据编码、数据大小、更新机制、安全性五个维度对比 ConfigMap 和 Secret。Secret 的 Base64 编码是加密吗?为什么?
考查知识点
- ConfigMap vs Secret ------ 第五期 §6、§7
- Secret 安全性
详细解答
| 对比维度 | ConfigMap | Secret |
|---|---|---|
| 用途 | 存储非敏感配置数据 | 存储敏感数据(密码、密钥、证书) |
| 数据编码 | 明文 | Base64 编码 |
| 数据大小 | 1 MiB | 1 MiB |
| 更新机制 | Volume 方式支持动态更新 | Volume 方式支持动态更新 |
| 安全性 | 低 | 中等(可启用 etcd 加密) |
Base64 不是加密:
- Base64 只是一种编码方式,不是加密算法
- 任何人都可以解码:
echo -n cmVkaGF0 | base64 -d→redhat - 真正的安全需要:
- 启用 etcd 加密(
--encryption-provider-config) - 使用 RBAC 限制 Secret 访问权限
- 考虑使用外部 Secret 管理工具(如 HashiCorp Vault)
- 启用 etcd 加密(
题目五:ConfigMap 动态更新
题目:当 ConfigMap 以 Volume 方式挂载到 Pod 后,更新 ConfigMap 的内容,Pod 内的文件会自动更新吗?如果是,大概需要多长时间?环境变量方式引用的 ConfigMap 会动态更新吗?
考查知识点
- ConfigMap 动态更新 ------ 第五期 §6.4
- Volume 挂载 vs 环境变量
详细解答
Volume 挂载方式:
- ✅ 会自动更新
- kubelet 周期性同步检查(默认约 30~60 秒)
- Pod 内文件内容自动刷新
环境变量方式:
- ❌ 不会自动更新
- 环境变量在 Pod 启动时注入一次
- 需要重启 Pod 才能生效
验证命令:
bash
# 1. 查看当前内容
kubectl exec web -- cat /usr/share/nginx/html/index.html
# 2. 更新 ConfigMap
kubectl edit configmap web1
# 3. 等待约 30~60 秒后再次查看
kubectl exec web -- cat /usr/share/nginx/html/index.html
# 内容已更新
第六期:控制器管理(5 题)
题目六:ReplicaSet 与 Deployment 的关系
题目 :ReplicaSet 和 Deployment 的关系是什么?为什么生产环境推荐使用 Deployment 而不是直接使用 ReplicaSet?Deployment 的 spec.selector 和 ReplicaSet 的 selector 必须匹配吗?
考查知识点
- ReplicaSet 与 Deployment 关系 ------ 第六期 §2、§3
- 控制器层级关系
详细解答
关系:
- Deployment 管理 ReplicaSet
- Deployment 通过创建、更新、删除 ReplicaSet 来实现滚动更新和版本回滚
- 每个 Deployment 版本对应一个 ReplicaSet
层级关系:
text
Deployment (web)
└── ReplicaSet (web-5899d78c9) ← 版本 1
│ └── Pod (web-xxx)
│ └── Pod (web-yyy)
└── ReplicaSet (web-6c57bdf5f4) ← 版本 2
└── Pod (web-zzz)
生产环境推荐 Deployment 的原因:
- 支持滚动更新(零停机部署)
- 支持版本回滚
- 支持暂停/恢复更新
- 提供更新历史记录
- ReplicaSet 是 Deployment 的实现细节,直接操作 ReplicaSet 会失去上述能力
Selector 匹配规则:
- Deployment 的
spec.selector必须 与 ReplicaSet 的selector一致 - 两者都必须匹配 Pod 模板中的 labels
- 不一致会导致 Deployment 无法管理 ReplicaSet
题目七:滚动更新策略与 maxSurge/maxUnavailable
题目 :Deployment 滚动更新时,maxSurge 和 maxUnavailable 两个参数的作用是什么?假设期望副本数为 10,maxSurge=25%,maxUnavailable=25%,请计算:最大副本数是多少?最小可用副本数是多少?
考查知识点
- 滚动更新机制 ------ 第六期 §3.8
- maxSurge / maxUnavailable
详细解答
参数含义:
| 参数 | 含义 |
|---|---|
| maxSurge | 滚动更新过程中超过期望副本数的最大数量(百分比或绝对值) |
| maxUnavailable | 滚动更新过程中不可用副本数占期望值的最大比例(百分比或绝对值) |
计算(期望副本数=10,maxSurge=25%,maxUnavailable=25%):
- maxSurge = ceil(10 × 25%) = 3(向上取整)
- maxUnavailable = floor(10 × 25%) = 2(向下取整)
| 结果 | 数值 | 计算 |
|---|---|---|
| 最大副本数 | 13 | 10 + 3 |
| 最小可用副本数 | 8 | 10 - 2 |
配置示例:
yaml
spec:
strategy:
rollingUpdate:
maxSurge: 25%
maxUnavailable: 25%
题目八:DaemonSet 的使用场景与调度
题目:DaemonSet 的典型使用场景有哪些?为什么 master 节点上默认不会运行普通的 DaemonSet Pod?如何让 DaemonSet 在 master 节点上运行?
考查知识点
- DaemonSet 使用场景 ------ 第六期 §4.1
- Taint 与 Toleration ------ 第六期 §4.3
详细解答
DaemonSet 典型场景:
| 场景 | 示例 |
|---|---|
| 日志收集 | Fluentd、Logstash(每个节点采集日志) |
| 监控采集 | Prometheus Node Exporter(每个节点采集指标) |
| 网络插件 | Calico Node、kube-proxy(每个节点提供网络能力) |
| 存储插件 | CSI Node Driver(每个节点管理存储卷) |
Master 节点默认不运行 DaemonSet Pod 的原因:
- Master 节点有 Taint(污点) :
node-role.kubernetes.io/control-plane:NoSchedule - 该 Taint 阻止普通 Pod 调度到 master 节点
- 系统级 DaemonSet(如 calico-node、kube-proxy)通过 Toleration 可以绕过
让 DaemonSet 在 master 节点运行的方法:
方法 1:添加 Toleration(推荐)
yaml
spec:
template:
spec:
tolerations:
- key: node-role.kubernetes.io/control-plane
operator: Exists
effect: NoSchedule
方法 2:移除 Taint(不推荐)
bash
kubectl taint node master node-role.kubernetes.io/control-plane-
题目九:Job 的 restartPolicy 与 backoffLimit
题目 :Job 的 restartPolicy 有哪两种有效取值?它们的行为有何不同?backoffLimit 的作用是什么?当一个 Job 因错误命令持续失败时,如何避免无限创建 Pod?
考查知识点
- Job restartPolicy ------ 第六期 §5.4
- backoffLimit ------ 第六期 §5.5
详细解答
restartPolicy 有效取值:
| 策略 | 行为 | Pod 数量 | 适用场景 |
|---|---|---|---|
| Never | 失败时创建新的 Pod | 可能多个 | 不希望 Pod 重启,每次都是全新环境 |
| OnFailure | 失败时重启 Pod | 始终 1 个 | 希望复用 Pod,减少创建开销 |
实验对比 (错误命令 echoxxx):
| 策略 | 观察结果 |
|---|---|
| Never | 多个 Pod 持续创建,全部 StartError |
| OnFailure | 始终 1 个 Pod,RESTARTS 不断增加 |
backoffLimit:
- 控制 Job 失败重试的最大次数
- 默认值为 6
- 达到限制后,Job 状态变为
Failed
yaml
spec:
backoffLimit: 2 # 最多重试 2 次
避免无限创建 Pod:
- 设置合理的
backoffLimit - 使用
activeDeadlineSeconds设置超时 - 使用
restartPolicy: Never时注意重试次数
优先级 :
activeDeadlineSeconds的优先级高于backoffLimit。即使重试次数未达到限制,超时后也会终止 Job。
题目十:CronJob 的并发策略与时间表
题目 :CronJob 的 .spec.concurrencyPolicy 有哪三种取值?分别说明其行为。Cron 时间表 0 2 * * 1-5 表示什么?如果错过了调度时间,如何控制是否执行?
考查知识点
- CronJob 并发策略 ------ 第六期 §6.4
- Cron 时间表语法 ------ 第六期 §6.3
- startingDeadlineSeconds ------ 第六期 §6.4
详细解答
concurrencyPolicy 三种取值:
| 策略 | 行为 | 说明 |
|---|---|---|
Allow(默认) |
允许并发执行 | 即使旧 Job 未完成,新 Job 仍会创建 |
Forbid |
禁止并发执行 | 旧 Job 未完成时,跳过新 Job 的执行 |
Replace |
替换当前运行的任务 | 取消正在运行的 Job,用新 Job 替换 |
Cron 时间表解析:
0 2 * * 1-5
- 分钟:0
- 小时:2(凌晨 2 点)
- 日:*(每天)
- 月:*(每月)
- 星期:1-5(周一至周五)
含义:每周一至周五凌晨 2 点执行
错过调度时间的控制:
startingDeadlineSeconds:错过了调度时间后,开始任务的截止时间(秒)
yaml
spec:
startingDeadlineSeconds: 200 # 错过调度后 200 秒内仍可执行
- 设置后,超过截止时间则跳过该次执行
- 不设置则没有截止时间
- 适用于备份等可以跳过、但不能太晚执行的任务
附:知识点对应总表
| 题号 | 主要考查知识点(对应笔记章节) |
|---|---|
| 1 | 第五期 §2、§3、§4 emptyDir / hostPath / NFS 对比 |
| 2 | 第五期 §5.1 PV/PVC 架构;§5.5 访问模式 |
| 3 | 第五期 §5.6 PV 回收策略(Retain) |
| 4 | 第五期 §6、§7 ConfigMap vs Secret |
| 5 | 第五期 §6.4 ConfigMap 动态更新 |
| 6 | 第六期 §2 ReplicaSet;§3 Deployment 关系 |
| 7 | 第六期 §3.8 滚动更新机制(maxSurge/maxUnavailable) |
| 8 | 第六期 §4.1 DaemonSet 场景;§4.3 Taint/Toleration |
| 9 | 第六期 §5.4 restartPolicy;§5.5 backoffLimit |
| 10 | 第六期 §6.4 concurrencyPolicy;§6.3 Cron 语法;startingDeadlineSeconds |
学习建议:对于答错的题目,请回看第五期或第六期对应章节,并动手在集群环境中验证。存储配置和控制器管理是 Kubernetes 生产环境的核心技能,建议结合实验加深理解。
--- Compiled and Authored by Whisky --- June 27th, 2026