服务绑定


Red Hat build of Quarkus 3.15

Red Hat Customer Content Services

摘要

探索服务绑定和工作负载预测,以了解它们需要连接到其他服务,以提供额外的信息检索。

向红帽构建的 Quarkus 文档提供反馈

要报告错误或改进文档,请登录您的红帽 JIRA 帐户并提交问题。如果您没有红帽 JIRA 帐户,系统会提示您创建一个帐户。

流程

  1. 单击以下链接 来创建 ticket
  2. Summary 中输入有关此问题的简单描述。
  3. 提供有关 描述 中问题或增强功能的详细描述。包括一个 URL,以在文档中发生问题。
  4. Submit 创建问题并将其路由到适当的文档团队。

第 1 章 服务绑定

使用 Quarkus 中的服务绑定和工作负载投射,使用最小配置将应用程序连接到后备服务。

注意

弃用 OpenShift Service Binding Operator

OpenShift Service Binding Operator 在 OpenShift Container Platform (OCP) 4.13 及更新的版本中已弃用,计划在以后的 OCP 发行版本中删除。

以下章节提供有关添加到 Red Hat build of Quarkus in version 2.7.5 的服务绑定和工作负载预测的信息,它们是版本 3.15 中的技术预览状态。https://access.redhat.com/support/offerings/techpreview/

通常,OpenShift 应用程序和服务也称为可部署工作负载,需要连接到其他服务来检索其他信息,如服务 URL 或凭证。

Service Binding Operator 有助于检索必要的信息,然后通过环境变量(如 quarkus-kubernetes-service-binding 扩展)获得应用程序和服务绑定扩展,而无需直接影响或确定扩展工具本身的使用。

Quarkus 支持 Kubernetes 的服务绑定规格 将服务绑定到应用程序。

具体来说,Quarkus 实施规范中的 工作负载投射 部分,使应用程序能够绑定到数据库或代理等服务,只需要最少的配置。

要为可用的扩展启用服务绑定,请在应用程序依赖项中包含 quarkus-kubernetes-service-binding 扩展。

  • 您可以对服务绑定和工作负载投射使用以下扩展:

    • quarkus-jdbc-mariadb
    • quarkus-jdbc-mssql
    • quarkus-jdbc-mysql
    • quarkus-jdbc-postgresql
    • quarkus-mongo-client - 技术预览
    • quarkus-kafka-client
    • quarkus-messaging-kafka
    • quarkus-reactive-mssql-client - 技术预览
    • quarkus-reactive-mysql-client
    • quarkus-reactive-pg-client

1.1. 工作负载投射

工作负载投射是从 Kubernetes 集群获取服务配置的过程。此配置采用遵循某些约定的目录结构的形式,并作为挂载卷附加到应用程序或服务中。

kubernetes-service-binding 扩展使用此目录结构来创建配置源,允许您配置其他模块,如数据库或消息代理。

您可以在应用程序开发过程中使用工作负载投射,将应用程序连接到开发数据库或其他本地运行服务,而无需更改应用程序代码或配置。

有关测试资源中包含目录结构并传递给集成测试的工作负载投射示例,请参阅 Kubernetes Service Binding 数据源 GitHub 存储库。

注意
  • k8s-sb 目录是所有服务绑定的根目录。

    在本例中,只有一个名为 fruit-db 的数据库会被绑定。此绑定数据库具有 类型 文件,它将 postgresql 指定为数据库类型,而目录中的其他文件则提供必要的信息来建立连接。

  • 当 Red Hat build of Quarkus 项目从 OpenShift Container Platform 设置的 SERVICE_BINDING_ROOT 环境变量中获取信息时,您可以找到文件系统中存在的生成的配置文件,并使用它们将 config-file 值映射到特定扩展的属性。

1.2. Service Binding Operator 简介

Service Binding Operator 是一个 Operator,它实现了 Kubernetes 的 Service Binding 规格,旨在简化将服务绑定到应用程序。

支持 工作负载投射 的容器化应用程序会以卷挂载的形式获取服务绑定信息。Service Binding Operator 会读取绑定服务信息,并将其挂载到需要它的应用程序容器中。

应用程序和绑定服务之间的关联通过 ServiceBinding 资源来表达,后者声明服务旨在绑定到哪个应用程序。

Service Binding Operator 会监视 ServiceBinding 资源,告知 Operator 哪些应用程序要与哪些服务绑定。部署列出的应用程序时,Service Binding Operator 会收集必须传递给应用程序的所有绑定信息,然后通过使用绑定信息附加卷挂载来升级应用程序容器。

Service Binding Operator 完成以下操作:

  • 观察绑定到特定服务的工作负载的 ServiceBinding 资源。
  • 使用卷挂载将绑定信息应用到工作负载。

下面的章节描述了自动和半自动服务绑定方法及其用例。kubernetes-service-binding 扩展使用任一方法生成 ServiceBinding 资源。通过半自动方法,用户必须手动为目标服务提供配置。使用自动方法,在生成 ServiceBinding 资源的有限服务集合中不需要额外的配置。

1.3. 半自动服务绑定

服务绑定过程从绑定到特定应用程序所需的服务的用户规格开始。这个表达式在 kubernetes-service-binding 扩展生成的 ServiceBinding 资源中总结。使用 kubernetes-service-binding 扩展可帮助用户以最小配置生成 ServiceBinding 资源,从而简化整个进程。

然后,负责绑定进程的 Service Binding Operator 从 ServiceBinding 资源读取信息,并相应地将所需文件挂载到容器。

  • ServiceBinding 资源示例:

    apiVersion: binding.operators.coreos.com/v1beta1
    kind: ServiceBinding
    metadata:
     name: binding-request
     namespace: service-binding-demo
    spec:
     application:
       name: java-app
       group: apps
       version: v1
       resource: deployments
     services:
     - group: postgres-operator.crunchydata.com
       version: v1beta1
       kind: Database
       name: db-demo
       id: postgresDB
    Copy to Clipboard Toggle word wrap
    注意
    • quarkus-kubernetes-service-binding 扩展提供了一种更紧凑的方法来表达相同的信息。例如:

      quarkus.kubernetes-service-binding.services.db-demo.api-version=postgres-operator.crunchydata.com/v1beta1
      quarkus.kubernetes-service-binding.services.db-demo.kind=Database
      Copy to Clipboard Toggle word wrap

application.properties 中添加了之前的配置属性后,quarkus-kubernetesquarkus-kubernetes-service-binding 扩展相结合,会自动生成 ServiceBinding 资源。

前面提到的 db-demo property-configuration 标识符现在有一个双角色,并完成以下操作:

  • api-versionkind 属性关联在一起。
  • 定义自定义资源的 name 属性,稍后您可以在需要时编辑该属性。例如:

    quarkus.kubernetes-service-binding.services.db-demo.api-version=postgres-operator.crunchydata.com/v1beta1
    quarkus.kubernetes-service-binding.services.db-demo.kind=Database
    quarkus.kubernetes-service-binding.services.db-demo.name=my-db
    Copy to Clipboard Toggle word wrap

您可以自动生成 ServiceBinding 资源。以下流程演示了 OpenShift Container Platform 部署过程,包括安装用于配置和部署应用程序的 Operator。

在此过程中,您可以从 Crunchy Data 安装 Service Binding Operator 和 PostgreSQL Operator

重要

PostgreSQL Operator 是一个第三方组件。对于 PostgreSQL Operator 支持策略和使用条款,请联系软件厂商 Crunchy Data。

然后,流程涉及创建 PostgreSQL 集群,设置直接的应用程序,然后部署并将其绑定到置备的集群。

先决条件

  • 您已创建了 OpenShift Container Platform 4.12 集群。
  • 管理员可以访问 OperatorHub 和 OpenShift Container Platform,以便从 OperatorHub 安装集群范围的 Operator。
  • 已安装:

    • OpenShift、oc、编配工具
    • Maven 和 Java

流程

以下流程中的步骤使用 HOME (~)目录作为保存和安装目的地。

  1. 使用 从 OpenShift Container Platform Web UI 安装 Service Binding Operator 的步骤, 安装 Service Binding Operator 版本 1.3.3 或更高版本。

    1. 验证安装:

      oc get csv -w
      Copy to Clipboard Toggle word wrap

      Service Binding Operator阶段 设置为 Succeeded 时,继续执行下一步。

  2. 使用 Web 控制台或 CLI 安装来自 OperatorHub 的 Crunchy PostgreSQL Operator

    1. 验证安装:

      oc get csv -w
      Copy to Clipboard Toggle word wrap

      当 Operator 的 阶段 被设置为 Succeeded 时,继续下一步。

  3. 创建 PostgreSQL 集群:

    1. 创建新的 OpenShift Container Platform 命名空间,它将用于稍后创建集群并部署应用程序。此命名空间在此过程中称为 演示

      oc new-project demo
      Copy to Clipboard Toggle word wrap
    2. 创建以下自定义资源,并将它保存为 pg-cluster.yml

      apiVersion: postgres-operator.crunchydata.com/v1beta1
      kind: PostgresCluster
      metadata:
        name: hippo
      spec:
        openshift: true
        image: registry.developers.crunchydata.com/crunchydata/crunchy-postgres:ubi8-14.2-1
        postgresVersion: 14
        instances:
          - name: instance1
            dataVolumeClaimSpec:
              accessModes:
              - "ReadWriteOnce"
              resources:
                requests:
                  storage: 1Gi
        backups:
          pgbackrest:
            image: registry.developers.crunchydata.com/crunchydata/crunchy-pgbackrest:ubi8-2.38-0
            repos:
            - name: repo1
              volume:
                volumeClaimSpec:
                  accessModes:
                  - "ReadWriteOnce"
                  resources:
                    requests:
                      storage: 1Gi
      Copy to Clipboard Toggle word wrap
      注意

      此 YAML 已从 Service Binding Operator Quickstart 重复使用。

    3. 应用创建的自定义资源:

      oc apply -f ~/pg-cluster.yml
      Copy to Clipboard Toggle word wrap
      注意

      此命令假设您将 pg-cluster.yml 文件保存到 HOME 目录中。

    4. 检查 pod 以验证安装:

      oc get pods -n demo
      Copy to Clipboard Toggle word wrap
      • 等待 Pod 进入 READY 状态,表示安装已完成。
  4. 创建绑定到 PostgreSQL 数据库的 Quarkus 应用程序。

    您要创建的应用程序是基本的 todo 应用程序,它使用 Hibernate 和 Panache 连接到 PostgreSQL。

    1. 生成应用程序:

      mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.15.7.redhat-00001:create \
        -DplatformGroupId=com.redhat.quarkus.platform \
        -DplatformVersion=3.15.7.redhat-00001 \
        -DprojectGroupId=org.acme \
        -DprojectArtifactId=todo-example \
        -DclassName="org.acme.TodoResource" \
        -Dpath="/todo"
      Copy to Clipboard Toggle word wrap
    2. 添加连接到 PostgreSQL 所需的扩展,为我们的应用程序生成所有所需的资源和构建容器镜像:

      ./mvnw quarkus:add-extension -Dextensions="rest-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"
      Copy to Clipboard Toggle word wrap
    3. 创建一个简单的实体,如下例所示:

      package org.acme;
      
      import jakarta.persistence.Column;
      import jakarta.persistence.Entity;
      
      import io.quarkus.hibernate.orm.panache.PanacheEntity;
      
      @Entity
      public class Todo extends PanacheEntity {
      
          @Column(length = 40, unique = true)
          public String title;
      
          public boolean completed;
      
          public Todo() {
          }
      
          public Todo(String title, Boolean completed) {
              this.title = title;
          }
      
      }
      Copy to Clipboard Toggle word wrap
    4. 公开实体:

      package org.acme;
      
      import jakarta.transaction.Transactional;
      import jakarta.ws.rs.*;
      import jakarta.ws.rs.core.Response;
      import jakarta.ws.rs.core.Response.Status;
      import java.util.List;
      
         @Path("/todo")
         public class TodoResource {
      
             @GET
             @Path("/")
             public List<Todo> getAll() {
               return Todo.listAll();
             }
      
             @GET
             @Path("/{id}")
             public Todo get(@PathParam("id") Long id) {
                 Todo entity = Todo.findById(id);
                 if (entity == null) {
                     throw new WebApplicationException("Todo with id of " + id + " does not exist.", Status.NOT_FOUND);
                 }
                 return entity;
             }
      
             @POST
             @Path("/")
             @Transactional
             public Response create(Todo item) {
                 item.persist();
                 return Response.status(Status.CREATED).entity(item).build();
             }
      
             @GET
             @Path("/{id}/complete")
             @Transactional
             public Response complete(@PathParam("id") Long id) {
                 Todo entity = Todo.findById(id);
                 entity.id = id;
                 entity.completed = true;
                 return Response.ok(entity).build();
             }
      
      
             @DELETE
             @Transactional
             @Path("/{id}")
             public Response delete(@PathParam("id") Long id) {
                 Todo entity = Todo.findById(id);
                 if (entity == null) {
                     throw new WebApplicationException("Todo with id of " + id + " does not exist.", Status.NOT_FOUND);
                 }
                 entity.delete();
                 return Response.noContent().build();
             }
      
         }
      Copy to Clipboard Toggle word wrap
  5. 通过生成 ServiceBinding 资源来绑定到目标 PostgreSQL 集群。

    1. 提供服务协调以生成绑定并配置数据源:

      • apiVersion: postgres-operator.crunchydata.com/v1beta1
      • kind: PostgresCluster
      • 名称 : pg-cluster

        这可以通过设置 quarkus.kubernetes-service-binding.services.<id>. 前缀来实现,如下例所示。id 用于将属性分组在一起,并可分配任何值。

        quarkus.kubernetes-service-binding.services.my-db.api-version=postgres-operator.crunchydata.com/v1beta1
        quarkus.kubernetes-service-binding.services.my-db.kind=PostgresCluster
        quarkus.kubernetes-service-binding.services.my-db.name=hippo
        
        quarkus.datasource.db-kind=postgresql
        quarkus.hibernate-orm.database.generation=drop-and-create
        quarkus.hibernate-orm.sql-load-script=import.sql
        Copy to Clipboard Toggle word wrap
    2. 使用一些初始数据创建一个 import.sql 脚本:

      INSERT INTO todo(id, title, completed) VALUES (nextval('hibernate_sequence'), 'Finish the blog post', false);
      Copy to Clipboard Toggle word wrap
  6. 部署应用程序,包括 ServiceBinding,并将其应用到集群:

    mvn clean install -Dquarkus.kubernetes.deploy=true -DskipTests
    Copy to Clipboard Toggle word wrap

    等待部署完成。

验证

  1. 验证部署:

    oc get pods -n demo -w
    Copy to Clipboard Toggle word wrap
  2. 验证安装:

    1. 端口在本地转发到 HTTP 端口,然后访问 /HEKETI 端点

      oc port-forward service/todo-example 8080:80
      Copy to Clipboard Toggle word wrap
    2. 在网页浏览器中打开以下 URL:

      http://localhost:8080/todo
      Copy to Clipboard Toggle word wrap

1.5. 自动服务绑定

当应用程序检测到需要访问兼容可绑定 Operator 提供的外部服务的应用程序时,quarkus-kubernetes-service-binding 扩展可以自动生成 ServiceBinding 资源。

注意

自动服务绑定只能针对一组有限的服务类型生成。

与已建立的 Kubernetes 和 Quarkus 服务术语保持一致,本章使用术语"kinds"来指代这些服务类型。

Expand
表 1.1. 支持自动服务绑定的 Operator

服务绑定类型

Operator

API 版本

Kind

postgresql

CrunchyData Postgres

postgres-operator.crunchydata.com/v1beta1

PostgresCluster

mysql

percona XtraDB 集群

pxc.percona.com/v1-9-0

PerconaXtraDBCluster

mongo

Percona MongoDB

psmdb.percona.com/v1-9-0

PerconaServerMongoDB

重要

1.5.1. 自动数据源绑定

对于传统数据库,每当数据源配置时都会启动自动绑定,如下所示:

quarkus.datasource.db-kind=postgresql
Copy to Clipboard Toggle word wrap

前面提到的配置与 quarkus-datasource、quarkus-jdbc-postgresql、quarkus-jdbc-postgresqlquarkus-kubernetesquarkus-kubernetes-service-binding 等扩展相结合,这会导致为 postgresql 数据库类型创建 ServiceBinding 资源。

通过使用与使用的 postgresql Operator 匹配的 Operator 资源的 apiVersionkind 属性,生成的 ServiceBinding 资源将服务或资源绑定到应用程序。

当您没有为数据库服务指定名称时,db-kind 属性的值将用作默认名称。

 services:
 - apiVersion: postgres-operator.crunchydata.com/v1beta1
   kind: PostgresCluster
   name: postgresql
Copy to Clipboard Toggle word wrap

指定数据源的名称,如下所示:

quarkus.datasource.fruits-db.db-kind=postgresql
Copy to Clipboard Toggle word wrap

生成的 ServiceBinding 中的 服务会 显示如下:

 services:
 - apiVersion: postgres-operator.crunchydata.com/v1beta1
   kind: PostgresCluster
   name: fruits-db
Copy to Clipboard Toggle word wrap

同样,如果您使用 mysql,则可以指定数据源的名称,如下所示:

quarkus.datasource.fruits-db.db-kind=mysql
Copy to Clipboard Toggle word wrap

生成的 服务 包含以下内容:

 services:
 - apiVersion: pxc.percona.com/v1-9-0
   kind: PerconaXtraDBCluster
   name: fruits-db
Copy to Clipboard Toggle word wrap
1.5.1.1. 自定义自动服务绑定

虽然开发了自动服务绑定功能来消除尽可能多的手动配置,但在某些情况下,您可能需要手动修改生成的 ServiceBinding 资源。

生成过程专门用于从应用程序中提取的信息以及支持的 Operator 知识,这些 Operator 可能并没有反映集群中部署的内容。

生成的资源完全基于了解支持的用于流行服务类型的可绑定 Operator 和一组为防止可能不匹配的约定,例如:

  • 目标资源名称与数据源名称不匹配。
  • 需要使用特定的 Operator 而不是该服务类型的默认 Operator。
  • 当用户需要使用默认版本或最新版本以外的版本时,会发生版本冲突。

约定

  • 目标资源协调会根据 Operator 类型和服务类型建立。
  • 默认情况下,目标资源名称与服务类型一致,如 postgresqlmysqlmongo
  • 如果是名为 datasources,则使用数据源名称。
  • 客户端的名称用于名为 mongo 客户端。

示例 1:名称不匹配

如果您需要修改生成的 ServiceBinding 以修复名称不匹配的情况,请使用 quarkus.kubernetes-service-binding.services 属性,并将服务名称指定为服务密钥。

service 键 通常是服务的名称,例如数据源的名称或 mongo 客户端的名称。当这个值不可用时,使用 postgresqlmysqlmongo 等数据源类型。

为了避免不同类型的服务间的命名冲突,请使用特定数据源类型(如 postgresql- <person> )为服务 密钥 添加前缀

以下示例演示了如何自定义 PostgresCluster 资源的 apiVersion 属性:

quarkus.datasource.db-kind=postgresql
quarkus.kubernetes-service-binding.services.postgresql.api-version=postgres-operator.crunchydata.com/v1beta2
Copy to Clipboard Toggle word wrap

示例 2:数据源自定义名称的应用程序

示例 1 中使用了服务键 db-kind (postgresql)。在本实例中,使用数据源名称(fruits-db),因为数据源被命名。

以下示例显示,对于命名的数据源,数据源名称用作目标资源的名称:

quarkus.datasource.fruits-db.db-kind=postgresql
Copy to Clipboard Toggle word wrap

这与以下配置的影响相同:

quarkus.kubernetes-service-binding.services.fruits-db.api-version=postgres-operator.crunchydata.com/v1beta1
quarkus.kubernetes-service-binding.services.fruits-db.kind=PostgresCluster
quarkus.kubernetes-service-binding.services.fruits-db.name=fruits-db
Copy to Clipboard Toggle word wrap

更新于 2025-10-03

法律通告

Copyright © 2025 Red Hat, Inc.
The text of and illustrations in this document are licensed by Red Hat under a Creative Commons Attribution–Share Alike 3.0 Unported license ("CC-BY-SA"). An explanation of CC-BY-SA is available at http://creativecommons.org/licenses/by-sa/3.0/. In accordance with CC-BY-SA, if you distribute this document or an adaptation of it, you must provide the URL for the original version.
Red Hat, as the licensor of this document, waives the right to enforce, and agrees not to assert, Section 4d of CC-BY-SA to the fullest extent permitted by applicable law.
Red Hat, Red Hat Enterprise Linux, the Shadowman logo, the Red Hat logo, JBoss, OpenShift, Fedora, the Infinity logo, and RHCE are trademarks of Red Hat, Inc., registered in the United States and other countries.
Linux® is the registered trademark of Linus Torvalds in the United States and other countries.
Java® is a registered trademark of Oracle and/or its affiliates.
XFS® is a trademark of Silicon Graphics International Corp. or its subsidiaries in the United States and/or other countries.
MySQL® is a registered trademark of MySQL AB in the United States, the European Union and other countries.
Node.js® is an official trademark of Joyent. Red Hat is not formally related to or endorsed by the official Joyent Node.js open source or commercial project.
The OpenStack® Word Mark and OpenStack logo are either registered trademarks/service marks or trademarks/service marks of the OpenStack Foundation, in the United States and other countries and are used with the OpenStack Foundation's permission. We are not affiliated with, endorsed or sponsored by the OpenStack Foundation, or the OpenStack community.
All other trademarks are the property of their respective owners.
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2026 Red Hat