11.6. 连接到外部数据库
您可以通过修改 Keycloak 自定义资源并创建 keycloak-db-secret YAML 文件来使用 Operator 连接到外部 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 IP or URL (resolvable by K8s)>
POSTGRES_EXTERNAL_PORT: <External Database Port>
# Strongly recommended to use <'Keycloak CR-Name'-postgresql>
POSTGRES_HOST: <Database Service Name>
POSTGRES_PASSWORD: <Database Password>
# Required for AWS Backup functionality
POSTGRES_SUPERUSER: true
POSTGRES_USERNAME: <Database Username>
type: Opaque
以下属性设置数据库的主机名或 IP 地址和端口。
-
POSTGRES_EXTERNAL_ADDRESS- 一个 IP 地址或外部数据库的主机名。 -
POSTGRES_EXTERNAL_PORT- (可选)一个数据库端口。
其他属性的工作方式与托管或外部数据库相同。按如下所示设置它们:
-
POSTGRES_DATABASE- 要使用的数据库名称。 -
POSTGRES_HOST-用于与数据库通信的服务名称。通常keycloak-postgresql。 -
POSTGRES_USERNAME- 数据库用户名 -
POSTGRES_PASSWORD- 数据库密码 -
POSTGRES_SUPERUSER- 表示备份是否应该以超级用户身份运行。通常为true。
Keycloak 自定义资源需要更新才能启用外部数据库支持。
支持外部数据库的 Keycloak 自定义资源的 YAML 文件示例
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 数据库的 secret:
oc get secret <secret_for_db> -o yaml。例如:$ oc get secret keycloak-db-secret -o yaml apiVersion: v1 data POSTGRES_DATABASE: cm9vdA== POSTGRES_EXTERNAL_ADDRESS: MTcyLjE3LjAuMw== POSTGRES_EXTERNAL_PORT: NTQzMg==POSTGRES_EXTERNAL_ADDRESS是 Base64 格式。解码 secret 的值:
echo "<encoded_secret>" | base64 -decode.例如:$ echo "MTcyLjE3LjAuMw==" | base64 -decode 192.0.2.3确认解码的值与数据库的 IP 地址匹配:
$ 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确认
keycloak-postgresql出现在正在运行的服务列表中:$ 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 27mkeycloak-postgresql服务将请求发送到后端的一组 IP 地址。这些 IP 地址称为端点。查看
keycloak-postgresql服务使用的端点,以确认它们为您的数据库使用 IP 地址:$ oc get endpoints keycloak-postgresql NAME ENDPOINTS AGE keycloak-postgresql 192.0.2.3.5432 27m确认 Red Hat Single Sign-On 使用外部数据库运行。本例显示一切都在运行:
$ 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