kube-controller-manager
컨트롤러를 생성(초기화)하고 실행
핵심 초기화 (run 함수)
CreateControllerContext
- 모든 컨트롤러가 공유할
SharedInformerFactory 와 Client 를 생성
BuildControllers
- informer 생성 및 등록
- 컨트롤러가 informer 에 핸들러 등록(구독)
InformerFactory.Start
InformerFactory 를 시작하여 캐시 동기화를 개시
RunControllers
Controller
목표 상태와 현재 상태를 일치시키는 무한 루프
능동적인 상태 관리(Reconciliation)가 필요한 리소스에만 존재
역할
- 다수의 컨트롤러(리소스별로 존재) 를 조율
- 공유 의존성을 관리 (Informers, Clients)
- 고가용성(Leader Election) 처리
Leader Election
Master Node 3대에 각각 하나씩 총 3개의 kube-controller-manager 프로세스(인스턴스)를 띄움
- 이 중 하나만 리더로 선출(선출 기준: 선착순) 하여 모든 controller 를 생성 및 실행
- 리더는 2초마다
Lease 라는 문서(주기적인 생존 신고용)를 갱신
- 나머지는 대기조(Standby) 로 Leader 장애시 정권 교체
- 모든 데이터의 원본(Truth)은 etcd에만 저장되어 있기 때문에 인수인계는 필요 없음
동작
queue 에 key 만 넣고 Worker 가 큐에서 꺼내서 비즈니스 로직(sync)을 실행
- informer 에 EventHandler 등록
- EventHandler 에서는 queue 에 key 를 넣는 로직을 실행
- Rate Limiting Queue 사용
workqueue.TypedRateLimitingInterface[string]
- 재시도가 많아질수록 더욱 천천히 재시도
- key 형식
- 데이터는 항상 처리 직전에 조회
- 데이터는 informer 의 로컬 캐시를 lister 를 통해 조회
"DB 를 직접 조회하지 말고, 변경 사항만 구독해서 내 로컬 메모리(Cache)에 복사본을 갖고 있자."
거의 모든 리소스 종류(Kind)마다 존재
역할
- API (Kubernetes API Server) Watch
- 한 번의 연결 요청으로 커넥션을 만들고 response body 를 계속해서 받음
- 캐시 구축
- 로컬 캐시
cache.cacheStorage: treadSafeMap
- lock (sync.RWMutex): 동시성 제어
- items (
map[string]any): 실제 데이터 저장소
- index (storeIndex): 검색을 빠르게 하기 위한 보조 인덱스
- 이벤트를 구독한 컨트롤러에게 알림
sharedInformerFactory
컨트롤러들이 공유하는 informer 들을 map 으로 관리하며
동일한 리소스에 대해 하나의 informer (watch, cache) 를 갖도록 함
Reference