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
当 Service Binding Operator 的
阶段
设置为Succeeded
时,继续下一步。
使用 Web 控制台或 CLI 从 OperatorHub 安装 Crunchy PostgreSQL Operator。
验证安装:
oc get csv -w
当 Operator 的
阶段
设置为Succeeded
时,继续下一步。
创建 PostgreSQL 集群:
创建新的 OpenShift Container Platform 命名空间,它将用于创建集群并在以后部署应用程序。此命名空间将在整个流程中称为
demo
。oc new-project demo
创建以下自定义资源,并将它保存为
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
注意此 YAML 已从 Service Binding Operator Quickstart 重复使用。
应用创建的自定义资源:
oc apply -f ~/pg-cluster.yml
注意此命令假设您将
pg-cluster.yml
文件保存到 HOME 目录中。检查 pod 以验证安装:
oc get pods -n demo
-
等待 Pod 进入
READY
状态,表示安装已完成。
-
等待 Pod 进入
创建一个绑定到 PostgreSQL 数据库的 Quarkus 应用程序。
您要创建的应用程序是一个基本的
todo
应用程序,它使用 Hibernate 和 Panache 连接到 PostgreSQL。生成应用程序:
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.2.12.SP1-redhat-00003:create \ -DplatformGroupId=com.redhat.quarkus.platform \ -DplatformVersion=3.2.12.SP1-redhat-00003 \ -DprojectGroupId=org.acme \ -DprojectArtifactId=todo-example \ -DclassName="org.acme.TodoResource" \ -Dpath="/todo"
添加连接到 PostgreSQL 所需的所有扩展,生成所有必需的资源,并为应用程序构建容器镜像:
./mvnw quarkus:add-extension -Dextensions="resteasy-reactive-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"
如以下示例所示,创建一个简单的实体:
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; } }
公开实体:
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(); } }
通过生成
ServiceBinding
资源来绑定到目标 PostgreSQL 集群。提供服务协调来生成绑定并配置数据源:
-
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
-
apiVersion:
创建一个带有一些初始数据的
import.sql
脚本:INSERT INTO todo(id, title, completed) VALUES (nextval('hibernate_sequence'), 'Finish the blog post', false);
部署应用程序,包括
ServiceBinding
并将其应用到集群:mvn clean install -Dquarkus.kubernetes.deploy=true -DskipTests
等待部署完成。
验证
验证部署:
oc get pods -n demo -w
验证安装:
端口转发至本地 HTTP 端口,然后访问
/setuptools 端点
。oc port-forward service/todo-example 8080:80
在网页浏览器中打开以下 URL:
http://localhost:8080/todo
其他资源
- 如需更多信息,请参阅 快速入门指南 中的 Service Binding Operator 部分。