Menu Close

4.6. 从服务公开绑定数据

应用程序开发人员需要访问支持的服务,以构建和连接工作负载。连接工作负载以支持服务始终是一个挑战,因为每个服务提供商需要以不同的方式访问其机密并在工作负载中使用它们。

Service Binding Operator 可让应用程序开发人员将工作负载与 Operator 管理的后备服务轻松绑定,而无需任何手动步骤来配置绑定连接。要使 Service Binding Operator 作为 Operator 供应商或创建后备服务的用户提供绑定数据,您必须公开绑定数据,以便 Service Binding Operator 自动检测到绑定数据。然后,Service Binding Operator 会自动从后备服务收集绑定数据,并将其与工作负载共享,以提供一致且可预测的体验。

4.6.1. 公开绑定数据的方法

本节论述了您可以使用什么方法公开绑定数据。

确保您了解并了解您的工作负载要求和环境,以及如何与所提供的服务配合使用。

在以下情况下公开绑定数据:

  • 后备服务作为调配的服务资源提供。

    您要连接到的服务符合 Service Binding 规格。您必须创建一个带有所有所需绑定数据值的 Secret 资源,并在后备服务自定义资源 (CR) 中引用它。所有绑定数据值的检测都是自动的。

  • 后备服务不能作为调配的服务资源使用。

    您必须从后备服务公开绑定数据。根据工作负载要求和环境,您可以选择以下任一方法公开绑定数据:

    • 直接 secret 引用
    • 通过自定义资源定义(CRD)或 CR 注解声明绑定数据
    • 通过 Operator Lifecycle Manager(OLM)描述符声明绑定数据
    • 通过拥有的资源检测绑定数据

4.6.1.1. 置备的服务

置备的服务代表后端服务 CR,引用了放置在后备服务 CR 的 .status.binding.name 字段中的 Secret 资源。

作为 Operator 供应商或创建后备服务的用户,您可以通过创建 Secret 资源并在后备服务 CR 的 .status.binding.name 部分中引用它,使用此方法符合 Service Binding 规格。此 Secret 资源必须提供工作负载连接到后备服务所需的所有绑定数据值。

以下示例显示一个 AccountService CR,它代表一个后备服务和从 CR 引用的 Secret 资源。

示例: AccountService CR

apiVersion: example.com/v1alpha1
kind: AccountService
name: prod-account-service
spec:
  ...
status:
  binding:
    name: hippo-pguser-hippo

示例:引用的 Secret 资源

apiVersion: v1
kind: Secret
metadata:
  name: hippo-pguser-hippo
data:
  password: "MTBz"
  user: "Z3Vlc3Q="
  ...

在创建服务绑定资源时,您可以在 ServiceBinding 规格中直接提供 AccountService 资源的详情,如下所示:

示例: ServiceBinding 资源

apiVersion: binding.operators.coreos.com/v1alpha1
kind: ServiceBinding
metadata:
  name: account-service
spec:
  ...
  services:
  - group: "example.com"
    version: v1alpha1
    kind: AccountService
    name: prod-account-service
  application:
    name: spring-petclinic-rest
    group: apps
    version: v1
    resource: deployments

重要

带有 servicebinding.io API 组的 Service Binding (Spec API Tech Preview) 只是一个技术预览功能。技术预览功能不被红帽产品服务等级协议 (SLA) 支持,且可能在功能方面有缺陷。红帽不推荐在生产环境中使用它们。这些技术预览功能可以使用户提早试用新的功能,并有机会在开发阶段提供反馈意见。有关红帽技术预览功能支持范围的详情,请参阅 https://access.redhat.com/support/offerings/techpreview/

示例: Specification API 中的 ServiceBinding 资源

apiVersion: servicebinding.io/v1alpha3
kind: ServiceBinding
metadata:
  name: account-service
spec:
  ...
  service:
    apiVersion: example.com/v1alpha1
    kind: AccountService
    name: prod-account-service
  application:
    apiVersion: apps/v1
    kind: Deployment
    name: spring-petclinic-rest

此方法公开 hippo-pguser-hippo 所引用 Secret 资源中的所有键作为绑定数据,以投射到工作负载中。

4.6.1.2. 直接 secret 引用

如果所有必需的绑定数据值都位于 Service Binding 定义中可以引用的 Secret 资源中,您可以使用此方法。在这个方法中,ServiceBinding 资源直接引用 Secret 资源来连接服务。Secret 资源中的所有键都公开为绑定数据。

示例:带有 binding.operators.coreos.com API 的规格

apiVersion: binding.operators.coreos.com/v1alpha1
kind: ServiceBinding
metadata:
  name: account-service
spec:
  ...
  services:
  - group: ""
    version: v1
    kind: Secret
    name: hippo-pguser-hippo

示例:符合 servicebinding.io API 的规格

apiVersion: servicebinding.io/v1alpha3
kind: ServiceBinding
metadata:
  name: account-service
spec:
  ...
  service:
    apiVersion: v1
    kind: Secret
    name: hippo-pguser-hippo

4.6.1.3. 通过 CRD 或 CR 注解声明绑定数据

您可以使用此方法注解后备服务的资源,以使用特定注解公开绑定数据。在 metadata 部分下添加注解会改变后备服务的 CR 和 CRD。Service Binding Operator 会检测添加到 CR 和 CRD 的注解,然后使用基于注解提取的值创建一个 Secret 资源。

以下示例显示了在 metadata 部分添加的注解以及从资源引用的 ConfigMap 对象:

示例:从 CR 注解中定义的 Secret 对象公开绑定数据

apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
  name: hippo
  namespace: my-postgresql
  annotations:
    service.binding: 'path={.metadata.name}-pguser-{.metadata.name},objectType=Secret'
    ...

上例将机密名称的名称放在 {.metadata.name}-pguser-{.metadata.name} 模板中,用于解析为 hippo-pguser-hippo。模板可以包含多个 JSONPath 表达式。

示例:资源的引用的 Secret 对象

apiVersion: v1
kind: Secret
metadata:
  name: hippo-pguser-hippo
data:
  password: "MTBz"
  user: "Z3Vlc3Q="

示例:从 CR 注解中定义的 ConfigMap 对象公开绑定数据

apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
metadata:
  name: hippo
  namespace: my-postgresql
  annotations:
    service.binding: 'path={.metadata.name}-config,objectType=ConfigMap'
    ...

前面的示例将配置映射的名称放在 {.metadata.name}-config 模板中,该模板解析为 hippo-config。模板可以包含多个 JSONPath 表达式。

示例:从资源引用的 ConfigMap 对象

apiVersion: v1
kind: ConfigMap
metadata:
  name: hippo-config
data:
  db_timeout: "10s"
  user: "hippo"

4.6.1.4. 通过 OLM 描述符声明绑定数据

如果您的后备服务是由 Operator 提供的,您可以使用此方法。如果 Operator 以 OLM 捆绑包的形式分发,您可以添加 OLM 描述符来描述要公开的绑定数据。OLM 描述符是 Cluster Service Version 资源的一部分。Service Binding Operator 会检测 OLM 描述符,然后使用根据检测到的 OLM 描述符提取的值创建一个 Secret 资源。

您可以使用 specDescriptors 数组和 statusDescriptors 数组来公开绑定数据。specDescriptors 数组指定 CR .spec 部分下的路径。statusDescriptors 数组指定 CR 的 .status 部分下的路径。

以下是用于绑定数据的两个字段:

  • Path: 对象上字段的点分隔路径,如描述符所描述。
  • x-Descriptors :定义绑定数据。

以下示例演示了如何根据您指向该路径的资源来定义 X-Descriptor:

示例:用于公开 secret 的 X-Descriptor 定义

- path: data.dbConfiguration
  x-descriptors:
  - urn:alm:descriptor:io.kubernetes:Secret
  - service.binding

示例:用于公开配置映射的 X-Descriptor 定义

- path: data.dbConfiguration
  x-descriptors:
  - urn:alm:descriptor:io.kubernetes:ConfigMap
  - service.binding

注意
  • 您必须在 X-Descriptors 中有一个 service.binding 条目,才能识别它是服务绑定的配置。
  • 缺少 SecretConfigMap 特定的 X-Descriptors 表示描述符引用给定路径上的绑定数据值。

4.6.1.5. 通过拥有的资源检测绑定数据

如果您的后备服务拥有一个或多个 Kubernetes 资源,如路由、服务、配置映射或 secret,您可以使用此方法检测绑定数据。在这个方法中,Service Binding Operator 会检测来自后备服务 CR 拥有的资源的绑定数据。

以下示例显示 ServiceBinding CR 中的 detectBindingResources API 选项设置为 true

示例

apiVersion: binding.operators.coreos.com/v1alpha1
kind: ServiceBinding
metadata:
  name: spring-petclinic-rest-detect-all
  namespace: my-postgresql
spec:
  detectBindingResources: true
  services:
    - group: postgres-operator.crunchydata.com
      version: v1beta1
      kind: PostgresCluster
      name: hippo
  application:
    name: spring-petclinic-rest
    group: apps
    version: v1
    resource: deployments

在上例中,PostgresCluster 自定义资源拥有一个或多个 Kubernetes 资源,如路由、服务、配置映射或 secret。

Service Binding Operator 会自动检测每个拥有的资源上公开的绑定数据。