6.4. サービスバインディングの使用
サービスバインディング Operator は、ワークロードおよびバッキングサービスのデータプレーンを管理します。本ガイドでは、データベースインスタンスの作成、アプリケーションのデプロイ、サービスバインディング Operator を使用してアプリケーションとデータベースサービス間のバインディング接続の作成に役立つ例を使用してその手順を説明します。
前提条件
-
cluster-admin
パーミッションを持つアカウントを使用して OpenShift Container Platform クラスターにアクセスできる。 -
oc
CLI がインストールされている。 - OperatorHub からサービスバインディング Operator をインストールしている。
v5 Update チャネルを使用して、OperatorHub から Crunchy Postgres for Kubernetes Operator の 5.1.2 バージョンをインストールしました。また、インストールした Operator が、
my-petclinic
namespace など、適切な namespace で利用できる。注記oc create namespace my-petclinic
コマンドを使用して namespace を作成できます。v5 Update チャネルを使用して、OperatorHub から Crunchy Postgres for Kubernetes Operator の 5.1.2 バージョンをインストールしました。インストールされた Operator は、
my-petclinic
プロジェクトなどの適切なプロジェクトで使用できます。注記oc new-project my-petclinic
コマンドを使用してプロジェクトを作成できます。
6.4.1. PostgreSQL データベースインスタンスの作成
PostgreSQL データベースインスタンスを作成するには、PostgresCluster
カスタムリソース (CR) を作成し、データベースを設定する必要があります。
手順
シェルで以下のコマンドを実行して、
my-petclinic
namespace にPostgresCluster
CR を作成します。$ oc apply -n my-petclinic -f - << EOD --- apiVersion: postgres-operator.crunchydata.com/v1beta1 kind: PostgresCluster metadata: name: hippo spec: image: registry.developers.crunchydata.com/crunchydata/crunchy-postgres:ubi8-14.4-0 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 EOD
この
PostgresCluster
CR に追加されたアノテーションは、サービスバインディング接続を有効にし、Operator の調整をトリガーします。この出力では、データベースインスタンスが作成されていることを検証します。
出力例
postgrescluster.postgres-operator.crunchydata.com/hippo created
データベースインスタンスを作成したら、
my-petclinic
namespace のすべての Pod が実行されていることを確認します。$ oc get pods -n my-petclinic
出力 (表示に数分かかる) で、データベースが作成され設定されていることを検証できます。
出力例
NAME READY STATUS RESTARTS AGE hippo-backup-9rxm-88rzq 0/1 Completed 0 2m2s hippo-instance1-6psd-0 4/4 Running 0 3m28s hippo-repo-host-0 2/2 Running 0 3m28s
データベースを設定したら、サンプルアプリケーションをデプロイしてデータベースサービスに接続できます。
6.4.2. Spring PetClinic サンプルアプリケーションのデプロイ
OpenShift Container Platform クラスターに、Spring PetClinic サンプルアプリケーションをデプロイするには、デプロイメント設定を使用し、アプリケーションをテストできるようにローカル環境を設定する必要があります。
手順
シェルで以下のコマンドを実行して、
spring-petclinic
アプリケーションをPostgresCluster
カスタムリソース (CR) でデプロイします。$ oc apply -n my-petclinic -f - << EOD --- apiVersion: apps/v1 kind: Deployment metadata: name: spring-petclinic labels: app: spring-petclinic spec: replicas: 1 selector: matchLabels: app: spring-petclinic template: metadata: labels: app: spring-petclinic spec: containers: - name: app image: quay.io/service-binding/spring-petclinic:latest imagePullPolicy: Always env: - name: SPRING_PROFILES_ACTIVE value: postgres ports: - name: http containerPort: 8080 --- apiVersion: v1 kind: Service metadata: labels: app: spring-petclinic name: spring-petclinic spec: type: NodePort ports: - port: 80 protocol: TCP targetPort: 8080 selector: app: spring-petclinic EOD
この出力では、Spring PetClinic サンプルアプリケーションが作成され、デプロイされていることを確認します。
出力例
deployment.apps/spring-petclinic created service/spring-petclinic created
注記Web コンソールの Developer パースペクティブでコンテナーイメージ を使用してアプリケーションをデプロイする場合は、Advanced options の Deployment セクションで以下の環境変数を入力する必要があります。
- Name: SPRING_PROFILES_ACTIVE
- Value: postgres
以下のコマンドを実行して、アプリケーションがまだデータベースサービスに接続されていないことを確認します。
$ oc get pods -n my-petclinic
出力に
CrashLoopBackOff
ステータスが表示されるまで、数分かかります。出力例
NAME READY STATUS RESTARTS AGE spring-petclinic-5b4c7999d4-wzdtz 0/1 CrashLoopBackOff 4 (13s ago) 2m25s
この段階では、Pod は起動に失敗します。アプリケーションとの対話を試みると、エラーが返されます。
サービスを公開して、アプリケーションのルートを作成します。
$ oc expose service spring-petclinic -n my-petclinic
出力は、
spring-petclinic
サービスが公開され、Spring PetClinic サンプルアプリケーションのルートが作成されたことを確認します。出力例
route.route.openshift.io/spring-petclinic exposed
サービスバインディング Operator を使用すると、アプリケーションをデータベースサービスに接続できるようになります。
6.4.3. Spring PetClinic サンプルアプリケーションを PostgreSQL データベースサービスに接続します。
サンプルアプリ ks−本をデータベースサービスに接続するには、サービスバインディング Operator がバインディングデータをアプリケーションにプロジェクションするようにトリガーする ServiceBinding
カスタムリソース (CR) を作成する必要があります。
手順
ServiceBinding
CR を作成し、バインディングデータにパッチを適用します。$ oc apply -n my-petclinic -f - << EOD --- apiVersion: binding.operators.coreos.com/v1alpha1 kind: ServiceBinding metadata: name: spring-petclinic-pgcluster spec: services: 1 - group: postgres-operator.crunchydata.com version: v1beta1 kind: PostgresCluster 2 name: hippo application: 3 name: spring-petclinic group: apps version: v1 resource: deployments EOD
この出力では、バインディングデータをサンプルアプリケーションにプロジェクションする
ServiceBinding
CR が作成されていることを確認します。出力例
servicebinding.binding.operators.coreos.com/spring-petclinic created
サービスバインディングのリクエストが正常に完了したことを確認します。
$ oc get servicebindings -n my-petclinic
出力例
NAME READY REASON AGE spring-petclinic-pgcluster True ApplicationsBound 7s
デフォルトでは、データベースサービスのバインディングデータからの値は、サンプルアプリケーションを実行するワークロードコンテナーにファイルとしてプロジェクションされます。たとえば、Secret リソースからの値はすべて
bindings/spring-petclinic-pgcluster
ディレクトリーに反映されます。注記オプションとして、ディレクトリーの内容を出力して、アプリケーションのファイルに反映されたバインディングデータが含まれることを確認することもできます。
$ for i in username password host port type; do oc exec -it deploy/spring-petclinic -n my-petclinic -- /bin/bash -c 'cd /tmp; find /bindings/*/'$i' -exec echo -n {}:" " \; -exec cat {} \;'; echo; done
出力例: シークレットリソースからのすべての値
/bindings/spring-petclinic-pgcluster/username: <username> /bindings/spring-petclinic-pgcluster/password: <password> /bindings/spring-petclinic-pgcluster/host: hippo-primary.my-petclinic.svc /bindings/spring-petclinic-pgcluster/port: 5432 /bindings/spring-petclinic-pgcluster/type: postgresql
アプリケーションポートからポート転送を設定し、ローカル環境からサンプルアプリケーションにアクセスします。
$ oc port-forward --address 0.0.0.0 svc/spring-petclinic 8080:80 -n my-petclinic
出力例
Forwarding from 0.0.0.0:8080 -> 8080 Handling connection for 8080
http://localhost:8080/petclinic にアクセスします。
localhost:8080 で Spring PetClinic サンプルアプリケーションにリモートでアクセスできるようになり、アプリケーションがデータベースサービスに接続されていることを確認できます。