服务绑定
使开源包含更多 复制链接链接已复制到粘贴板!
红帽致力于替换我们的代码、文档和 Web 属性中有问题的语言。我们从这四个术语开始:master、slave、黑名单和白名单。由于此项工作十分艰巨,这些更改将在即将推出的几个发行版本中逐步实施。详情请查看 CTO Chris Wright 的信息。
第 1 章 服务绑定 复制链接链接已复制到粘贴板!
本章提供有关添加到版本 2.7.5 的 Red Hat build of Quarkus 的服务绑定和工作负载投射信息,在版本 3.2 中 处于技术预览状态。
通常,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 datasource 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 属性配置标识符现在有一个双角色,也完成以下操作:
-
将
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. 使用分号(Tra-automatic)方法生成 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 命名空间,它将用于创建集群并在以后部署应用程序。此命名空间将在整个流程中称为
demo。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="resteasy-reactive-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"
./mvnw quarkus:add-extension -Dextensions="resteasy-reactive-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 端口,然后访问
/setuptools 端点。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. 自动服务绑定 复制链接链接已复制到粘贴板!
当 quarkus-kubernetes-service-binding 扩展检测到需要访问兼容可绑定 Operator 提供的外部服务的应用程序时,它会自动生成 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.2 支持 MongoDB Operator 作为技术预览提供,只适用于客户端。
- 有关红帽构建的 Quarkus 3.2 中支持的 Panache 扩展列表,请参阅 Quarkus 应用程序配置器 页面。
1.5.1. 自动数据源绑定 复制链接链接已复制到粘贴板!
对于传统数据库,每当配置数据源时,都会启动自动绑定,如下所示:
quarkus.datasource.db-kind=postgresql
quarkus.datasource.db-kind=postgresql
前面提到的配置以及存在 quarkus-datasource、quarkus-jdbc-postgresql、quarkus-kubernetes -kubernetes 和 quarkus-kubernetes-service-binding 等扩展,会导致为 postgresql 数据库类型创建 ServiceBinding 资源。
通过使用 Operator 资源的 apiVersion 和 kind 属性(与使用的 postgresql Operator 匹配),生成的 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。 - 如果是命名数据源,则使用数据源名称。
-
客户端的名称用于命名
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-01-01