服务绑定
向红帽构建的 Quarkus 文档提供反馈 复制链接链接已复制到粘贴板!
要报告错误或改进文档,请登录您的红帽 JIRA 帐户并提交问题。如果您没有红帽 JIRA 帐户,系统会提示您创建一个帐户。
流程
- 单击以下链接 来创建 ticket。
- 在 Summary 中输入有关此问题的简单描述。
- 提供有关 描述 中问题或增强功能的详细描述。包括一个 URL,以在文档中发生问题。
- 点 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 扩展。
您可以对服务绑定和工作负载投射使用以下扩展:
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资源示例:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意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
quarkus.kubernetes-service-binding.services.db-demo.api-version=postgres-operator.crunchydata.com/v1beta1 quarkus.kubernetes-service-binding.services.db-demo.kind=DatabaseCopy to Clipboard Copied! Toggle word wrap Toggle overflow
在 application.properties 中添加了之前的配置属性后,quarkus-kubernetes 与 quarkus-kubernetes-service-binding 扩展相结合,会自动生成 ServiceBinding 资源。
前面提到的 db-demo property-configuration 标识符现在有一个双角色,并完成以下操作:
-
将
api-version和kind属性关联在一起。 定义自定义资源的
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
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-dbCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.4. 使用分号方法生成 ServiceBinding 自定义资源 复制链接链接已复制到粘贴板!
您可以自动生成 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
-
OpenShift、
流程
以下流程中的步骤使用 HOME (~)目录作为保存和安装目的地。
使用 从 OpenShift Container Platform Web UI 安装 Service Binding Operator 的步骤, 安装 Service Binding Operator 版本 1.3.3 或更高版本。
验证安装:
oc get csv -w
oc get csv -wCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当 Service Binding Operator 的
阶段设置为Succeeded时,继续执行下一步。
使用 Web 控制台或 CLI 安装来自 OperatorHub 的 Crunchy PostgreSQL Operator。
验证安装:
oc get csv -w
oc get csv -wCopy to Clipboard Copied! Toggle word wrap Toggle overflow 当 Operator 的
阶段被设置为Succeeded时,继续下一步。
创建 PostgreSQL 集群:
创建新的 OpenShift Container Platform 命名空间,它将用于稍后创建集群并部署应用程序。此命名空间在此过程中称为
演示。oc new-project demo
oc new-project demoCopy to Clipboard Copied! Toggle word wrap Toggle overflow 创建以下自定义资源,并将它保存为
pg-cluster.yml:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此 YAML 已从 Service Binding Operator Quickstart 重复使用。
应用创建的自定义资源:
oc apply -f ~/pg-cluster.yml
oc apply -f ~/pg-cluster.ymlCopy to Clipboard Copied! Toggle word wrap Toggle overflow 注意此命令假设您将
pg-cluster.yml文件保存到 HOME 目录中。检查 pod 以验证安装:
oc get pods -n demo
oc get pods -n demoCopy to Clipboard Copied! Toggle word wrap Toggle overflow -
等待 Pod 进入
READY状态,表示安装已完成。
-
等待 Pod 进入
创建绑定到 PostgreSQL 数据库的 Quarkus 应用程序。
您要创建的应用程序是基本的
todo应用程序,它使用 Hibernate 和 Panache 连接到 PostgreSQL。生成应用程序:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 添加连接到 PostgreSQL 所需的扩展,为我们的应用程序生成所有所需的资源和构建容器镜像:
./mvnw quarkus:add-extension -Dextensions="rest-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"
./mvnw quarkus:add-extension -Dextensions="rest-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建一个简单的实体,如下例所示:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 公开实体:
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
通过生成
ServiceBinding资源来绑定到目标 PostgreSQL 集群。提供服务协调以生成绑定并配置数据源:
-
apiVersion:
postgres-operator.crunchydata.com/v1beta1 -
kind:
PostgresCluster 名称 :
pg-cluster这可以通过设置
quarkus.kubernetes-service-binding.services.<id>.前缀来实现,如下例所示。id用于将属性分组在一起,并可分配任何值。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
-
apiVersion:
使用一些初始数据创建一个
import.sql脚本:INSERT INTO todo(id, title, completed) VALUES (nextval('hibernate_sequence'), 'Finish the blog post', false);INSERT INTO todo(id, title, completed) VALUES (nextval('hibernate_sequence'), 'Finish the blog post', false);Copy to Clipboard Copied! Toggle word wrap Toggle overflow
部署应用程序,包括
ServiceBinding,并将其应用到集群:mvn clean install -Dquarkus.kubernetes.deploy=true -DskipTests
mvn clean install -Dquarkus.kubernetes.deploy=true -DskipTestsCopy to Clipboard Copied! Toggle word wrap Toggle overflow 等待部署完成。
验证
验证部署:
oc get pods -n demo -w
oc get pods -n demo -wCopy to Clipboard Copied! Toggle word wrap Toggle overflow 验证安装:
端口在本地转发到 HTTP 端口,然后访问
/HEKETI 端点。oc port-forward service/todo-example 8080:80
oc port-forward service/todo-example 8080:80Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在网页浏览器中打开以下 URL:
http://localhost:8080/todo
http://localhost:8080/todoCopy to Clipboard Copied! Toggle word wrap Toggle overflow
1.5. 自动服务绑定 复制链接链接已复制到粘贴板!
当应用程序检测到需要访问兼容可绑定 Operator 提供的外部服务的应用程序时,quarkus-kubernetes-service-binding 扩展可以自动生成 ServiceBinding 资源。
自动服务绑定只能针对一组有限的服务类型生成。
与已建立的 Kubernetes 和 Quarkus 服务术语保持一致,本章使用术语"kinds"来指代这些服务类型。
| 服务绑定类型 | Operator | API 版本 | Kind |
|
| postgres-operator.crunchydata.com/v1beta1 | PostgresCluster | |
|
| pxc.percona.com/v1-9-0 | PerconaXtraDBCluster | |
|
| psmdb.percona.com/v1-9-0 | PerconaServerMongoDB |
- Red Hat build of Quarkus 3.15 support for MongoDB Operator 只作为技术预览提供,仅适用于客户端。
- 如需红帽构建的 Quarkus 3.15 中支持的 Panache 扩展列表,请参阅 Quarkus 应用程序配置器 页面。
1.5.1. 自动数据源绑定 复制链接链接已复制到粘贴板!
对于传统数据库,每当数据源配置时都会启动自动绑定,如下所示:
quarkus.datasource.db-kind=postgresql
quarkus.datasource.db-kind=postgresql
前面提到的配置与 quarkus-datasource、quarkus-jdbc-postgresql、quarkus-jdbc-postgresql、quarkus-kubernetes 和 quarkus-kubernetes-service-binding 等扩展相结合,这会导致为 postgresql 数据库类型创建 ServiceBinding 资源。
通过使用与使用的 postgresql Operator 匹配的 Operator 资源的 apiVersion 和 kind 属性,生成的 ServiceBinding 资源将服务或资源绑定到应用程序。
当您没有为数据库服务指定名称时,db-kind 属性的值将用作默认名称。
services: - apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster name: postgresql
services:
- apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
name: postgresql
指定数据源的名称,如下所示:
quarkus.datasource.fruits-db.db-kind=postgresql
quarkus.datasource.fruits-db.db-kind=postgresql
生成的 ServiceBinding 中的 服务会 显示如下:
services: - apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster name: fruits-db
services:
- apiVersion: postgres-operator.crunchydata.com/v1beta1
kind: PostgresCluster
name: fruits-db
同样,如果您使用 mysql,则可以指定数据源的名称,如下所示:
quarkus.datasource.fruits-db.db-kind=mysql
quarkus.datasource.fruits-db.db-kind=mysql
生成的 服务 包含以下内容:
services: - apiVersion: pxc.percona.com/v1-9-0 kind: PerconaXtraDBCluster name: fruits-db
services:
- apiVersion: pxc.percona.com/v1-9-0
kind: PerconaXtraDBCluster
name: fruits-db
1.5.1.1. 自定义自动服务绑定 复制链接链接已复制到粘贴板!
虽然开发了自动服务绑定功能来消除尽可能多的手动配置,但在某些情况下,您可能需要手动修改生成的 ServiceBinding 资源。
生成过程专门用于从应用程序中提取的信息以及支持的 Operator 知识,这些 Operator 可能并没有反映集群中部署的内容。
生成的资源完全基于了解支持的用于流行服务类型的可绑定 Operator 和一组为防止可能不匹配的约定,例如:
- 目标资源名称与数据源名称不匹配。
- 需要使用特定的 Operator 而不是该服务类型的默认 Operator。
- 当用户需要使用默认版本或最新版本以外的版本时,会发生版本冲突。
约定 :
- 目标资源协调会根据 Operator 类型和服务类型建立。
-
默认情况下,目标资源名称与服务类型一致,如
postgresql、mysql或mongo。 - 如果是名为 datasources,则使用数据源名称。
-
客户端的名称用于名为
mongo客户端。
示例 1:名称不匹配
如果您需要修改生成的 ServiceBinding 以修复名称不匹配的情况,请使用 quarkus.kubernetes-service-binding.services 属性,并将服务名称指定为服务密钥。
service 键 通常是服务的名称,例如数据源的名称或 mongo 客户端的名称。当这个值不可用时,使用 postgresql、mysql 或 mongo 等数据源类型。
为了避免不同类型的服务间的命名冲突,请使用特定数据源类型(如 postgresql- <person> )为服务 。
密钥 添加前缀
以下示例演示了如何自定义 PostgresCluster 资源的 apiVersion 属性:
quarkus.datasource.db-kind=postgresql quarkus.kubernetes-service-binding.services.postgresql.api-version=postgres-operator.crunchydata.com/v1beta2
quarkus.datasource.db-kind=postgresql
quarkus.kubernetes-service-binding.services.postgresql.api-version=postgres-operator.crunchydata.com/v1beta2
示例 2:数据源自定义名称的应用程序
示例 1 中使用了服务键 db-kind (postgresql)。在本实例中,使用数据源名称(fruits-db),因为数据源被命名。
以下示例显示,对于命名的数据源,数据源名称用作目标资源的名称:
quarkus.datasource.fruits-db.db-kind=postgresql
quarkus.datasource.fruits-db.db-kind=postgresql
这与以下配置的影响相同:
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
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
更新于 2025-10-03