Overview
쿠버네티스에서 서비스는 클러스터 내의 여러 파드(Pod)로 트래픽을 라우팅하는 역할을 한다.
이때 서비스가 실제 어떤 파드로 연결해야 할지를 저장하는 객체가 바로 `Endpoint` 와 `EndpointSlice` 이다.
오늘은 이 두 객체의 차이점과 진화 과정, 그리고 실제 운영 환경에서 어떤 의미를 가지는지까지 깊이 있게 알아본다.
📅 관련 글
2024.02.02 - [Container Orchestration/Kubernetes] - Kubernetes Network
Endpoint란?
Endpoint는 서비스에 연결된 모든 파드의 IP와 포트 정보를 가진 객체이다. 쉽게 말해 "이 서비스가 어디로 트래픽을 보낼지"를 담고 있는 주소록이다.
kind: Endpoints
apiVersion: v1
metadata:
name: my-service
subsets:
- addresses:
- ip: 10.233.65.100
- ip: 10.233.65.101
ports:
- port: 8080
EndpointSlice란?
EndpointSlice는 Endpoint의 성능 문제를 해결하기 위해 나온 개선된 구조이다. 서비스에 연결된 파드가 많아지면, 하나의 Endpoint 객체가 지나치게 커지는 문제가 있었다.
✅ 그래서 Pod 정보를 여러 개의 "조각(Slice)"으로 나눠 저장하는 방식이 도입된 것이 EndpointSlice이다.
Endpoint와 EndpointSlice 비교
항목 | Endpoint (EP) | EndpointSlice (EPS) |
등장 시기 | Kubernetes 초창기부터 | Kubernetes 1.17부터 Beta 도입 (1.21 Stable) |
역할 | 서비스에 연결된 Pod의 IP와 Port 정보를 저장 | 같은 역할을 하되, 여러 개의 Slice로 나눠서 저장 |
스케일링 대응 | Pod 수가 많아질수록 하나의 Endpoint에 정보가 다 쌓임 → 성능 저하 가능성 | Pod 수가 많아지면 여러 EndpointSlice로 나눠서 저장 → 성능 개선 |
구조 | 서비스 당 하나의 Endpoint 객체 |
서비스 당 여러 개의 EndpointSlice 객체 가능 |
포맷 | 단순 리스트 (IP:Port 형태) | 구조화된 Slice, AddressType/Ports 필드 지원 |
kube-proxy | 참고 가능 | 기본적으로 이걸 참조 |
EndpointSlice 도입 타임라인
Kubernetes 버전 | 도입 상태 | 설명 |
1.16 | Alpha | 실험적 기능으로 최초 도입 |
1.17 | Beta | 안정화 단계로 승격 |
1.21 | GA (General Availability) | 완전 정식 기능으로 채택 |
왜 EndpointSlice가 필요할까?
초기 Kubernetes는 서비스의 실제 파드 정보를 Endpoint에 모두 담았다. 파드가 5개일 때는 문제가 없지만, 파드가 수천 개로 늘어나면 아래 문제가 터진다.
- Endpoints 객체 크기 커짐 → API Server 성능 저하
- 서비스 업데이트 시 전체 Endpoints 갱신 → 느림
- kube-proxy가 이 큰 정보를 매번 읽어야 함 → 지연 발생
👉 그래서 EndpointSlice가 등장했다.
EndpointSlice의 핵심 특징
✅ 파드 수가 많아지면 자동으로 여러 Slice로 나눠서 저장
✅ 서비스당 여러 Slice를 관리 → 병렬 처리 효율적
✅ 파드 추가/삭제 시 필요한 Slice만 수정 → 변경 부하 최소화
✅ kube-proxy도 EndpointSlice 기반으로 동작 (기본 옵션)
실제 예시로 이해하기
서비스에 연결된 3개 파드가 있을 때
이름 | 타입 | IP | 포트 |
pod-1 | pod | 10.233.65.100 | 8080 |
pod-2 | pod | 10.233.65.101 | 8080 |
pod-3 | pod | 10.233.65.102 | 8080 |
이걸 Endpoints로 표현하면 하나의 큰 리스트가 된다.
kind: Endpoints
subsets:
- addresses:
- ip: 10.233.65.100
- ip: 10.233.65.101
- ip: 10.233.65.102
ports:
- port: 8080
EndpointSlice는 나눠서 저장할 수 있다.
kind: EndpointSlice
endpoints:
- addresses: ["10.233.65.100"]
- addresses: ["10.233.65.101"]
---
kind: EndpointSlice
endpoints:
- addresses: ["10.233.65.102"]
실제 동작 흐름 요약
- 서비스 생성
- 서비스에 연결된 파드 검색 (Selector로 매칭)
- 매칭된 파드 정보를 저장
- 기존 방식: 하나의 Endpoint에 모두 저장
- 최신 방식: 여러 개 EndpointSlice로 나눠 저장
- kube-proxy가 이 정보를 참고해서 서비스-파드 연결
kube-proxy 설정 확인
kube-proxy가 뭘 참고하는지는 ConfigMap에서 확인 가능하다.
kind: ConfigMap
data:
kube-proxy: |
...
mode: "iptables"
featureGates:
EndpointSliceProxying: true # 기본 true
성능 비교
조건 | Endpoint | EndpointSlice |
파드 100개 이하 | 큰 차이 없음 | 큰 차이 없음 |
파드 500개 이상 | 업데이트 느림, API 서버 부하 | 성능 안정적 |
파드 1000개 이상 | 심각한 성능 저하 가능 | 여전히 쾌적 |
- 👉 대규모 클러스터에서는 EndpointSlice가 필수!
결론 요약
상황 | 선택 |
소규모 클러스터 (파드 수 적음) | Endpoint 가능 |
중대형 클러스터 (파드 수 많음) | EndpointSlice 필수 |
Kubernetes 최신 버전 | 기본이 EndpointSlice (kube-proxy도 이걸 참조) |
마무리
- Endpoint와 EndpointSlice는 Kubernetes 서비스 연결의 핵심 구성 요소이다.
- 특히 대규모 환경에서는 EndpointSlice가 안정성과 성능 확보에 필수이다.
- 클러스터 운영자라면, 반드시 알고 관리해야 하는 중요한 개념이니 잘 기억해두자!
Reference
- https://kubernetes.io/docs/concepts/services-networking/endpoint-slices/
- https://github.com/kubernetes/endpointslice
- https://www.linkedin.com/pulse/kubernetes-concept-endpoints-vs-endpointslices-mbong-ekwoge/
'Container Orchestration > Kubernetes' 카테고리의 다른 글
Helm values.schema.json 완벽 정리 (0) | 2025.05.29 |
---|---|
배포하다 서비스 터진 적 있다면? 꼭 알아야 할 Kubernetes 전략 가이드 (2) | 2025.05.28 |
Kubernetes에서 Source IP를 보존하는 방법 (0) | 2025.05.19 |
Kubernetes Gateway API 완전 정복 (0) | 2025.04.04 |
Kubernetes에 static-file-server 생성하기 (0) | 2025.03.24 |