在 kind 集群里实测 ConfigMap 更新:挂载的文件要等 kubelet 同步,连续三次测到 60.0、66.7、76.0 秒(另一次 86 秒),环境变量始终不变;文件靠 ..data 符号链接整体切换,路径不变、旧目录被删;重启容器(不用重建 Pod)后环境变量才取到新值;删除 ConfigMap 后已运行的 Pod 不受影响,文件保留最后的版本,只多一条 FailedMount 事件。
在 kind 集群里实测 subPath 挂载为什么不更新:同一个 ConfigMap 改成 v2,整体挂载 62 秒后更新,subPath 挂的文件 122 秒后仍是 v1;mountinfo 显示它绑定的是已被删除的旧时间戳目录里的旧文件(//deleted);重启容器后才取到 v2;subPath 的价值是只往目录里加一个文件而不遮住原有内容,subPathExpr 可以给每个 Pod 独立的子目录。
在 kind 集群里实测 Secret 的“保密”到底有多少:data 里是 base64 编码,base64 -d 就能还原;stringData 只是写入时的便利字段;etcd 里默认存原始字节,明文能直接 grep 到,和 ConfigMap 没区别;只有 list 权限的 ServiceAccount 单个 GET 是 403,LIST 却返回全部明文;挂进 Pod 后卷是 tmpfs,环境变量则进入进程环境。
在 kind 单节点集群里实测 etcd 静态加密:开启 --encryption-provider-config 后新建的 Secret 在 etcd 里变成 k8s:enc:aescbc:v1:key1: 开头的密文,旧数据仍是明文,ConfigMap 不在配置里也是明文;kubectl get | replace 重写后旧数据才加密;轮换密钥必须先加新 key、换主 key、全部重写后才能删旧 key——删早了对象读不出来,连列表都失败。
在 kind 集群里实测不可变 ConfigMap:immutable: true 之后 data 不能改、不能撤销标志,元数据仍能改,可变对象可单向加锁;删除重建同名 immutable 对象,运行中的 Pod 100 秒后挂载的仍是旧值;20 个 Pod 各挂一个 ConfigMap 时,可变版本让按名字 watch 的连接数 +20,immutable 版本只 +2。
在 kind 集群里实测四种 Service 类型:ClusterIP 在每个节点和 Pod 里都通、宿主机不通;NodePort 自动分配 30000-32767 的端口,所有节点(包括没有后端的)都能转发,超范围或重复端口被拒;LoadBalancer 没有云控制器时 EXTERNAL-IP 一直 <pending> 但仍分配 NodePort,allocateLoadBalancerNodePorts: false 可去掉它;ExternalName 只是一条 DNS CNAME,没有 iptables 规则。
在 kind 集群里实测 headless Service(clusterIP: None)的 DNS:普通 Service 只返回一个 ClusterIP,headless 返回全部 3 个 Pod IP 且每次顺序不同;StatefulSet 的 Pod 有稳定的 web-N.hl 域名,Pod 重建后 IP 变而名字不变;没就绪的 Pod 默认不在 DNS 里,publishNotReadyAddresses 才会发布;SRV 记录每个 Pod 一条。
在 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。
实测并发下的资源泄漏测试:异常路径没关的流,3 次调用测不出,2000 次并发 fd +285;默认 GC 下 System.gc() 把泄漏洗成 0,Epsilon GC 下仍是 +285;每次请求新建线程池 200 次 +400 线程;shutdown 后不等待会瞬时多出 400 线程;容量 10 的池泄漏后之后的调用全部超时。
在 Docker Desktop 29.8.2 上实测 Testcontainers:1.20.4 因为请求 API v1.32 被引擎拒绝(HTTP 400)而连不上,-Dapi.version=1.44 或升级到 1.21.4 才行;一个 postgres 容器 start 中位数 719 ms,每个测试方法一个容器比 static 容器慢 9.4 s 对 1.8 s;RYUK_DISABLED 加 kill -9 会泄漏容器;H2 会拒绝 4 / 12 条合法的 PostgreSQL 语句。
实测 JUnit 5.11 的超时:@Timeout 靠中断,忙等的测试照样跑满 3 秒才判失败;SEPARATE_THREAD 放弃线程但线程继续跑且 ThreadLocal 丢失;assertTimeout 不中断(3 秒后才失败);timeout.default 能让卡住的 @BeforeEach 1 秒失败;60 ms 的超时在满载机器上 300 次失败 292–296 次。
在 731 天里重放“依赖当前时间的夹具”:30 天前的夹具在 300 天失败,昨天的夹具在 208 天(所有周末)失败;随机夹具只在 4.1% 的运行里暴露 bug,记录种子后可 10/10 重放;改一个默认值,断言总价的测试坏 4–5 个而只断言目标项的测试坏 0–1 个;重夹具构造 8.9 微秒。