일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- restapi
- 서버
- HTTP
- java11
- LangChain
- java
- redis
- Apollo
- k8s
- 조건문
- 스프링부트
- 프로그래머스
- puppeteer
- Spring
- ai
- Docker
- graphql
- 백준알고리즘
- mysql
- mongodb
- TCP
- Scanner
- bufferdreader
- eof
- Android
- 스프링
- nodejs
- Mongoose
- 자바
- MapReduce
- Today
- Total
자라나라 개발머리
[k8s] Service의 로드 밸런싱 전략 본문
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 입니다 ........ 🐥
출처