쿠버네티스 컨트롤러(Kubernetes Controller)는 클러스터의 현재 상태(current state)를 감시하고, 사용자가 정의한 원하는 상태(desired state)가 반영되도록 자동으로 조치(reconcile)를 취하는 제어 루프(control loop)이다.
정의 및 개념
쿠버네티스에서 대부분 리소스 객체는 'spec' 필드로 사용자가 원하는 상태를 선언하고, 'status' 필드로 현재 상태를 기록한다. 컨트롤러는 이 상태들을 주기적으로 비교하여, 두 상태가 일치하지 않을 경우 적절한 생성(create), 변경(update), 삭제(delete) 등의 작업을 API 서버를 통해 요청해 실제 상태를 원하는 상태에 가깝게 맞춘다.
컨트롤러는 자동화된 방식으로 클러스터를 관리하며, 사용자의 개입 없이도 시스템이 안정적이고 일관된 상태를 유지하도록 한다.
동작 방식 (Control Loop)
1. 컨트롤러는 감시 대상 리소스(resource type)를 정해두고 해당 리소스에 대한 생성, 수정, 삭제 이벤트를 watch 한다.
2. 이벤트 발생 또는 주기적 검사 후, 현재 상태와 선언된 상태를 비교한다.
3. 두 상태가 다르면, 현재 상태를 선언된 상태에 맞게 조정하기 위한 작업(request)을 API 서버에 보낸다.
- 예: 파드 생성, 레플리카 수 조정, 볼륨 바인딩, 서비스 엔드포인트 갱신 등.
4. 작업 후 리소스의 상태(status)가 갱신되고, 컨트롤러는 다시 감시를 계속한다.
이러한 루프는 종료되지 않으며, 클러스터의 안정성과 선언된 구성이 지속되도록 끊임없이 작동하는 구조이다.
내장 컨트롤러와 실행 환경
쿠버네티스에는 기본적으로 여러 컨트롤러가 포함되어 있으며, 이들은 주로 kube-controller-manager 라는 단일 프로세스에서 실행된다.
예를 들면 다음과 같은 컨트롤러들이 있다:
- 워크로드 관련: ReplicaSet Controller, Deployment Controller, StatefulSet Controller, DaemonSet Controller 등
- 작업(Job) 관련: Job Controller
- 인프라/클러스터 관리: 노드 상태 감시, 볼륨 바인딩, 서비스 엔드포인트 관리 등
사용자는 일반적으로 파드를 직접 만들기보다는 이러한 컨트롤러가 관리하는 상위 추상 리소스(Deployment, StatefulSet, Job 등)를 생성함으로써 원하는 동작을 정의하게 된다.
사용자 정의 컨트롤러 (커스텀 컨트롤러 / 오퍼레이터)
기본 내장 컨트롤러 이외에도, 사용자는 특정 애플리케이션 요구사항에 따라 커스텀 컨트롤러(custom controller)를 작성할 수 있다. 이 경우, 기존 쿠버네티스 리소스를 감시하는 대신, 사용자가 정의한 CRD(Custom Resource Definition)를 감시하고 reconciliation 로직을 구현한다. 이러한 사용자 정의 컨트롤러를 일반적으로 Kubernetes Operator 라고 부른다.
오퍼레이터는 복잡한 상태ful 애플리케이션의 배포, 백업, 스케일링, 롤백, 업그레이드 등을 자동화하는 데 사용된다.
왜 컨트롤러가 중요한가
- 자동화와 안정성: 직접 관리를 하지 않아도 쿠버네티스가 원하는 상태를 유지하도록 보장
- 선언형 구성 관리: 선언(spec)만 정의하면 나머지 작업은 컨트롤러가 처리
- 자기 치유(Self-healing): 장애 발생 시 자동으로 복구 (파드 재생성, 볼륨 복구 등)
- 확장성: 같은 정의로 다수의 리소스를 쉽게 관리 가능
요약
컨트롤러는 쿠버네티스 클러스터의 핵심 제어 단위로, 선언된 리소스의 상태(spec)에 맞춰 실제 상태를 유지하도록 지속적으로 감시 및 조정하는 자동화 루프이다. 내장된 다양한 컨트롤러뿐 아니라, 커스텀 컨트롤러를 통해 사용자가 필요로 하는 로직을 확장할 수도 있다.