자라나라 개발머리

[k8s] Service의 로드 밸런싱 전략 본문

Kubernetes

[k8s] Service의 로드 밸런싱 전략

iammindy 2024. 4. 14. 19:01

k8s에는 service라는 리소스가 있습니다.

service는 여러개의 pod를 하나의 Ip로 접근할 수 있도록 하는 역할을 합니다.

그럼 service는 요청들을 어떤 방식으로 로드 밸런싱할까요?

 

저는 당연히 round-robin 방식으로, 균등하게 각 pod에 전달할 줄 알았습니다.

하지만 k8s는 round-robin 방식으로 트래픽을 전달하지 않고 있었습니다!

 

이에 대해 리서치하다가 자세하고 친절하게 적은 외국 블로그 글을 발견했습니다.

그래서 오늘은, 그 블로그 글을 정리하여 service의 로드 밸런싱 전략에 대해 설명해보겠습니다.

 

service의 로드 밸런싱 전략

 

service로 만든 ip 주소들은, kube-proxy에서 사용됩니다.

kube-proxy 모든 service IP 주소 목록을 읽고 모든 노드에 iptables 규칙 컬렉션을 작성합니다.

작성된 규칙들을 다음과 같은 의미입니다.

"만약 service IP 주소를 보면, 요청을 다시 보내고, 목적지 ip를 해당 Pod 하나로 선택하세요"

 

그럼 이 iptables는 round-robin 방법을 사용할까요?

아닙니다.

 

iptables는 주로 방화벽 용도로 사용되며 로드 밸런싱을 수행하기 위해 설계되지 않았습니다.

하지만 iptables 로드 밸런서처럼 동작하도록 만들기 위해 규칙 세트를 만들 있습니다.

 

그 규칙세트를 만드는 것이 바로 k8s의 service의 로드밸런싱 방법입니다.

 

 

보이는 그림과 같이, iptables에 있는 모든 pod에 확률적으로 분배되게끔 규칙을 설계합니다.

 

3개의 Pod가 있다면, kube-proxy는 다음과 같은 규칙을 작성합니다:

1. Pod 1을 33% 확률로 목적지로 선택합니다. 그렇지 않으면 다음 규칙으로 이동합니다.

2. Pod 2을 50% 확률로 목적지로 선택합니다. 그렇지 않으면 다음 규칙으로 이동합니다.

3. Pod 3를 목적지로 선택합니다.

 

k8s의 service에 들어가는 요청은 이런식으로 로드밸런싱 됩니다.

따라서, k8s의 service의 로드밸런싱은 확률적으로는 균등하게 분배되게끔 설계 되어있으나, 100% 균등하게 분배되지는 않습니다.

 

당연히 round-robin으로만 생각했는데, 이런 매커니즘으로 트래픽이 분배되고 있구나 깨닫게 되었습니다.

역시 배울수록 알쏭달쏭 알 수 없는 k8s 입니다 ........ 🐥

 

 

출처

https://learnk8s.io/kubernetes-long-lived-connections