세션 어피니티란, 한번 연결된 타겟 파드로 다음번에도 연결되도록 하는 것이다. 즉, ClusterIP 서비스에 세션 어피니티를 적용한 경우(즉, 내부 네트워크에 적용), 파드끼리 통신할 때 한번 연결된 파드에 다음번 통신때도 연결된다.
1. 세션 어피니티 설정
아래와 같이 spec.sessionAffinity 항목과 spec.sessionAffinityConfig 항목을 설정한다.
spec.sessionAffinity: ClientIP 는 요청을 보낸 측을 식별할 때 client IP 주소로 식별하겠다는 것이고, spec.sessionAffinityConfig 의 설정은 세션 고정 시간을 의미한다.
apiVersion: v1
kind: Service
metadata:
name: session-affinity
spec:
type: LoadBalancer
selector:
app: sample-app
ports:
- name: http-port
protocol: TCP
port: 8080
targetPort: 80
nodePort: 30084
sessionAffinity: ClientIP
sessionAffinityConfig:
clientIP:
timeoutSeconds: 10
sessionAffinityConfig.clientIP.timeoutSeconds: 10 을 설정했으므로, 요청 후 10초 이내의 요청은 같은 파드로 전송된다.
$ kubectl get pods
NAME READY STATUS RESTARTS AGE
sample-deployment-75c768d5fb-2lkwp 1/1 Running 0 33d
sample-deployment-75c768d5fb-9qdjm 1/1 Running 0 33d
sample-deployment-75c768d5fb-g5vkv 1/1 Running 0 33d
# 첫 요청
$ kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://session-affinity.default.svc.cluster.local:8080
Host=session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-g5vkv ClientIP=10.244.2.118 XFF=
# 첫 요청으로부터 10초 이내에 요청
$ kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://session-affinity.default.svc.cluster.local:8080
Host=session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-g5vkv ClientIP=10.244.2.118 XFF=
# 두번째 요청으로부터 10초 이내에 요청
$ kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://session-affinity.default.svc.cluster.local:8080
Host=session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-g5vkv ClientIP=10.244.2.118 XFF=
# 세번째 요청으로부터 10초 초과한 후 요청
# 다른 파드로 연결됨
$ kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://session-affinity.default.svc.cluster.local:8080
Host=session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-9qdjm ClientIP=10.244.2.118 XFF=
spec.sessionAffinity: None 으로 수정한 후 동일한 테스트를 진행해보면, 10초 이내에 재요청 하더라도 다른 파드에 전송되는 것을 볼 수 있다.
# 첫번째 요청
$ kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://no-session-affinity.default.svc.cluster.local:8080
Host=no-session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-g5vkv ClientIP=10.244.2.118 XFF=
# 첫번째 요청 후 10초 이내 두번째 요청 => 다른 파드로 전송됨
$ kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://no-session-affinity.default.svc.cluster.local:8080
Host=no-session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-9qdjm ClientIP=10.244.2.118 XFF=
# 두번째 요청 후 10초 이내 세번째 요청 => 다른 파드로 전송됨
$ kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://no-session-affinity.default.svc.cluster.local:8080
Host=no-session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-g5vkv ClientIP=10.244.2.118 XFF=
# 세번째 요청 후 10초 이내 네번째 요청 => 다른 파드로 전송됨
kubectl exec -it sample-deployment-75c768d5fb-2lkwp -- curl http://no-session-affinity.default.svc.cluster.local:8080
Host=no-session-affinity.default.svc.cluster.local Path=/ From=sample-deployment-75c768d5fb-2lkwp ClientIP=10.244.2.1 XFF=
위의 예제에서는 LoadBalancer 서비스를 생성할 때 생성된 ClusterIP 를 통해 1개의 노드 내에서 세션 어피니티가 적용되는 모습을 보았다. 그런데, 세션 어피니티는 실제로는 각 쿠버네티스 노드에 iptables 로 구현되어 있다. 따라서 NodePort 서비스에 세션 어피니티를 지정하면 동일한 client 의 재요청이라 하더라도 어느 노드에서 수신하느냐에 따라 다른 파드로 연결될 수 있음에 유의하자.(즉, 세션 어피니티는 노드 단위에서 작동한다.)
'Kubernetes' 카테고리의 다른 글
| [Kubernetes] Multi Region 서비스에서 최소한의 latency 를 위한 Topology Aware Hint (0) | 2025.11.23 |
|---|---|
| [Kubernetes] 클러스터 외부 트래픽에 대해 노드에서의 로드 밸런싱 제외 (0) | 2025.11.23 |
| [Kubernetes] LoadBalancer 서비스 이해 (0) | 2025.11.15 |
| [Kubernetes] NodePort 서비스 이해 (0) | 2025.11.15 |
| [Kubernetes] ClusterIP - externalIPs 서비스 이해 (0) | 2025.10.19 |
