Keycloak
Keycloak은 오픈소스 Identity and Access Management (IAM) 솔루션으로, OIDC/OAuth2 기반의 인증 및 인가 서비스를 제공합니다. Lumie 인프라에서는 중앙 인증 서버 역할을 하며, Google, Kakao 소셜 로그인 연동을 지원합니다.
아키텍처
구성 요소
Keycloak Server
- 이미지:
zot.lumie-infra.com/keycloak/keycloak:26.5.4 - 모드: Production (최적화된 빌드)
- 프록시: Kong Gateway 뒤에서 실행
- 데이터베이스: 공유 infra-db 클러스터 사용
데이터베이스 설정
Keycloak은 공유 PostgreSQL 클러스터(infra-db)를 사용합니다:
database:
vendor: postgres
hostname: infra-db-rw.infra-db.svc.cluster.local
port: 5432
database: keycloak
username: keycloak
existingSecret: keycloak-db-bootstrap
existingSecretKey: password
Vault 시크릿 연동
데이터베이스 자격증명, 관리자 패스 워드, OAuth 클라이언트 시크릿은 Vault에서 관리됩니다:
vaultStaticSecrets:
# 데이터베이스 자격증명
- name: keycloak-db-bootstrap-static
path: infrastructure/postgresql
destination:
name: keycloak-db-bootstrap
transformation:
templates:
username: keycloak
password: "{{ .Secrets.POSTGRES_PASSWORD }}"
rolloutRestartTargets:
- kind: StatefulSet
name: keycloak
# Keycloak 관리자 패스워드
- name: keycloak-secrets-static
path: infrastructure/keycloak
destination:
name: keycloak-secrets
transformation:
templates:
KEYCLOAK_ADMIN_PASSWORD: "{{ .Secrets.KEYCLOAK_ADMIN_PASSWORD }}"
rolloutRestartTargets:
- kind: StatefulSet
name: keycloak
# OAuth 시크릿 — realm-sync Job(keycloak-config-cli)이 ${KEY} 플레이스홀더를 치환하여 Admin REST API로 주입
- name: keycloak-oauth-secrets-static
path: tokens
destination:
name: keycloak-oauth-secrets
transformation:
templates:
KEYCLOAK_CODER_CLIENT_SECRET: "{{ .Secrets.KEYCLOAK_CODER_CLIENT_SECRET }}"
KEYCLOAK_VAULT_CLIENT_SECRET: "{{ .Secrets.KEYCLOAK_VAULT_CLIENT_SECRET }}"
KEYCLOAK_ZOT_CLIENT_SECRET: "{{ .Secrets.KEYCLOAK_ZOT_CLIENT_SECRET }}"
KEYCLOAK_GITEA_CLIENT_SECRET: "{{ .Secrets.KEYCLOAK_GITEA_CLIENT_SECRET }}"
keycloak-oauth-secrets는 Keycloak 서버 Pod가 아닌realm-sync JobPod에만 마운트됩니다.
설정
프로덕션 모드 설정
Realm 콘텐츠(클라이언트, 사용자, 소셜 로그인)는 ArgoCD PostSync 훅으로 실행되는 realm-sync Job(keycloak-config-cli)이 관리합니다. Keycloak 서버 자체는 --import-realm 플래그 없이 시작하며, Realm 임포트 ConfigMap을 마운트하지 않습니다.
# 프로덕션 모드로 시작 (Realm 임포트는 realm-sync Job이 담당)
command:
- "/opt/keycloak/bin/kc.sh"
args:
- "start"
# 프록시 설정 (Kong Gateway 뒤에서 실행)
proxy:
enabled: true
mode: xforwarded
http:
relativePath: /
# 호스트명 및 관리자 자격증명 설정
extraEnv: |
- name: KC_HOSTNAME
value: "auth.lumie-edu.com" # OIDC 흐름을 위한 외부 접근 호스트명
- name: KC_HOSTNAME_STRICT
value: "false"
- name: KEYCLOAK_ADMIN
value: admin
- name: KEYCLOAK_ADMIN_PASSWORD
valueFrom:
secretKeyRef:
name: keycloak-secrets
key: KEYCLOAK_ADMIN_PASSWORD
KC_VAULT/KC_VAULT_DIR설정은 제거되었습니다. 이전에는 Realm JSON 내${vault.KEY}플레이스홀더 확장에 사용되었지만, file vault provider는 클라이언트 시크릿 필드를 지원하지 않습니다. 현재는 realm-sync Job이 환경 변수 치환을 수행하고 Keycloak Admin REST API로 직접 설정을 적용합니다.
시작 프로브 설정
Keycloak은 첫 시작 시 최적화된 설정을 빌드하므로 충분한 시간이 필요합니다:
startupProbe: |
httpGet:
path: '/health'
port: http-internal
scheme: HTTP
initialDelaySeconds: 60
timeoutSeconds: 1
failureThreshold: 120 # 최대 10분 대기 (120 * 5초 = 600초)
periodSeconds: 5