# 증거 — Keycloak 멀티노드 클러스터 형성 `docs/keycloak-multinode-cluster.md`의 근거 자료. **정상적으로 클러스터가 형성된 상태**에서 수집했으며, 이후 고장을 주입한 뒤 이것과 대조한다. 수집 시각: 2026-09-03 17:24 KST | 파일 | 내용 | |---|---| | `01-cluster-formed.txt` | 파드 배치·클러스터 뷰 로그·JGROUPS_PING·OIDC discovery·자원 | ## 이 상태에서 확인된 것 **클러스터 뷰가 멤버 2를 보고한다** ``` ISPN000094: Received new cluster view for channel ISPN: [keycloak-1-26938|1] (2) [keycloak-1-26938, keycloak-0-49501] ISPN100000: Node keycloak-0-49501 joined the cluster ISPN000079: physical addresses are [10.42.1.18:7800] ``` **디스커버리와 통신 경로가 한 테이블에 다 보인다** ``` name | cluster_name | ip | coord ------------------+--------------+-----------------+------- keycloak-0-49501 | ISPN | 10.42.1.18:7800 | f keycloak-1-26938 | ISPN | 10.42.0.16:7800 | t ``` `name`/`cluster_name`은 **DB 디스커버리**의 결과이고, `ip`의 `:7800`은 **실제 통신 경로**다. 7800을 막으면 이 표는 그대로 채워지면서 클러스터 뷰만 깨질 것으로 예상한다 — 다음 실험의 가설이다. `coord = t` 인 `keycloak-1`이 코디네이터다. **배치** — 서로 다른 노드에 하나씩. PostgreSQL은 `kc-lab-2`에 있으므로 **그 노드를 죽이면 Keycloak 하나와 DB가 동시에 사라진다.** ``` keycloak-0 10.42.1.18 kc-lab-2 keycloak-1 10.42.0.16 kc-lab-1 postgres 10.42.1.19 kc-lab-2 ``` **issuer가 https로 발급된다** — 첫 실험(2홉 헤더 계약)의 결론이 적용된 결과다. ## 재수집 ```bash kubectl -n keycloak-lab get pods -o wide kubectl -n keycloak-lab logs keycloak-0 | grep -E 'ISPN000094|ISPN000079|ISPN100000' PG=$(kubectl -n keycloak-lab get pod -l app=postgres -o name | head -1) kubectl -n keycloak-lab exec "$PG" -- \ psql -U keycloak -d keycloak -c "SELECT name, cluster_name, ip, coord FROM jgroups_ping ORDER BY name;" curl -s https://auth.hyeonworks.com/realms/master/.well-known/openid-configuration | python3 -m json.tool kubectl -n keycloak-lab top pods ```