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

流程

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

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

    1. 验证安装:

      oc get csv -w

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

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

    1. 验证安装:

      oc get csv -w

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

  3. 创建 PostgreSQL 集群:

    1. 创建新的 OpenShift Container Platform 命名空间,它将用于创建集群并在以后部署应用程序。此命名空间将在整个流程中称为 demo

      oc new-project demo
    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
      注意

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

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

      oc apply -f ~/pg-cluster.yml
      注意

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

    4. 检查 pod 以验证安装:

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

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

    1. 生成应用程序:

      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"
    2. 添加连接到 PostgreSQL 所需的所有扩展,生成所有必需的资源,并为应用程序构建容器镜像:

      ./mvnw quarkus:add-extension -Dextensions="resteasy-reactive-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"
    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;
          }
      
      }
    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();
             }
      
         }
  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
    2. 创建一个带有一些初始数据的 import.sql 脚本:

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

    mvn clean install -Dquarkus.kubernetes.deploy=true -DskipTests

    等待部署完成。

验证

  1. 验证部署:

    oc get pods -n demo -w
  2. 验证安装:

    1. 端口转发至本地 HTTP 端口,然后访问 /setuptools 端点

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

      http://localhost:8080/todo

其他资源

  • 如需更多信息,请参阅 快速入门指南 中的 Service Binding Operator 部分。
Red Hat logoGithubRedditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

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

让开源更具包容性

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

關於紅帽

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

© 2024 Red Hat, Inc.