apiVersion: k8s.keycloak.org/v2beta1 kind: Keycloak metadata: name: keycloak labels: app.kubernetes.io/name: keycloak app.kubernetes.io/instance: keycloak app.kubernetes.io/version: "26.6.1" app.kubernetes.io/component: identity-provider app.kubernetes.io/part-of: auth-platform app.kubernetes.io/managed-by: keycloak-operator spec: instances: 2 db: vendor: postgres host: identity-postgres port: 5432 database: keycloak usernameSecret: name: keycloak-db-operator key: username passwordSecret: name: keycloak-db-operator key: password poolInitialSize: 5 poolMinSize: 5 poolMaxSize: 20 bootstrapAdmin: user: secret: keycloak-bootstrap-admin-operator # 어떤 시크릿에서 읽을지 지정하는 거 hostname: strict: true # 명시된 hostname을 기준으로 URL을 만든다. backchannelDynamic: false # 백URL도 프론트 hostname과 동일하게 고정한다. http: httpEnabled: true httpPort: 8080 serviceHttpPort: 80 serviceName: keycloak labels: app.kubernetes.io/name: keycloak app.kubernetes.io/instance: keycloak app.kubernetes.io/component: identity-provider app.kubernetes.io/part-of: auth-platform app.kubernetes.io/managed-by: keycloak-operator proxy: headers: xforwarded # X-Forwarded-For X-Forwarded-Proto X-Forwarded-Host X-Forwarded-Port 해당 헤더들을 사용하겠다는 의미 ingress: enabled: false networkPolicy: enabled: false additionalOptions: - name: cache value: ispn # 애플리케이션의 캐시 엔진으로 ispn으로 사용 - name: cache-stack value: jdbc-ping # 클러스터링된 서버끼리 서로를 찾는(Discovery) 방식을 JDBC-PING으로 정한 것 - name: health-enabled value: "true" # 상태 확인(Health Check) 엔드포인트를 활성화 - name: metrics-enabled value: "true" # 메트릭(성능 지표) 수집 기능을 켬 - name: log-console-output value: json # 로그 형식을 JSON 구조로 변경 env: - name: JAVA_OPTS_APPEND value: "-XX:MaxRAMPercentage=70 -XX:InitialRAMPercentage=50 -XX:+ExitOnOutOfMemoryError" resources: requests: cpu: 500m memory: 1Gi limits: cpu: "2" memory: 2Gi scheduling: topologySpreadConstraints: - maxSkew: 1 topologyKey: kubernetes.io/hostname whenUnsatisfiable: ScheduleAnyway labelSelector: matchLabels: app.kubernetes.io/instance: keycloak app.kubernetes.io/managed-by: keycloak-operator affinity: # 특정 노드에 다른 pod에 관계에 따라 배치 위치를 결정하는 규칙을 정의한다 podAntiAffinity: # 특정 조건을 만족하는 포드와는 같은 장소에 있지 않는다. preferredDuringSchedulingIgnoredDuringExecution: # 가급적 지켜줘 - weight: 100 # 가중치가 100임 매우 중요하다고 알림 podAffinityTerm: # 어떤 파드를 피해다닐지 topologyKey: kubernetes.io/hostname # 피할 기준은 호스트 네임으로 설정 labelSelector: matchLabels: app.kubernetes.io/instance: keycloak # keycloak과 피하겠다 app.kubernetes.io/managed-by: keycloak-operator # keycloak-operator에 의해 관리되는 unsupported: podTemplate: spec: securityContext: runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 fsGroup: 1000 fsGroupChangePolicy: OnRootMismatch seccompProfile: type: RuntimeDefault containers: - name: keycloak securityContext: allowPrivilegeEscalation: false capabilities: drop: - ALL runAsNonRoot: true runAsUser: 1000 runAsGroup: 1000 seccompProfile: type: RuntimeDefault