Container Orchestration/Kubernetes

Kubernetes Endpoint와 EndpointSlice 완벽 정리

Somaz 2025. 5. 22. 12:36
728x90
반응형

Overview

쿠버네티스에서 서비스는 클러스터 내의 여러 파드(Pod)로 트래픽을 라우팅하는 역할을 한다.

이때 서비스가 실제 어떤 파드로 연결해야 할지를 저장하는 객체가 바로 `Endpoint` 와 `EndpointSlice` 이다.

오늘은 이 두 객체의 차이점과 진화 과정, 그리고 실제 운영 환경에서 어떤 의미를 가지는지까지 깊이 있게 알아본다.

출처 : https://www.linkedin.com/pulse/kubernetes-concept-endpoints-vs-endpointslices-mbong-ekwoge/

 

 

 

📅 관련 글

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"]

 

 

 

 

 


 

 

 

 

 

 

실제 동작 흐름 요약

  1. 서비스 생성
  2. 서비스에 연결된 파드 검색 (Selector로 매칭)
  3. 매칭된 파드 정보를 저장
    • 기존 방식: 하나의 Endpoint에 모두 저장
    • 최신 방식: 여러 개 EndpointSlice로 나눠 저장
  4. 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

 

 

 

728x90
반응형