黄金路径不该是强制,而该是最省事的那条路
一句话总结
黄金路径(golden path)不是“只能走这条路”的规定,而是**“这条路最方便,根本没有理由改走其他路”**的状态。靠强制建立的不是黄金路径,而是关卡(gate),而关卡总会被绕过。
为什么需要它
平台团队制定标准的方式,通常分为两种。
禁止型——“禁止部署自行编写的 Deployment,必须使用我们的 chart。”短期内合规率会上升。但当某些团队的需求无法满足时,例外审批流程就会出现;例外不断累积后,标准也会失去意义。更重要的是,平台团队会变成裁判,与开发团队形成对立关系。
黄金路径型——“使用这个模板,五分钟内就能启动一个具备可观测性、安全和部署能力的服务。也可以选择其他方式,但那样就要自己负责这三项。”即使没有强制要求,大多数团队仍会采用,因为设计让“选择省事”与“遵守标准”指向了同一个方向。
核心洞见是:**人们不是沿着规定前进,而是沿着摩擦更小的方向前进。**平台的工作,就是让正确路径的摩擦接近于零。
它如何工作
黄金路径的最小组成
一条黄金路径必须把以下四项融为一个整体。缺少任何一项,它就会退化成“示例仓库”。
- 脚手架——通过一条命令或一张表单生成仓库、清单与流水线。
- 默认值——预先包含资源请求与限制、安全上下文、探针、标签规范和可观测性注解。
- 文档——与生成的代码共存,模板变化时一同更新。
- 所有权——创建时立即在目录中记录负责团队,避免六个月后出现“这是谁的?”
文档为何必须与其他组成部分共为一体,经常被低估。模板会不断演进;如果文档单独放在 Wiki,三个月后就会产生偏差,而错误文档比没有文档更糟。因此,docs-as-code——在同一仓库、同一 PR 和同一评审中管理代码与文档——是黄金路径的必要组成部分。
自助服务与护栏的平衡
自助服务意味着扩大权限,护栏则防止扩大的权限导致事故。两者如何配置,决定了开发者体验。
| 护栏位置 | 示例 | 反馈速度 | 开发者体验 |
|---|---|---|---|
| 模式(API 服务器) | CRD 的 maximum: 10 |
立即 | 最佳 |
| admission 策略 | 策略引擎的验证 Webhook | 立即(应用时) | 良好(前提是消息清晰) |
| 配额与限制 | ResourceQuota、LimitRange | 立即(创建时) | 良好 |
| CI 检查 | 流水线中的 lint 与策略检查 | 数分钟 | 一般 |
| 事后审计 | 报告、仪表板 | 数小时至数天 | 较差 |
原则是尽可能向左移动。同一条规则,用模式实现优于事后报告。失败应该尽早、就近发生,并用人类可读的语言解释。
护栏还必须附带理由。“拒绝:违反策略”与“拒绝:生产命名空间中的容器必须设置内存限制,例如 resources.limits.memory: 512Mi”之间的差异,正是平台声誉的差异。
哪些内容应该成为黄金路径
不可能全部覆盖。优先级应按频率 × 摩擦决定。相比每月一次的困难工作,应先处理每周都会遇到的烦人工作。典型候选包括新服务脚手架、添加新环境、连接数据库、创建仪表板与告警,以及加入值班轮换。
黄金路径也必须有版本。发布 v2 后,如何迁移 v1 用户会立刻成为问题。没有迁移计划的 v2,只是又增加了一套标准。
实际现场中的表现
作者的家庭实验室很好地展示了没有黄金路径时会发生什么。Gateway API 需要 CRD v1.6.1;使用 v1.2 时,由于 tlsroutes 与 referencegrants 不是 v1,Cilium Gateway 控制器拒绝启动。KubeVirt 的 containerDisk 路径存在缺陷,必须绕行 DataVolume(PVC)路径才能启动 Fedora VM。GPU Operator 则在 containerd 运行时配置中发生过事故。
这些事故的共同点是:它们都是踩过一次后就不该再踩的陷阱。但如果知识只留在人的脑中,下一个人仍会踩中同样的坑。这正是黄金路径的本质:把平台团队代替他人踩过的陷阱,固化为模板默认值与文档,让其他人不必重蹈覆辙。
另一个值得注意的案例是无 kube-proxy 的 Cilium 配置。我们使用 --skip-phases=addon/kube-proxy,从一开始就完全不安装它,并通过 iptables 中 KUBE- 链为 0 条确认这与安装后再删除不同。这种辨别“删除了”和“从未创建”的意识同样适用于黄金路径。与其日后修正糟糕的默认值,不如从一开始就使用良好默认值生成,成本总会更低。
下一项实验将做什么
我们会在 /root/cnpa-path/ 中创建一套服务脚手架(Deployment/Service/HPA/PDB/NetworkPolicy),并实际部署到带有护栏的命名空间。随后使用 helm create 创建本地 chart,通过 values 区分环境,再把 helm template 的渲染结果应用到集群。