11.7. 外部データベースへの接続
Operator を使用して、keycloak-db-secret
YAML ファイルを作成し、Keycloak CR externalDatabase プロパティーを有効に設定することで、外部 PostgreSQL データベースに接続できます。値は Base64 でエンコードされていることに注意してください。
keycloak-db-secret
の YAML ファイルサンプル
apiVersion: v1 kind: Secret metadata: name: keycloak-db-secret namespace: keycloak stringData: POSTGRES_DATABASE: <Database Name> POSTGRES_EXTERNAL_ADDRESS: <External Database URL (resolvable by K8s)> POSTGRES_EXTERNAL_PORT: <External Database Port> POSTGRES_PASSWORD: <Database Password> # Required for AWS Backup functionality POSTGRES_SUPERUSER: "true" POSTGRES_USERNAME: <Database Username> SSLMODE: <TLS configuration for the Database connection> type: Opaque
apiVersion: v1
kind: Secret
metadata:
name: keycloak-db-secret
namespace: keycloak
stringData:
POSTGRES_DATABASE: <Database Name>
POSTGRES_EXTERNAL_ADDRESS: <External Database URL (resolvable by K8s)>
POSTGRES_EXTERNAL_PORT: <External Database Port>
POSTGRES_PASSWORD: <Database Password>
# Required for AWS Backup functionality
POSTGRES_SUPERUSER: "true"
POSTGRES_USERNAME: <Database Username>
SSLMODE: <TLS configuration for the Database connection>
type: Opaque
以下のプロパティーは、データベースのホスト名または IP アドレスとポートを設定します。
-
POSTGRES_EXTERNAL_ADDRESS
- 外部データベースのホスト名。ホスト名ではなくデータベースの IP のみがある場合は、サービスと対応する EndpointSlice または Endpoint を作成してホスト名を指定します。 -
POSTGRES_EXTERNAL_PORT
- (必要に応じて) データベースポート。
他のプロパティーは、ホストされたデータベースまたは外部データベースと同じ方法で機能します。以下のように設定します。
-
POSTGRES_DATABASE
- 使用されるデータベース名。 -
POSTGRES_USERNAME
- データベースのユーザー名 -
POSTGRES_PASSWORD
- データベースのパスワード -
POSTGRES_SUPERUSER
- バックアップがスーパーユーザーとして実行されるかどうかを示します。通常はtrue
です。 -
SSLMODE
- 外部 PostgreSQL データベースへの接続で TLS を使用するかどうかを示します。使用できる 値を確認します。
SSLMODE
が有効になっている場合、Operator は、PostgreSQL データベースで使用されている root.crt
を含む keycloak-db-ssl-cert-secret
と呼ばれるシークレットを検索します。シークレットの作成は任意で、データベースの証明書を検証する場合にのみシークレットが使用されます (例: SSLMODE: verify-ca
)。以下は例です。
Operator によって使用される TLS Secret
の YAML ファイルのサンプル。
apiVersion: v1 kind: Secret metadata: name: keycloak-db-ssl-cert-secret namespace: keycloak type: Opaque data: root.crt: {root.crt base64}
apiVersion: v1
kind: Secret
metadata:
name: keycloak-db-ssl-cert-secret
namespace: keycloak
type: Opaque
data:
root.crt: {root.crt base64}
Operator は keycloak-postgresql
という名前のサービスを作成します。このサービスは、POSTGRES_EXTERNAL_ADDRESS
のコンテンツに基づいて外部データベースを公開するように、Operator によって設定されます。Red Hat Single Sign-On は、このサービスを使用してデータベースに接続します。つまり、データベースに直接接続するのではなく、このサービスを介して接続します。
Keycloak カスタムリソースには、外部データベースのサポートを有効にするために更新が必要です。
外部データベースをサポートする Keycloak
カスタムリソースの YAML ファイルの例
apiVersion: keycloak.org/v1alpha1 kind: Keycloak metadata: labels: app: sso name: example-keycloak namespace: keycloak spec: externalDatabase: enabled: true instances: 1
apiVersion: keycloak.org/v1alpha1
kind: Keycloak
metadata:
labels:
app: sso
name: example-keycloak
namespace: keycloak
spec:
externalDatabase:
enabled: true
instances: 1
前提条件
-
keycloak-db-secret
の YAML ファイルがある。 -
Keycloak カスタムリソースを変更して
externalDatabase
をtrue
に設定している。 - cluster-admin パーミッション、または管理者によって付与される同等のレベルのパーミッションがある。
手順
PostgreSQL データベースのシークレットを検索します (
oc get secret <secret_for_db> -o yaml
)。以下は例になります。oc get secret keycloak-db-secret -o yaml
$ oc get secret keycloak-db-secret -o yaml apiVersion: v1 data POSTGRES_DATABASE: cm9vdA== POSTGRES_EXTERNAL_ADDRESS: MTcyLjE3LjAuMw== POSTGRES_EXTERNAL_PORT: NTQzMg==
Copy to Clipboard Copied! POSTGRES_EXTERNAL_ADDRESS
は Base64 形式です。シークレットの値をデコードします (
echo "<encoded_secret>" | base64 -decode
)。以下は例になります。echo "MTcyLjE3LjAuMw==" | base64 -decode
$ echo "MTcyLjE3LjAuMw==" | base64 -decode 192.0.2.3
Copy to Clipboard Copied! デコードされた値がデータベースの IP アドレスと一致していることを確認します。
oc get pods -o wide
$ oc get pods -o wide NAME READY STATUS RESTARTS AGE IP keycloak-0 1/1 Running 0 13m 192.0.2.0 keycloak-postgresql-c8vv27m 1/1 Running 0 24m 192.0.2.3
Copy to Clipboard Copied! 実行中のサービスのリストに
keycloak-postgresql
が表示されることを確認します。oc get svc
$ oc get svc NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE keycloak ClusterIP 203.0.113.0 <none> 8443/TCP 27m keycloak-discovery ClusterIP None <none> 8080/TCP 27m keycloak-postgresql ClusterIP 203.0.113.1 <none> 5432/TCP 27m
Copy to Clipboard Copied! keycloak-postgresql
サービスは、バックエンドの IP アドレスのセットにリクエストを送信します。これらの IP アドレスはエンドポイントと呼ばれます。keycloak-postgresql
サービスで使用されるエンドポイントを表示して、それらがデータベースの IP アドレスを使用していることを確認します。oc get endpoints keycloak-postgresql
$ oc get endpoints keycloak-postgresql NAME ENDPOINTS AGE keycloak-postgresql 192.0.2.3.5432 27m
Copy to Clipboard Copied! Red Hat Single Sign-On が外部データベースで実行されていることを確認します。この例は、すべてが実行されていることを示しています。
oc get pods
$ oc get pods NAME READY STATUS RESTARTS AGE IP keycloak-0 1/1 Running 0 26m 192.0.2.0 keycloak-postgresql-c8vv27m 1/1 Running 0 36m 192.0.2.3
Copy to Clipboard Copied!