세션 어피니티란, 한번 연결된 타겟 파드로 다음번에도 연결되도록 하는 것이다. 즉, 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 의 재요청이라 하더라도 어느 노드에서 수신하느냐에 따라 다른 파드로 연결될 수 있음에 유의하자.(즉, 세션 어피니티는 노드 단위에서 작동한다.)

블로그 이미지

망원동똑똑이

프로그래밍 지식을 자유롭게 모아두는 곳입니다.

,