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.10 集群
  • 您可以访问 OperatorHub 和 OpenShift Container Platform Administrator 权限,以便从 OperatorHub 安装集群范围的 Operator
  • 已安装:

    • oc orchestration 工具
    • Maven 和 Java

流程

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

  1. 使用 从 OpenShift Container Platform Web UI 安装 Service Binding Operator 过程安装 Service Binding Operator 版本 1.0 及更高版本。

    1. 验证安装:

      oc get csv -n openshift-operators -w
      Copy to Clipboard Toggle word wrap
  2. 使用 Web 控制台或 CLI 从 OperatorHub 安装 Crunchy PostgreSQL Operator。有关说明的链接,请参阅部署和使用 部分。

    1. 验证安装:

      oc get csv -n openshift-operators -w
      Copy to Clipboard Toggle word wrap
      • Operator 的阶段 设置为 Succeeded 时,继续下一步。
  3. 创建 PostgreSQL 集群:

    1. 在要创建集群并稍后部署应用程序的空间中创建一个新的 OpenShift Container Platform 命名空间。在此过程中,命名空间称为 demo

      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
      注意

      此命令假设您在 HOME 中保存了 pg-cluster.yml 文件。

    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:2.13.9.SP2-redhat-00003:create \
          -DplatformGroupId=com.redhat.quarkus.platform \
          -DplatformVersion=2.13.9.SP2-redhat-00003 \
          -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="resteasy-reactive-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"
        Copy to Clipboard Toggle word wrap
      3. 如以下示例所示,创建一个简单的实体:

        package org.acme;
        
        import javax.persistence.Column;
        import javax.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 javax.transaction.Transactional;
        import javax.ws.rs.*;
        import javax.ws.rs.core.Response;
        import javax.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 端口并访问 /setuptools 端点

      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
返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

Theme

© 2025 Red Hat