2026-06-27
今日主题
- Spinnaker 部署模型层级
- Frigga 命名解析机制
新增认知
Spinnaker 部署模型层级
-
Cluster 存在的理由——蓝绿部署:Spinnaker 的三层模型 Application → Cluster → Server Group 中,
Cluster 不是冗余层级。它的核心作用是提供"同一服务的不同版本"的归属关系:每次部署产生新 Server Group(如 v001、v002),
Cluster 把它们归为一组,使得蓝绿部署时 Spinnaker 能知道哪些 Server Group 之间应该切换流量、哪些旧版本应该销毁。
没有 Cluster 这一层,就无法区分"同一服务的不同版本"和"完全不同的服务"。 -
环境用 stack 区分,不用 Application:
Spinnaker 官方明确建议不要把 test/staging/prod 拆成不同 Application。
原因是 Pipeline 天然跨环境(Bake → 部署 test → 部署 staging → 审批 → 部署 prod),
不同环境在同一个 Application 内才能串联。
环境区分通过 Frigga 命名中的 stack 字段实现(如 my-service-staging-v001 vs my-service-prod-v001),
不同 stack 值自动形成不同 Cluster。 -
Region 是云平台原生维度,不编码在命名中:Server Group 在云平台上的实现(如 AWS ASG)天然绑定 Region,
Spinnaker 不需要在名字里编码 Region。Server Group 的真正唯一标识是三元组 (name, account, region),
同一个名字可以在不同 account/region 下独立存在。Cluster 是"全球视图"——
它把不同 Region 下同 cluster 前缀的 Server Group 聚合在一起。 -
Zone 是 Server Group 内部配置,不是独立层级:在 AWS 中一个 ASG 本身就跨多个 AZ,
只需在 Deploy Stage 配置 AZ 列表即可,不需要为每个 AZ 创建独立 Server Group。
Frigga 的 z0 标签(如 z0useast1a)是 Netflix 历史遗留,用于极少数需要按 AZ 独立 ASG 的故障隔离场景,现代实践中几乎不用。
Frigga 命名解析机制
-
脉络——从 Asgard 到 Spinnaker 的命名继承:Frigga 是 Netflix 开源的 Java 库,
唯一职责是解析和生成 AWS 资源命名。它起源于 Netflix 早期云管平台 Asgard(Spinnaker 的前身),
Spinnaker 继承了这套命名规范。核心思想是:把元信息(应用归属、环境、版本)编码在资源名字里,通过字符串解析提取,而不是依赖数据库或配置中心。 -
命名格式与三层解析:完整格式为 app-stack-detail-vNNN,还可带可选后缀标签(如 c0国家、d0阶段、z0可用区)。
Frigga 的 Names.java 解析分两步:先用 PUSH_PATTERN 剥离末尾版本号得到 cluster(group 去掉 -vNNN),
再用 NAME_PATTERN 从 cluster 中拆出 app(第一个 - 之前)、stack(第一个 - 和第二个 - 之间)、detail(第二个 - 之后)。
group 是原始全名,cluster 是去版本号后的前缀,所有 cluster 相同的 Server Group 归为同一个 Cluster。 -
字符集约束实现确定性解析:Frigga 的健壮性不靠严格格式校验,而靠字符集差异消除歧义。
app 和 stack 的合法字符集是 [a-zA-Z0-9._](不含连字符),detail 的合法字符集额外包含 -。这意味着从左到右用 - 切分时,
app 遇到第一个 - 就停止,stack 遇到第二个 - 就停止,detail 可以包含连字符吃掉剩余部分。
这种"约束即解析"的思路让格式在解析时不可能产生歧义,不需要事后校验格式是否正确。