Kubernetes Session Affinity
Kubernetes에서 Session Affinity는 클라이언트의 요청이 항상 동일한 파드로 라우팅되도록 보장하는 기능입니다. 즉, 세션이 유지되는 동안 동일한 클라이언트의 요청이 동일한 백엔드 파드로 전달되도록 하여 상태를 유지하는 데 사용됩니다. 이는 주로 상태 기반 애플리케이션에서 유용합니다. 예를 들어, 특정 사용자의 세션 데이터가 특정 파드에 저장되어 있는 경우, 이후의 모든 요청이 해당 파드로 전달되어야 세션이 유지됩니다.
1. Kubernetes에서 Session Affinity의 동작 방식:
Kubernetes에서는 Service의 sessionAffinity
설정을 통해 Session Affinity를 구성할 수 있습니다. 기본적으로 Session Affinity는 비활성화되어 있으며, 이를 활성화하려면 다음과 같은 방식으로 설정할 수 있습니다.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
selector:
app: my-app
ports:
- protocol: TCP
port: 80
targetPort: 9376
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
# 세션 유지 시간 (초 단위)
timeoutSeconds: 3600
이 설정에서 중요한 부분은 sessionAffinity: ClientIP
입니다. 이것은 클라이언트의 IP 주소를 기준으로 요청을 항상 동일한 파드로 라우팅하도록 지정하는 옵션입니다.
sessionAffinity: ClientIP
:- 의미: 클라이언트의 IP 주소를 기준으로 세션을 유지하도록 설정합니다.
- 기본값:
None
(Session Affinity 비활성화)
sessionAffinityConfig
:clientIP
:timeoutSeconds
: 클라이언트 세션이 유지되는 시간을 초 단위로 설정합니다.- 예시:
3600
은 1시간 동안 세션을 유지함을 의미합니다. - 기본값:
10800
(3시간)
- 예시:
ClientIP 기반 Session Affinity:
- 클라이언트의 IP 주소를 기준으로 세션을 유지합니다.
- 클라이언트의 요청이 처음에 라우팅된 파드를 기억하고, 이후의 요청도 해당 파드로 보냅니다.
- IP 기반으로 분배하기 때문에 클라이언트가 동일한 IP로 요청할 경우 같은 파드로 라우팅됩니다.
2. Session Affinity 내부 동작 방식
Kubernetes에서 Client IP 기반 Session Affinity는 클라이언트의 IP 주소를 기준으로 특정 파드로 지속적으로 트래픽을 라우팅하는 방식입니다. 이를 구현하기 위해 Kubernetes는 IP 해시(Hashing)와 로드 밸런서의 기능을 사용하여, 클라이언트의 IP 주소와 파드를 매칭하는 규칙을 만듭니다. 이 과정에서 세부적으로 다음과 같은 로직이 사용됩니다.
Client IP 기반 Session Affinity 내부 로직
- 첫 번째 요청:
클라이언트가 Service에 요청을 보낼 때, Kubernetes의 kube-proxy가 클러스터의 Service에 대한 트래픽을 처리합니다. 클라이언트의 첫 번째 요청이 들어오면, Kubernetes 로드 밸런서는 해당 요청을 여러 파드 중 하나로 무작위로 또는 라운드 로빈 방식으로 전달합니다. - Client IP 기록:
클라이언트의 IP 주소는 로드 밸런서나 kube-proxy가 기록합니다. 이때, 클라이언트의 IP 주소와 선택된 파드 간의 매핑이 생성됩니다. 이러한 매핑 정보는 커넥션 테이블(Connection Tracking Table)에 저장됩니다. 이 커넥션 테이블은 클라이언트의 IP 주소와 해당 IP에 매칭된 파드를 기억합니다. - 후속 요청 처리:
클라이언트가 다시 요청을 보내면, kube-proxy는 해당 클라이언트의 IP 주소를 확인합니다. 이 IP 주소가 이전에 커넥션 테이블에 기록된 경우, 같은 파드로 요청을 라우팅합니다. 이렇게 함으로써 세션 동안 클라이언트의 요청은 항상 동일한 파드로 전달됩니다. - 연결 유지 시간:
이 매핑은 특정 시간 동안 유지됩니다. 기본적으로 이 시간은 10800초(3시간)입니다. 이는sessionAffinityConfig
설정에서 조정 가능합니다. 클라이언트가 일정 시간 동안 활동이 없으면 이 매핑 정보는 삭제되고, 이후에 새로운 요청이 들어오면 다시 처음부터 로드 밸런싱을 수행하게 됩니다.
클라이언트의 첫 요청이 파드 A로 라우팅되었다면, kube-proxy는 커넥션 테이블에 "클라이언트 IP -> 파드 A"와 같은 매핑을 저장합니다. 이후 클라이언트가 같은 IP 주소로 다시 요청을 보낼 때, kube-proxy는 이 매핑을 확인하여 동일한 파드 A로 트래픽을 라우팅합니다.
이 방식은 일반적으로 IPVS 모드에서 많이 사용됩니다. IPVS는 커넥션을 효율적으로 관리할 수 있는 고성능 네트워크 로드 밸런싱 솔루션으로, Kubernetes에서 로드 밸런싱의 성능을 크게 향상시킵니다.
Session Affinity 설정 시 고려사항
- 세션 유지 시간:
sessionAffinityConfig
에서 세션 유지 시간을 설정할 수 있습니다. 이 값은 클라이언트가 특정 파드에 묶여있는 시간입니다. 기본값은 10800초 (3시간)입니다. - 로드 밸런싱: Session Affinity가 활성화되면 로드 밸런서의 균등 분배 기능이 제한될 수 있습니다. 특정 파드로 트래픽이 집중될 가능성이 있기 때문에, 파드 간 부하 분산이 필요하다면 이를 주의해야 합니다.
- Session Affinity는 주로 상태 기반 웹 애플리케이션이나 세션을 필요로 하는 서비스에서 사용되며, 무상태 서비스에서는 필요하지 않은 기능입니다.
'Kubernetes' 카테고리의 다른 글
Rabbit MQ Kubernetes Helm 배포 (1) | 2024.10.15 |
---|---|
Kubernetes Dashboard 배포 Istio domain 설정 (0) | 2024.10.14 |
Kubernetes Ingress Controller (2) | 2024.10.13 |
Kubernetes Traffic (1) | 2024.10.13 |
Kubernetes Liveness Readiness (2) | 2024.10.13 |