4. 服务目录元数据管理:元数据模型设计、版本控制、标签与分类体系

服务目录的核心价值在于将分散的微服务信息统一为可信、可检索、可审计的元数据资产。本章围绕元数据模型的三层结构、版本控制策略、标签与分类体系展开,为后续的准入控制与策略执行奠定数据基础。

4.1 元数据模型设计:三层抽象结构

服务目录的元数据模型采用服务基础信息、运行时属性、治理与合规属性三层抽象,确保模型既能满足开发者的快速查询需求,又能支撑平台级的策略评估。

层级 核心字段 数据来源 更新频率
L1 基础信息 serviceName, owner, team, repoURL, description, createdTime 开发者注册 / GitOps 仓库 低频(创建/变更时)
L2 运行时属性 cluster, namespace, endpoints, ports, protocol, version, healthStatus Kubernetes API / 服务网格 高频(实时同步)
L3 治理与合规 complianceLevel, dataClassification, allowedEgress, auditPolicy, slaTier 平台管理员 / 安全策略引擎 中频(策略变更时)
设计原则:L1 层作为不可变基线,L2 层作为动态快照,L3 层作为策略输入。三层之间通过 serviceName + version 组合键关联,避免数据冗余。

4.2 元数据版本控制:基于语义化版本的演进策略

服务目录的元数据版本控制遵循 SemVer 2.0 规范,格式为 MAJOR.MINOR.PATCH,每个版本对应一个不可变的元数据快照。版本控制的核心目标是支持准入控制器的策略回溯与灰度发布。

  • MAJOR:元数据模型结构变更(如新增必填字段、删除字段)
  • MINOR:元数据属性扩展(如新增可选标签、新增合规属性)
  • PATCH:元数据值修正(如修复 owner 信息、更新描述)
# 元数据版本示例:v2.3.1
metadata:
  version: "2.3.1"
  serviceName: "payment-gateway"
  owner: "team-payment"
  complianceLevel: "PCI-DSS"
  dataClassification: "sensitive"
  changelog: "修复 owner 邮箱格式,新增 dataClassification 字段"
版本存储策略:使用 etcd 或 PostgreSQL 存储版本链,每个版本保留完整元数据快照。准入控制器在评估时,可指定 --metadata-version=v2.3.0 来引用历史版本,实现策略的向后兼容。

4.3 标签与分类体系:多维度的服务发现与策略绑定

标签(Label)与分类(Category)是服务目录的两大检索维度。标签用于细粒度属性标记,分类用于粗粒度的业务域划分。两者共同构成服务目录的语义网络。

4.3.1 标签体系:键值对与保留标签

标签采用 key=value 格式,支持自定义标签与平台保留标签。保留标签由平台统一管理,用于准入控制器的策略匹配。

保留标签 Key Value 示例 用途
tier critical / standard / dev 服务等级划分,影响 SLA 与监控告警阈值
data-sensitivity high / medium / low 数据敏感度,控制 Cilium NetworkPolicy 的加密与审计级别
compliance-scope pci-dss / hipaa / soc2 合规范围,触发对应的准入控制规则集
owner-team team-payment / team-user 团队归属,用于 RBAC 与通知路由

4.3.2 分类体系:树形结构与继承规则

分类采用树形结构,支持多级分类。子分类自动继承父分类的标签与策略,同时可覆盖或扩展。分类体系由平台管理员维护,开发者只能选择已有分类。

# 分类树示例
├── 核心业务 (core)
│   ├── 支付 (payment)          → 继承 core 标签: tier=critical
│   │   ├── 网关 (gateway)      → 额外标签: data-sensitivity=high
│   │   └── 结算 (settlement)   → 额外标签: data-sensitivity=medium
│   └── 用户 (user)
│       ├── 认证 (auth)         → 继承 core 标签: tier=critical
│       └── 资料 (profile)      → 继承 core 标签: tier=standard
└── 基础设施 (infra)
    ├── 日志 (logging)          → 标签: tier=standard
    └── 监控 (monitoring)       → 标签: tier=critical
避坑指南:标签与分类的变更必须经过版本控制。禁止直接修改已发布服务的标签值,应通过创建新版本的方式更新。准入控制器在策略评估时,始终使用服务目录中指定版本的标签快照,避免运行时标签篡改导致策略绕过。

4.4 元数据生命周期与准入控制集成

服务目录的元数据管理不是静态的,而是与 Cilium 准入控制器形成闭环。下图展示了元数据从注册、版本化到策略评估的完整流程。

服务目录元数据生命周期与准入控制集成 开发者注册 L1 基础信息 元数据版本化 SemVer 快照 标签/分类绑定 继承与覆盖 策略评估 准入控制器 策略拒绝 → 回滚版本 / 更新元数据 关键集成点: 1. 准入控制器在评估时,通过服务目录 API 获取指定版本的元数据快照。 2. 标签继承规则在服务目录侧完成解析,准入控制器只接收最终标签集合。

4.5 元数据一致性校验:准入控制器的前置检查

在 Cilium 准入控制器执行网络策略之前,服务目录会先对元数据本身进行一致性校验,确保策略评估的输入是可信的。校验规则包括:

  • 必填字段完整性:L1 层的 serviceName、owner、team 不可为空;L3 层的 complianceLevel 不可为空。
  • 标签值合法性:保留标签的值必须在预定义枚举范围内(如 tier 只能为 critical/standard/dev)。
  • 版本连续性:新版本的 MAJOR 变更必须附带 changelog 说明,且不允许跳版本(如从 v1.0.0 直接到 v3.0.0)。
  • 分类路径有效性:所选分类必须在分类树中存在,且叶子节点不允许有子分类。
# 元数据校验失败示例(准入控制器拒绝)
{
  "serviceName": "payment-gateway",
  "version": "2.0.0",
  "errors": [
    {"field": "tier", "message": "值 'gold' 不在枚举范围 [critical, standard, dev] 内"},
    {"field": "complianceLevel", "message": "必填字段缺失"}
  ]
}
生产建议:将元数据一致性校验作为 CI/CD 流水线的一环,在合并到主分支前执行。准入控制器只做运行时二次校验,避免将校验逻辑全部压在控制面,降低 API Server 的负载。

4.6 元数据查询与检索:标签索引与分类聚合

服务目录提供两类查询接口:标签索引查询(精确匹配、模糊匹配)和分类聚合查询(树形路径匹配、子分类递归)。查询结果用于 Cilium NetworkPolicy 的 EndpointSelector 生成。

查询类型 API 示例 返回结果 典型场景
标签精确匹配 GET /metadata?label=tier:critical 所有 tier=critical 的服务列表 生成高优先级服务的隔离策略
标签模糊匹配 GET /metadata?label=data-sensitivity:high* 所有 data-sensitivity 以 high 开头的服务 批量加密策略的 Endpoint 选择
分类路径查询 GET /metadata?category=core/payment/* core/payment 下所有子分类的服务 按业务域统一配置审计策略
版本快照查询 GET /metadata/v2.3.0?serviceName=payment-gateway 指定版本的完整元数据快照 准入控制器的策略回溯审计

通过上述元数据管理机制,服务目录为 Cilium 准入控制器提供了结构化的、版本化的、可追溯的策略输入,确保每一次网络策略的评估都基于一致且可信的服务信息。