1.4. 半自動メソッドを使用した ServiceBinding カスタムリソースの生成
ServiceBinding
リソースを半自動的に生成できます。以下の手順は、アプリケーションの設定とデプロイに使用する Operator のインストールを含む、OpenShift Container Platform のデプロイメントプロセスを示しています。
この手順では、Service Binding Operator と Crunchy Data の PostgreSQL Operator をインストールします。
PostgreSQL Operator は、サードパーティーのコンポーネントです。PostgreSQL Operator のサポートポリシーと使用条件は、ソフトウェアベンダーである Crunchy Data にお問い合わせください。
次の手順には、PostgreSQL クラスターの作成、単純なアプリケーションのセットアップ、その後のプロビジョニングされたクラスターへのデプロイとバインドが含まれます。
前提条件
- OpenShift Container Platform 4.12 クラスターを作成している。
- OperatorHub からクラスター全体に Operator をインストールするために必要な、OperatorHub および OpenShift Container Platform への管理者権限を持っている。
以下がインストールされている。
-
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 の
phase
がSucceeded
に設定されたことを確認し、次のステップに進みます。
Web コンソールまたは CLI を使用して、OperatorHub から Crunchy PostgreSQL Operator をインストールします。
インストールを確認します。
oc get csv -w
Operator の
phase
がSucceeded
に設定されたことを確認し、次のステップに進みます。
PostgreSQL クラスターを作成します。
新しい OpenShift Container Platform namespace を作成します。これは、後でクラスターを作成し、アプリケーションをデプロイするために使用します。ここで説明する手順では、この namespace を
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 アプリケーションを作成します。
ここで作成するアプリケーションは、Hibernate と Panache を使用して PostgreSQL に接続する基本的な
todo
アプリケーションです。アプリケーションを生成します。
mvn com.redhat.quarkus.platform:quarkus-maven-plugin:3.8.6.SP1-redhat-00002:create \ -DplatformGroupId=com.redhat.quarkus.platform \ -DplatformVersion=3.8.6.SP1-redhat-00002 \ -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
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
-
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 ポートにポート転送し、
/todo
エンドポイントにアクセスします。oc port-forward service/todo-example 8080:80
Web ブラウザーで、以下の URL を開きます。
http://localhost:8080/todo
関連情報
- 詳細は、Quick Start ガイドの Service Binding Operator セクションを参照してください。