1. 服务目录概念

服务目录(Service Catalog)是 Kubernetes 生态中用于管理、发布和绑定外部服务的标准化扩展组件。它通过 Open Service Broker API 将数据库、消息队列、对象存储等托管服务抽象为集群内可消费的资源,使应用团队无需关心底层基础设施的部署细节。

1.1 服务目录的定义

服务目录本质上是一个 Kubernetes 扩展 API 服务器,它引入了一组自定义资源(CRD),用于描述服务提供方、服务实例以及服务绑定关系。核心资源包括:

资源名称 API 版本(示例) 职责描述
ClusterServiceBroker servicecatalog.k8s.io/v1beta1 注册外部服务代理(Broker),定义集群级别的服务提供方
ClusterServiceClass servicecatalog.k8s.io/v1beta1 由 Broker 暴露的服务类型(如 MySQL 5.7、Redis 6.x)
ClusterServicePlan servicecatalog.k8s.io/v1beta1 服务类的具体定价/性能层级(如 small、medium、large)
ServiceInstance servicecatalog.k8s.io/v1beta1 用户申请的一个具体服务实例(如一个 MySQL 数据库实例)
ServiceBinding servicecatalog.k8s.io/v1beta1 将服务实例的访问凭证注入到应用 Pod 的 Secret 中
关键理解: 服务目录不是 Kubernetes 内置的核心资源,而是通过 CRD 和聚合 API 扩展出来的上层抽象层。它让集群管理员可以“上架”服务,让开发者可以“一键消费”。

1.2 在 Kubernetes 生态中的角色

服务目录在云原生架构中扮演着服务抽象层和治理边界的双重角色。其核心价值体现在以下四个维度:

  • 解耦应用与基础设施: 应用只需声明需要什么服务(如“我需要一个 PostgreSQL 数据库”),而不需要关心数据库是部署在集群内还是由云厂商 RDS 提供。
  • 统一服务治理入口: 所有外部服务的接入、版本管理、权限控制都通过 Kubernetes API 完成,避免运维人员手动在多个控制台操作。
  • 标准化服务消费流程: 开发者通过 kubectl apply -f service-instance.yaml 即可创建服务实例,通过 kubectl get servicebinding 获取连接信息,流程完全一致。
  • 多集群服务共享: 结合 ClusterServiceBroker,可以在多个 Kubernetes 集群之间共享同一个外部服务目录,实现跨集群的服务发现与绑定。
服务目录在 Kubernetes 生态中的角色 Kubernetes 集群 应用 Pod (Deployment / StatefulSet) ServiceBinding (Secret 注入) ServiceInstance (服务实例声明) 服务目录 CRD 服务目录 API 聚合层 Controller Manager Open Service Broker 客户端 外部服务提供方 云数据库(RDS) Broker A 消息队列(Kafka) Broker B 对象存储(S3) Broker C 应用通过 ServiceBinding 获取外部服务凭证,服务目录通过 Open Service Broker API 与外部 Broker 通信

1.3 与传统服务目录的区别

传统 IT 服务目录(如 ITIL 框架中的服务目录)与 Kubernetes 服务目录在目标、实现方式和消费模式上存在本质差异。下表从多个维度进行对比:

对比维度 传统服务目录 Kubernetes 服务目录
目标用户 IT 运维人员、服务台 应用开发者、平台工程师
服务定义 Word 文档、Excel 表格、ITSM 系统 CRD + Open Service Broker API(代码化定义)
消费方式 提交工单 → 人工审批 → 手动部署 kubectl apply → 自动编排 → 即时可用
生命周期管理 人工跟踪、定期审计 Kubernetes 控制器自动调和(Reconcile)
绑定方式 邮件发送连接信息、手动配置 自动生成 Secret,注入到 Pod 环境变量或卷
可扩展性 依赖 ITSM 系统插件,扩展成本高 通过自定义 Broker 实现任意服务接入
版本控制 无原生版本控制 CRD 版本化,支持 API 版本迁移
实践建议: 传统服务目录适合“人找服务”的场景(如申请 VPN 权限),而 Kubernetes 服务目录适合“应用找服务”的场景(如微服务自动绑定数据库)。在云原生转型中,两者可以互补:传统目录用于审批流和成本核算,K8s 目录用于运行时自动绑定。

1.4 服务目录的核心工作流程

一个完整的服务目录消费流程包含以下步骤,开发者只需关注第 2 步和第 4 步:

  1. Broker 注册: 集群管理员通过 ClusterServiceBroker 注册外部服务代理(如阿里云 RDS Broker)。
  2. 服务类与计划发现: 服务目录自动从 Broker 拉取 ClusterServiceClass 和 ClusterServicePlan,开发者通过 kubectl get clusterserviceclass 查看可用服务。
  3. 服务实例创建: 开发者提交 ServiceInstance 资源,指定服务类与计划,控制器调用 Broker 的 provision 接口创建实例。
  4. 服务绑定: 开发者提交 ServiceBinding 资源,控制器调用 Broker 的 bind 接口获取凭证,并写入 Kubernetes Secret。
  5. 应用消费: 应用 Pod 通过挂载 Secret 或环境变量获取数据库地址、用户名、密码,直接连接外部服务。
服务目录消费流程(5 步) 1. Broker 注册 ClusterServiceBroker 管理员操作 2. 服务发现 ClusterServiceClass 自动拉取 3. 创建实例 ServiceInstance 开发者 apply 4. 服务绑定 ServiceBinding 自动生成 Secret 5. 消费 Pod 使用 Secret 注入 Broker 交互细节 步骤 3 调用 Broker.provision() → 步骤 4 调用 Broker.bind() → 步骤 5 应用通过 Secret 连接 删除 ServiceInstance 时自动调用 Broker.deprovision() 和 Broker.unbind() 开发者视角:只需 2 个 YAML 文件 service-instance.yaml(声明服务) + service-binding.yaml(获取凭证)

1.5 典型应用场景

  • 多云服务统一管理: 同时对接阿里云 RDS、AWS RDS、自建 MySQL,通过服务目录统一暴露为 mysql-standard 服务类,开发者无需感知底层云厂商。
  • 开发/测试环境快速供给: CI/CD 流水线中自动创建 ServiceInstance,测试完成后自动回收,避免人工创建数据库的等待时间。
  • 服务版本灰度: 通过定义不同的 ClusterServicePlan(如 mysql-5.7 vs mysql-8.0),实现服务版本的平滑迁移。
  • 成本控制与配额管理: 结合 Kubernetes RBAC,限制特定命名空间只能使用特定服务类或计划,防止开发者误创建高配实例。
注意: 服务目录本身不负责服务的高可用、备份或监控。这些能力需要由 Broker 实现或通过额外的 Operator 补充。服务目录只解决“发现、创建、绑定、回收”这一生命周期管理问题。