知其然,知其所以然
Kubernetes 2026-10-10

projected 卷:Secret、ConfigMap 与令牌合并挂载

在 kind 集群里实测 projected 卷:Secret、ConfigMap、Downward API 和 ServiceAccountToken 四种来源合并成同一个目录,items 控制路径与权限;items 写到同一路径会被拒绝,整体挂载的同名键则静默由后面的来源覆盖;来源缺失时 Pod 卡在 ContainerCreating,optional 让它先启动;serviceAccountToken 的 expirationSeconds 不能小于 10 分钟。

Kubernetes projected 卷 Secret ConfigMap Downward API ServiceAccountToken 真实验证 动画演示
Kubernetes 2026-10-10

ConfigMap 更新:挂载的文件多久变,环境变量不变

在 kind 集群里实测 ConfigMap 更新:挂载的文件要等 kubelet 同步,连续三次测到 60.0、66.7、76.0 秒(另一次 86 秒),环境变量始终不变;文件靠 ..data 符号链接整体切换,路径不变、旧目录被删;重启容器(不用重建 Pod)后环境变量才取到新值;删除 ConfigMap 后已运行的 Pod 不受影响,文件保留最后的版本,只多一条 FailedMount 事件。

Kubernetes ConfigMap 热更新 环境变量 kubelet 符号链接 真实验证 动画演示
Kubernetes 2026-10-10

subPath 挂载:为什么更新不生效

在 kind 集群里实测 subPath 挂载为什么不更新:同一个 ConfigMap 改成 v2,整体挂载 62 秒后更新,subPath 挂的文件 122 秒后仍是 v1;mountinfo 显示它绑定的是已被删除的旧时间戳目录里的旧文件(//deleted);重启容器后才取到 v2;subPath 的价值是只往目录里加一个文件而不遮住原有内容,subPathExpr 可以给每个 Pod 独立的子目录。

Kubernetes subPath ConfigMap volumeMounts bind mount subPathExpr 真实验证 动画演示
Kubernetes 2026-10-10

Secret:base64 不是加密,etcd 里存了什么

在 kind 集群里实测 Secret 的“保密”到底有多少:data 里是 base64 编码,base64 -d 就能还原;stringData 只是写入时的便利字段;etcd 里默认存原始字节,明文能直接 grep 到,和 ConfigMap 没区别;只有 list 权限的 ServiceAccount 单个 GET 是 403,LIST 却返回全部明文;挂进 Pod 后卷是 tmpfs,环境变量则进入进程环境。

Kubernetes Secret base64 etcd RBAC 安全 真实验证 动画演示
Kubernetes 2026-10-10

静态加密:EncryptionConfiguration 的效果

在 kind 单节点集群里实测 etcd 静态加密:开启 --encryption-provider-config 后新建的 Secret 在 etcd 里变成 k8s:enc:aescbc:v1:key1: 开头的密文,旧数据仍是明文,ConfigMap 不在配置里也是明文;kubectl get | replace 重写后旧数据才加密;轮换密钥必须先加新 key、换主 key、全部重写后才能删旧 key——删早了对象读不出来,连列表都失败。

Kubernetes Secret 静态加密 EncryptionConfiguration etcd 密钥轮换 真实验证 动画演示
Kubernetes 2026-10-10

不可变 ConfigMap 与 Secret:对 watch 数量的影响

在 kind 集群里实测不可变 ConfigMap:immutable: true 之后 data 不能改、不能撤销标志,元数据仍能改,可变对象可单向加锁;删除重建同名 immutable 对象,运行中的 Pod 100 秒后挂载的仍是旧值;20 个 Pod 各挂一个 ConfigMap 时,可变版本让按名字 watch 的连接数 +20,immutable 版本只 +2。

Kubernetes ConfigMap Secret immutable watch kubelet 真实验证 动画演示
Kubernetes 2026-10-10

Service 类型:ClusterIP、NodePort、LoadBalancer

在 kind 集群里实测四种 Service 类型:ClusterIP 在每个节点和 Pod 里都通、宿主机不通;NodePort 自动分配 30000-32767 的端口,所有节点(包括没有后端的)都能转发,超范围或重复端口被拒;LoadBalancer 没有云控制器时 EXTERNAL-IP 一直 <pending> 但仍分配 NodePort,allocateLoadBalancerNodePorts: false 可去掉它;ExternalName 只是一条 DNS CNAME,没有 iptables 规则。

Kubernetes Service ClusterIP NodePort LoadBalancer ExternalName kube-proxy 真实验证 动画演示
Kubernetes 2026-10-10

Headless Service:DNS 返回的是什么

在 kind 集群里实测 headless Service(clusterIP: None)的 DNS:普通 Service 只返回一个 ClusterIP,headless 返回全部 3 个 Pod IP 且每次顺序不同;StatefulSet 的 Pod 有稳定的 web-N.hl 域名,Pod 重建后 IP 变而名字不变;没就绪的 Pod 默认不在 DNS 里,publishNotReadyAddresses 才会发布;SRV 记录每个 Pod 一条。

Kubernetes Headless Service DNS StatefulSet SRV CoreDNS 真实验证 动画演示
Kubernetes 2026-10-10

EndpointSlice:Endpoints 的拆分与更新

在 kind 集群里实测 EndpointSlice:一个 Service 自动对应带 service-name 标签的切片,每个 endpoint 有 addresses、conditions、nodeName、targetRef,旧的 Endpoints 仍同步生成;205 个后端被拆成 100+100+5 三个切片,而 Endpoints 是 34891 字节的单个对象;删一个 Pod 只更新 1 个切片;终止中的 Pod 在切片里是 ready=false、serving=true、terminating=true。

Kubernetes EndpointSlice Endpoints Service kube-proxy 真实验证 动画演示
Kubernetes 2026-09-21

RBAC 鉴权:一条规则到底是怎么匹配上一次请求的

本机真实 Go 程序(逐字符转录自 kubernetes v1.37.0 真实源码,本机真实编译执行)验证 PolicyRule 的四重匹配逻辑、NonResourceURL 通配符的裸字符串前缀匹配陷阱、RoleBinding 引用 ClusterRole 时授权范围被收窄到单一命名空间的机制,以及 RBAC 没有拒绝语义、只有允许取并集的真相,对照真实源码。

RBAC 鉴权 动画演示
Kubernetes 2026-09-13

kube-scheduler:Filter 和 Score 到底在比什么

用 Python 逐数字复现 kube-scheduler 官方测试用例里的真实 Filter/Score 结果,讲清 NodeResourcesFit 的资源不足淘汰逻辑与 LeastAllocated 打分公式,对照真实源码。

调度器 Score 动画演示
Kubernetes 2026-09-12

Service / kube-proxy:一个 ClusterIP 请求是怎么被转发到 Pod 的

用 Python 逐字节复现 kube-proxy 官方测试用例里的真实 iptables 链名与负载均衡规则,验证链名哈希算法与概率分配公式,对照 kube-proxy 真实源码。

kube-proxy iptables 动画演示
京ICP备2026067502号-1京公网安备11010502063487号