在 kind 集群里停掉一个 worker 的 kubelet,按秒记录时间线:+52 秒 Ready=Unknown 并同时打上 unreachable 的 NoSchedule 和 NoExecute 污点;容忍 30 秒的 Pod 在 +82 秒被标记删除,Deployment 在 +83 秒就有了新的替换 Pod,旧 Pod 停在 Terminating;默认容忍 300 秒和无限容忍的 Pod 都还在;kubelet 回来后 Terminating 的被清理。
在 kind 集群里实测 cordon 与 drain:cordon 设 spec.unschedulable 并加 NoSchedule 污点,只拦新 Pod;drain 默认拒绝裸 Pod、DaemonSet 管理的 Pod 和带 emptyDir 的 Pod,逐步加 --ignore-daemonsets、--delete-emptydir-data、--force 才成功(3.1 秒);PDB minAvailable=3 让 drain 每 5 秒重试直到 25 秒超时且 cordon 保持不变;uncordon 后 Pod 不会自己迁回。
在 kind 集群里实测 kubectl debug 的三种用法:往运行中的 Pod 加临时容器(--target 才能看到主容器的进程,临时容器不能删、不能设 resources、主容器不会重启);--copy-to 复制出独立的 Pod,在副本里换镜像换命令而原 Pod 不动,加 --share-processes 共享进程;debug node 创建 hostNetwork / hostPID / hostIPC 且挂载宿主机根目录的 privileged Pod,chroot /host 后就是节点自己的系统;--profile 的五种权限配置。
在 kind 节点上读 /proc/<PID>/ns:pause 与 Pod 里的两个容器共享同一个 net、ipc、uts 命名空间,pid、mnt、cgroup 各自独立;pause 进程只占 504 kB,镜像 268kB;同一网络命名空间让容器间用 localhost 互通且端口会冲突;只重启容器 IP 不变,杀掉 pause 沙箱重建 IP 就变(10.244.1.239 → .240)而 Pod uid 不变。
在 kind 集群里对照默认 Pod 和 shareProcessNamespace: true 的 Pod:共享后 PID 1 变成 /pause,app 的 sleep 是 PID 7;side 容器可以通过 /proc/7/root 读 app 的文件系统,可以 kill 它;孤儿短命进程在默认下留下 5 个僵尸,共享后因为 pause 会 wait 而是 0 个;容器重启后 PID 会变(7 → 62)且环境变量可被同 UID 的邻居读到。
在 kind 节点上对照读命名空间编号:hostNetwork 只打通 net 和 uts,hostPID 只打通 pid,hostIPC 只打通 ipc;hostNetwork Pod 的 IP 就是节点 IP,会和 kubelet 的 10250 冲突,DNS 默认退回节点的而解析集群内名字失败,要 ClusterFirstWithHostNet;hostPID 看到节点 34 行进程且 PID 1 是 systemd;hostPort 只靠 portmap 的 DNAT 映射一个端口,Pod 仍有自己的 IP,第二个同端口的 Pod 被 NodePorts 拒绝。
在 kind 集群里读 id、stat 和 /proc/1/status 验证 securityContext:runAsUser/runAsGroup/fsGroup/supplementalGroups 让 id 变成 uid=1000 gid=3000 groups=2000,3000,4000,5000,emptyDir 变成 2777 root:2000;默认容器 14 个能力、drop ALL 为 0、add NET_ADMIN 为 15、privileged 为 41;allowPrivilegeEscalation: false 让 NoNewPrivs=1;readOnlyRootFilesystem 只读根但卷可写;runAsNonRoot 遇到 root 镜像 CreateContainerConfigError。
在 kind 集群里用命名空间标签实测 Pod Security 准入:baseline 拒绝 privileged、hostNetwork、hostPath 和 NET_ADMIN 但允许 NET_BIND_SERVICE;restricted 对一个普通 Pod 一次列出 4 条违规,补齐才通过且只检查字段不看镜像;warn 模式只返回 Warning;enforce 下 Deployment 创建成功但 ReplicaSet 创建 Pod 时被拒;给已有 Pod 的命名空间加标签只警告、不驱逐,可以先 dry-run。
在 kind 集群里实测聚合 ClusterRole:内置 view / edit / admin 靠 aggregationRule 汇总出 13 / 28 / 30 条 rule;创建带 aggregate-to-view 标签的 ClusterRole 后 view 的 rules 立刻出现新资源的权限,alice(绑定 view)马上能 list,而 edit 和 admin 通过 view → edit → admin 的标签链也获得它;手动改聚合出来的 rules 会被控制器立刻还原;自建聚合角色的汇总不去重。
在 kind 集群里实测用户模拟:管理员 kubectl --as=alice 按 alice 的权限鉴权(绑定 view 前 Forbidden、后成功),--as-group 补充组并自动带上 system:authenticated,不写 --as 时 kubectl 直接拒绝;ServiceAccount 想模拟别人必须有 impersonate 权限,可以用 resourceNames 限制到 alice,模拟 bob 或借 system:masters 组都被拒;模拟之后只剩被模拟者的权限,不会叠加自己的。
在 kind 集群里拆开 kubectl auth can-i:它只是向 selfsubjectaccessreviews 发一次 POST(请求头带 Impersonate-User),返回 allowed 和 reason(RBAC: allowed by RoleBinding … of Role …);yes/no 对应退出码 0/1,resourceNames、命名空间范围、非资源 URL 都能查;--list 来自 SelfSubjectRulesReview(5 条 resourceRules,incomplete=false);资源名写错只给 Warning 且仍返回 no。
在 kind 集群里实测 ValidatingAdmissionPolicy:只有策略没有绑定不生效,绑定(validationActions: [Deny])0.9 秒后让 CEL 表达式 object.spec.replicas <= 3 拦住 CREATE 和 patch,但 kubectl scale 走的 deployments/scale 子资源没被匹配;paramKind + paramRef 把阈值放进 ConfigMap,改参数 0.1 秒后生效;Warn 只提示、Deny 与 Warn 不能同时写;写错字段名时 status.typeChecking 立刻给出警告。