11.7. 외부 데이터베이스에 연결
Operator를 사용하여 keycloak-db-secret YAML 파일을 생성하고 Keycloak CR externalDatabase 속성을 enabled로 설정하여 외부 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
다음 속성은 데이터베이스의 호스트 이름 또는 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 시크릿에 대한 YAML 파일의 예입니다.
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
사전 요구 사항
-
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 apiVersion: v1 data POSTGRES_DATABASE: cm9vdA== POSTGRES_EXTERNAL_ADDRESS: MTcyLjE3LjAuMw== POSTGRES_EXTERNAL_PORT: NTQzMg==POSTGRES_EXTERNAL_ADDRESS는 Base64 형식입니다.시크릿 값을 디코딩합니다.
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.3keycloak-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 27mRed 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