
데브옵스
Informer를 사용해 쿠버네티스 중계 API 서버의 성능 개선하기
두줄요약
쿠버네티스 중계 API 서버를 Python에서 Go로 재구현하고 Informer 캐시를 적용했습니다. 그 결과 800개 노드의 리소스 계산 시간이 약 10초에서 0.2초로 줄었습니다.
문제 상황
- 멀티 테넌트 쿠버네티스 클러스터에서 일반 사용자가 클러스터 레벨 오브젝트 권한 없이 노드의 스케줄링 가능 리소스를 확인해야 하는 요구
- kubectl describe node 수준의 계산을 제공하려 했지만, 전체 파드 조회가 필요해 RBAC 제약과 성능 문제 발생
원인 분석
- 노드별 리소스 계산에 클러스터 전체 파드 목록 조회가 필요해 kube-apiserver와 etcd 부하가 큼
- Python 클라이언트 기반 구현은 비동기화 후에도 한 리소스 계산에 약 10초 소요
해결 방법
- Go 클라이언트와 SharedInformerFactory를 사용해 노드·파드 Informer 캐시 구성
- Reflector, Informer, Indexer로 로컬 캐시에 오브젝트 변경을 반영하고, 조회는 캐시에서 처리
- 캐시된 파드 요청량과 노드 allocatable 자원의 차이로 스케줄링 가능 리소스 계산
성능/운영 포인트
- kube-apiserver 직접 조회 대신 로컬 캐시 사용으로 API 부하 감소
- 800개 노드 기준 계산 시간이 약 10초에서 0.2초로 단축