keycloak은 인스턴스가 여러 개일때 서로 세션 정보 등을 공유하기 위해 infinispan이라는 캐시를 사용한다. 이런 세션 공유를 위해서는 서로 통신해야하는데, 이 때 쓰이는 통신 스택의 종류로 UDP, TCP, Kubernetes 등이 있다.
JGroups
자바로 작성된 라이브러리로 일대일 또는 일대다 통신을 지원한다. 프로세스 그룹을 생성하고 그룹 내 멤버들이 서로 메시지를 주고 받을 수 있게 해준다. 이는 클러스터링, 분산 캐시 및 채팅 애플리케이션에 활용될 수 있다.
keycloak의 infinispan도 JGroups를 사용한다. k8s와 같이 pod이 소멸되고 생성될 수 있는 환경에서는 각 pod의 주소를 알아야하는데, 이를 구현하기 위해 keycloak pod들을 headless service에 묶고, 해당 headless service의 FQDN(Fully Qualified Domain Name)을 기준으로 서로를 찾아내도록 구성한다. 그리고 파드간 통신을 위해 JGroups의 KUBE_PING이라는 프로토콜을 사용하는 방식이다. 이는 k8s의 API를 통해 통신하는 방식이다.
k8s 환경에서 위와 같은 설정을 위해서는 아래 환경 변수들을 작성하면 된다. AWS EKS에서는 UDP multicast가 안돼서 kubernetes 스택을 적용해야한다.
KC_CACHE_STACK=kubernetes
JAVA_OPTS_APPEND=-Djgroups.dns.query={service 이름}.{namespace 이름}.svc(서비스 도메인).cluster.local(클러스터 도메인)
설정 정보들을 적용 후, pod의 로그들을 살펴보면 아래와 같이 처음에는 no members.. 라는 로그가 보이지만 이후에는 member 들을 찾았다는 로그와 함께 rebalance가 일어나면서 서로 sync 하는 로그들을 확인할 수 있다.
'Programming-[Backend] > Keycloak' 카테고리의 다른 글
[비공개] Keycloak 클라이언트별 Admin 관리자 만들기 (0) | 2025.01.21 |
---|---|
Keycloak 세부 권한 관리(admin-fine-grained-authz) (0) | 2025.01.21 |
Keycloak Password Hashing Algorithm: Bcrypt 방식 적용하기 (0) | 2024.11.27 |
Keycloak ID(username) 찾기 기능 구현하기 (2) | 2024.10.21 |
keycloak 2차 인증(문자, 이메일) 구현하기 w/ AWS SNS (3) | 2024.10.21 |