수년간 쿠버네티스 커뮤니티는 API 서버의 안정성과 성능 예측 가능성을 향상시키기 위한 임무를 수행해 왔습니다.
이 노력의 주요 초점은 역사적으로 높은 메모리 사용량과 etcd 데이터 저장소에 과도한 부하의 주요 원인이었던 list 요청을 길들이는 것이었습니다.
각 릴리스마다 우리는 이 문제를 점차 해결해 왔으며, 오늘, 이 퍼즐의 마지막 주요 조각을 발표하게 되어 기쁩니다.
스냅샷 가능한 API 서버 캐시 기능이 쿠버네티스 v1.34에서 베타 단계로 졸업했습니다. 이는 거의 모든 읽기 요청을 API 서버의 캐시에서 직접 처리할 수 있도록 하기 위한 여러 릴리스에 걸친 노력의 정점입니다.
성능 및 안정성을 위한 캐시의 진화
현재 상태에 이르기까지 최근 릴리스에서 발표된 몇 가지 주요 개선 사항이 밑거름이 되었습니다.
캐시에서 일관된 읽기 (v1.31에서 베타)
API 서버는 오랫동안 성능 향상을 위해 캐시를 사용해 왔지만, 중요한 이정표는 캐시에서 최신 데이터에 대한 일관된 읽기를 보장하는 것이었습니다. 이 v1.31 개선 사항은 처음으로 watch 캐시가 강력하게 일관된 읽기 요청에 사용될 수 있도록 했으며, 이는 필터링된 컬렉션 (예: "이 노드에 바인딩된 파드 목록")을 etcd 대신 캐시에서 안전하게 제공하여 일반적인 워크로드에서 etcd의 부하를 극적으로 줄일 수 있게 했다는 점에서 큰 성과였습니다.
스트리밍으로 대규모 응답 제어 (v1.33에서 베타)
또 다른 주요 개선 사항은 대규모 응답을 전송할 때 발생하는 메모리 급증 문제를 해결하는 것이었습니다. v1.33에 도입된 스트리밍 인코더는 API 서버가 전체 수 기가바이트 응답을 메모리에 버퍼링하는 대신, 목록 항목을 하나씩 전송할 수 있도록 했습니다. 이를 통해 응답 전송의 메모리 비용은 크기에 관계없이 예측 가능하고 최소화되었습니다.
빠진 조각
이러한 엄청난 개선에도 불구하고, 중요한 공백이 남아있었습니다. 과거 LIST 요청—대규모 결과 집합을 페이지로 구분하여 탐색하는 데 가장 일반적으로 사용되는—은 여전히 캐시를 우회하고 etcd에 직접 쿼리해야 했습니다. 이는 데이터를 검색하는 비용이 여전히 예측 불가능했으며 API 서버에 상당한 메모리 압력을 가할 수 있음을 의미했습니다.
Kubernetes 1.34: 스냅샷이 그림을 완성하다
스냅샷 가능한 API 서버 캐시는 이 퍼즐의 마지막 조각을 해결합니다. 이 기능은 watch 캐시를 강화하여 효율적인 시점 스냅샷을 생성할 수 있도록 합니다.
작동 방식은 다음과 같습니다. 각 업데이트에 대해 캐시는 경량 스냅샷을 생성합니다. 이 스냅샷은 "게으른 복사본(lazy copies)"으로, 객체를 중복 복사하는 대신 포인터만 저장하여 메모리 효율성이 매우 뛰어납니다.
과거 resourceVersion에 대한 list 요청이 도착하면, API 서버는 이제 해당 스냅샷을 찾아 메모리에서 직접 응답을 제공합니다.
이는 마지막 주요 공백을 해소하여 페이지로 구분된 요청이 전적으로 캐시에서 제공될 수 있도록 합니다.
API 서버 성능의 새로운 시대 🚀
이 마지막 조각이 제자리를 찾으면서, 이 세 가지 기능의 시너지는 API 서버 예측 가능성 및 성능의 새로운 시대를 엽니다.
- 캐시에서 데이터 가져오기: 일관된 읽기와 스냅샷 가능한 캐시는 함께 작동하여 최신 데이터 또는 과거 스냅샷에 대한 거의 모든 읽기 요청이 API 서버의 메모리에서 제공되도록 보장합니다.
- 스트림을 통한 데이터 전송: 스트리밍 목록 응답은 이 데이터를 클라이언트에 전송하는 데 최소한의 일정한 메모리 공간만 필요하도록 보장합니다.
그 결과, 읽기 작업의 리소스 비용이 거의 완벽하게 예측 가능하고 요청 부하 급증에 훨씬 더 탄력적으로 대응하는 시스템이 탄생했습니다.
이는 메모리 압력의 극적인 감소, etcd에 대한 부하 경감, 그리고 모든 쿠버네티스 클러스터를 위한 더욱 안정적이고 확장 가능하며 신뢰할 수 있는 컨트롤 플레인을 의미합니다.
시작하는 방법
베타 단계로 졸업함에 따라, SnapshottableCache 기능 게이트는 Kubernetes v1.34에서 기본적으로 활성화됩니다. 이러한 성능 및 안정성 개선 사항의 이점을 누리기 위해 별도로 필요한 조치는 없습니다.
감사의 말씀
이러한 중요한 기능들을 설계하고, 구현하고, 검토해주신 분들께 특별히 감사드립니다:
- Ahmad Zolfaghari (@ah8ad3)
- Ben Luddy (@benluddy) – Red Hat
- Chen Chen (@z1cheng) – Microsoft
- Davanum Srinivas (@dims) – Nvidia
- David Eads (@deads2k) – Red Hat
- Han Kang (@logicalhan) – CoreWeave
- haosdent (@haosdent) – Shopee
- Joe Betz (@jpbetz) – Google
- Jordan Liggitt (@liggitt) – Google
- Šukasz Szaszkiewicz (@p0lyn0mial) – Red Hat
- Maciej Borsz (@mborsz) – Google
- Madhav Jivrajani (@MadhavJivrajani) – UIUC
- Marek Siarkowicz (@serathius) – Google
- NKeert (@NKeert)
- Tim Bannister (@lmktfy)
- Wei Fu (@fuweid) - Microsoft
- Wojtek Tyczyński (@wojtek-t) – Google
...그리고 SIG API Machinery의 많은 분들께. 이 이정표는 더 확장 가능하고 강력한 쿠버네티스를 구축하려는 커뮤니티의 헌신을 증명합니다.