附录 A:练习答案与评审参考
证书字段的责任表
用户应提交受控 Secret 引用或证书请求意图,不能让普通用户通过高权限控制器读取任意命名空间秘密。证书无效时保留旧有效配置还是停止服务,需要明确产品策略。Secret 删除后的行为、外部签发撤销以及旧证书清理,都属于字段契约的一部分。
空值、零值与默认
replicas 为零是合法停止数据面的意图,缺失则由当前 schema 拒绝。message 的空字符串被最小长度规则拒绝,省略时由服务器默认。客户端默认只是便利,服务器 schema 才是不同调用入口共享的规则。
删除中的误删资源
主对象已有 deletionTimestamp 后,不应补回被删除的 Service。协调进入清理分支,维护外部登记与 finalizer 的责任。阻塞解除后先清登记,再移除自身 finalizer,其他 finalizer 保留。
HPA 与固定副本
两者不能同时持续控制 Deployment.spec.replicas。支持 HPA 模式时,主资源需声明模式与边界,控制器让出该字段,并定义退出 HPA 模式的接管顺序。当前实现不支持 HPA,手工改副本会被修复回主资源意图。
等待当前意图
必须同时检查条件类型、True 状态和 observedGeneration 等于 metadata.generation。旧 True 只证明旧意图已处理。若等待期间用户再次更新 spec,客户端应重新追踪当前版本,或明确只等待提交时捕获的版本。
Service 转发的验证
port-forward 到 Service 可以绕过 ClusterIP 数据路径,不适合作为唯一转发证据。随书测试从客户端 Pod 请求完整 Service DNS,通过实际集群网络到达 Envoy。它证明固定环境的功能链路,不覆盖性能或无损更新。
增加 responseStatus
需要 schema 范围验证、配置编码、真实 HTTP 状态断言,并分离健康检查语义。用户选择返回五百不一定意味着进程不健康,不能直接让业务路径的返回码决定基础就绪。
外部 DNS 的恢复表
创建使用稳定 UID/操作键;超时后按键查询权威结果;删除前核对资源账户与 UID。没有幂等和结果查询的接口,未知状态应保留责任并要求人工判断。finalizer 不能替代远端协议。
状态更新权限缺失
子资源可能已创建,但 UpdateStatus 得到 Forbidden。应报告具体权限缺失并返回错误,权限恢复后再次协调已有资源。吞掉错误会掩盖未确认状态,也使队列误判成功。
版本字段重命名
alpha.message 与 beta.responseBody 的双向转换需要考虑默认、缺失和显式空值。若新字段表达能力更强,反向转换可能有信息损失,必须定义兼容限制。当前同结构 None 转换示例不证明这些规则已经实现。
四个不变量的证据
无关对象拒绝接管由 RefuseUnrelatedChild 验证;不提前确认新 generation 由 ConcurrentSpecCannotBeAcknowledgedEarly 验证;清理前保留责任由 BlockedFinalizerRecovery 验证;CRDServedStorageUpgrade 明确保留历史 storedVersions,且没有声称全量迁移。精确场景集合以发布下载的 validation.json 为准。