Add platform infrastructure configuration

This commit is contained in:
donghyeon-ka
2026-08-28 17:35:41 +09:00
parent fa76531e5b
commit 16c337bcc9
302 changed files with 83259 additions and 1 deletions
@@ -0,0 +1,42 @@
# 플랫폼 PostgreSQL — Keycloak Phase 2 확장
상태: 2026-07-23 실제 적용, `DatabaseRole`·`Database` 모두 `applied=true`
additive NetworkPolicy도 적용됐으며 기존 PostgreSQL Cluster와 Gitea DB 리소스는
교체하지 않았다.
이 디렉터리는 이미 생성된 `platform-postgres` CloudNativePG Cluster에 추가하는
Kustomize 빌드 루트다. 의도적으로 `Cluster` 리소스를 포함하지 않으며 Phase 1
NetworkPolicy를 Patch하거나 교체하지 않는다.
렌더링 결과에는 다음 항목만 있다.
- `DatabaseRole/platform-postgres-keycloak`
- `Database/platform-postgres-keycloak`
- 기존 PostgreSQL operand Pod를 선택하고 `keycloak` namespace에서 TCP 5432로
접근하는 것을 허용하는 `NetworkPolicy/platform-postgres-keycloak-ingress`
NetworkPolicy ingress 규칙은 누적되므로 이 확장은 Phase 1의 CloudNativePG, 동일
Cluster 및 Gitea 허용 규칙을 보존한다. 기존 공통 Cluster에는 Keycloak이 자기
Database에 SCRAM으로 접근하도록 허용하는 정확한 규칙과, 바로 다음에 같은 Role의
다른 모든 Database 접근을 거부하는 HBA 규칙이 이미 있다. 이 확장은 Cluster를
Patch하지 않는다.
이 루트를 적용하기 전에 `platform-data/keycloak-db-credentials`를 생성한다. 유형은
`kubernetes.io/basic-auth`, label은 `cnpg.io/reload: "true"`, username은
`keycloak`이어야 하며 비밀번호는 Git 외부에서 제공한다. 이에 대응하는 애플리케이션
측 사본은 `keycloak` namespace에 둔다.
기본 RootOnly 로드 제한으로 다음과 같이 렌더링한다.
```sh
kubectl kustomize services/platform-postgres-keycloak
```
Phase 1 Cluster가 Ready 상태이고 Keycloak Secret 계약이 존재할 때만 이 확장을
적용한다. 렌더링 결과에 `Cluster` 리소스가 없어야 한다.
## 공식 참고 문서
- <https://cloudnative-pg.io/docs/1.30/declarative_role_management/>
- <https://cloudnative-pg.io/docs/1.30/declarative_database_management/>
- <https://kubernetes.io/docs/concepts/services-networking/network-policies/>
@@ -0,0 +1,22 @@
apiVersion: postgresql.cnpg.io/v1
kind: DatabaseRole
metadata:
name: platform-postgres-keycloak
labels:
app.kubernetes.io/name: keycloak
app.kubernetes.io/component: database-role
spec:
cluster:
name: platform-postgres
name: keycloak
comment: Keycloak identity provider database owner
login: true
superuser: false
createdb: false
createrole: false
replication: false
bypassrls: false
connectionLimit: 50
passwordSecret:
name: keycloak-db-credentials
databaseRoleReclaimPolicy: retain
@@ -0,0 +1,14 @@
apiVersion: postgresql.cnpg.io/v1
kind: Database
metadata:
name: platform-postgres-keycloak
labels:
app.kubernetes.io/name: keycloak
app.kubernetes.io/component: database
spec:
cluster:
name: platform-postgres
name: keycloak
owner: keycloak
ensure: present
databaseReclaimPolicy: retain
@@ -0,0 +1,15 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
namespace: platform-data
resources:
- keycloak-database-role.yaml
- keycloak-database.yaml
- platform-postgres-keycloak-network-policy.yaml
labels:
- pairs:
app.kubernetes.io/part-of: platform
app.kubernetes.io/managed-by: kustomize
includeSelectors: false
@@ -0,0 +1,21 @@
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: platform-postgres-keycloak-ingress
labels:
app.kubernetes.io/name: platform-postgres
app.kubernetes.io/component: database-network-policy
spec:
podSelector:
matchLabels:
cnpg.io/cluster: platform-postgres
policyTypes:
- Ingress
ingress:
- from:
- namespaceSelector:
matchLabels:
kubernetes.io/metadata.name: keycloak
ports:
- protocol: TCP
port: 5432
@@ -0,0 +1,5 @@
apiVersion: kustomize.config.k8s.io/v1beta1
kind: Kustomization
resources:
- base