検索

1.4. 半自動メソッドを使用して ServiceBinding カスタムリソースを生成する

download PDF

ServiceBinding リソースをセミコロンで生成できます。以下の手順は、アプリケーションの設定およびデプロイのための Operator のインストール方法など、OpenShift Container Platform のデプロイメントプロセスを示しています。

次の手順では、Crunchy Data から Service Binding Operator および PostgreSQL Operator をインストールします。

重要

PostgreSQL Operator は、サードパーティーのコンポーネントです。PostgreSQL Operator のサポートポリシーと使用条件については、ソフトウェアベンダーである Crunchy Data にお問い合わせください。

次に、この手順では PostgreSQL クラスター(簡単なアプリケーション)を作成し、最後に、これをプロビジョニングされたクラスターにバインドします。

前提条件

  • OpenShift Container Platform 4.10 クラスターを作成している。
  • OperatorHub からクラスター全体の Operator をインストールするのに必要な OperatorHub および OpenShift Container Platform 管理者権限にアクセスできる。
  • 以下がインストールされている。

    • oc オーケストレーションツール
    • 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
      • Service Binding OperatorフェーズSucceeded に設定されている場合は、次のステップに進みます。
  2. Web コンソールまたは CLI を使用して、OperatorHub から Crunchy PostgreSQL Operator をインストールします。手順へのリンクは、デプロイと使用 セクションを参照してください。

    1. インストールを確認します。

      oc get csv -n openshift-operators -w
      • Operator の フェーズSucceeded に設定されている場合は、次のステップに進みます。
  3. PostgreSQL クラスターを作成します。

    1. クラスターを作成し、後でアプリケーションをデプロイするスペースで新規 OpenShift Container Platform namespace を作成します。この手順では、namespace は 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 アプリケーションを作成します。

    • 作成するアプリケーションは、Hibernate と panache を使用して PostgreSQL に接続するシンプルな todo アプリケーションです。

      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"
      2. PostgreSQL への接続、すべての必要リソースの生成、およびアプリケーション用コンテナーイメージの構築に必要なエクステンションをすべて追加します。

        ./mvnw quarkus:add-extension -Dextensions="resteasy-reactive-jackson,jdbc-postgresql,hibernate-orm-panache,openshift,kubernetes-service-binding"
      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;
            }
        
        }
      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();
               }
        
           }
  5. ServiceBinding リソースを生成して、ターゲット PostgreSQL クラスターにバインドします。

    1. サービス座標を指定してバインディングを生成し、データソースを設定します。

      • apiVersion: postgres-operator.crunchydata.com/v1beta1
      • kind: PostgresCluster
      • name: 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 ポートにポート転送し、/todo エンドポイントにアクセスします。

      oc port-forward service/todo-example 8080:80
    2. 以下の URL をブラウザーで開きます。

      http://localhost:8080/todo

関連情報

  • 詳細は、Quick Start ガイドの Service Binding Operator セクションを参照してください。
Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.