컨트롤러 매니저
1. 개요
1. 개요
컨트롤러 매니저는 쿠버네티스 클러스터의 핵심 관리 컴포넌트이다. 이는 컨트롤 루프를 실행하여 시스템의 현재 상태를 사용자가 선언한 원하는 상태로 끊임없이 조정하는 역할을 담당한다. 클라우드 네이티브 애플리케이션과 컨테이너 오케스트레이션의 핵심 원칙인 선언적 상태 관리를 실현하는 주체라고 볼 수 있다.
주요 용도는 파드, 노드, 서비스 등과 같은 다양한 쿠버네티스 리소스의 상태를 지속적으로 모니터링하고 관리하는 것이다. 예를 들어, 사용자가 특정 애플리케이션을 운영하기 위해 3개의 파드 복제본을 요구하면, 컨트롤러 매니저는 실제 실행 중인 파드 수를 관찰하고 요구된 수와 차이가 발생할 경우 자동으로 새로운 파드를 생성하거나 제거하는 조치를 취한다.
그 동작 방식은 기본적으로 API 서버를 통해 클러스터의 전체 상태를 감시하는 것으로 시작한다. 컨트롤러 매니저는 관찰(Observe), 차이 분석(Diff), 행동(Act)이라는 세 단계의 논리를 무한히 반복하는 컨트롤 루프를 구동한다. 이 과정을 통해 시스템은 어떠한 장애나 변경이 발생하더라도 자동으로 원래 지정된 상태로 복귀하는 자기 치유 능력을 갖추게 된다.
이러한 메커니즘은 단일 실패 지점을 방지하고 시스템의 신뢰성과 안정성을 보장하는 데 기여한다. 컨트롤러 매니저는 쿠버네티스의 여러 기본 컨트롤러를 하나의 프로세스로 묶어 실행하는 형태이며, 분산 시스템의 복잡한 상태 관리를 추상화하여 사용자에게 단순화된 인터페이스를 제공한다.
2. 역할과 기능
2. 역할과 기능
컨트롤러 매니저는 쿠버네티스 클러스터의 안정성과 선언된 상태를 유지하는 데 핵심적인 역할을 수행하는 컴포넌트이다. 이는 사용자가 YAML이나 kubectl 명령어를 통해 정의한 '원하는 상태'(Desired State)를 실제 클러스터의 '현재 상태'(Current State)와 지속적으로 비교하며, 두 상태가 일치하도록 조정 작업을 실행한다. 예를 들어, 사용자가 레플리카셋에서 3개의 파드 복제본을 요청했는데 실제로는 2개만 실행 중이라면, 컨트롤러 매니저는 이 차이를 감지하고 부족한 1개의 파드를 생성하는 조치를 취한다.
이러한 조정 작업은 '컨트롤 루프'라는 무한 반복 프로세스를 통해 이루어진다. 컨트롤 루프는 크게 관찰(Observe), 차이 분석(Diff), 행동(Act)의 세 단계로 구성된다. 먼저 API 서버를 통해 클러스터 내 특정 리소스의 상태를 지속적으로 관찰한다. 그 다음, 관찰된 현재 상태와 사용자가 선언한 원하는 상태를 비교하여 차이를 분석한다. 마지막으로, 분석된 차이를 해소하기 위해 필요한 조치(예: 리소스 생성, 삭제, 업데이트)를 실행한다. 이 루프는 클러스터가 운영되는 동안 끊임없이 반복되어 시스템을 원하는 상태로 수렴시킨다.
컨트롤러 매니저는 단일 프로세스 내에서 노드 컨트롤러, 레플리케이션 컨트롤러, 엔드포인트 컨트롤러, 서비스 어카운트 컨트롤러 등 다양한 하위 컨트롤러들을 병렬로 실행한다. 각 하위 컨트롤러는 특정 리소스 유형(예: 노드, 파드, 서비스)의 생명주기를 전담 관리함으로써 컨테이너 오케스트레이션의 자동화된 운영을 실현한다. 이를 통해 개발자와 운영자는 인프라의 세부적인 상태 관리보다 애플리케이션 배포와 비즈니스 로직에 더 집중할 수 있는 클라우드 네이티브 환경을 구축할 수 있다.
3. 주요 컨트롤러 매니저 종류
3. 주요 컨트롤러 매니저 종류
쿠버네티스 클러스터에는 다양한 리소스를 관리하기 위한 여러 컨트롤러 매니저가 존재한다. 이들은 각자 담당하는 리소스의 선언적 상태를 유지하기 위해 독립적인 컨트롤 루프를 실행한다.
가장 대표적인 종류로는 파드의 복제본 수를 관리하는 레플리케이션 컨트롤러와 그 진화형인 레플리카셋 컨트롤러가 있다. 또한, 노드의 상태를 모니터링하고 장애 노드를 관리하는 노드 컨트롤러, 서비스와 파드를 연결하는 엔드포인트슬라이스 컨트롤러, 그리고 서비스 어카운트와 토큰을 관리하는 서비스어카운트 컨트롤러 등이 핵심 컴포넌트로 동작한다.
이 외에도 데몬셋 컨트롤러는 모든 노드에 특정 파드를 배포하는 역할을 하며, 잡 컨트롤러와 크론잡 컨트롤러는 일회성 또는 주기적인 배치 작업을 관리한다. 스테이트풀셋 컨트롤러는 상태를 가지는 애플리케이션의 순서적 배포와 안정적인 네트워크 식별자를 보장한다.
이러한 컨트롤러 매니저들은 기본적으로 쿠버네티스의 kube-controller-manager 바이너리 내에 컴파일되어 단일 프로세스로 실행되지만, 각각의 로직은 분리되어 특정 API 오브젝트의 변경 사항을 감시하고 필요한 조치를 취하는 방식으로 협력하여 클러스터의 전반적인 상태를 조정한다.
4. 동작 방식
4. 동작 방식
컨트롤러 매니저의 핵심 동작 방식은 컨트롤 루프를 기반으로 한다. 이는 관찰(Observe), 차이 분석(Diff), 행동(Act)의 세 단계를 끊임없이 반복하는 무한 루프 프로세스이다. 컨트롤러 매니저는 쿠버네티스 API 서버를 통해 클러스터 내 파드, 노드, 서비스 등 다양한 리소스의 현재 상태를 지속적으로 관찰한다.
관찰 단계에서 수집된 현재 상태는 사용자가 YAML이나 kubectl 명령어를 통해 선언한 원하는 상태(Desired State)와 비교된다. 이 차이 분석 단계에서 불일치가 감지되면, 컨트롤러 매니저는 즉시 조정 작업을 수행하는 행동 단계로 들어간다. 예를 들어, 실행 중인 파드의 개수가 선언된 개수보다 적다면, 컨트롤러 매니저는 레플리카셋 컨트롤러를 통해 부족한 파드를 새로 생성하는 작업을 실행한다.
이러한 동작은 완전히 자동화되어 있으며, 각 컨트롤러는 자신이 담당하는 특정 리소스 타입에 집중한다. 노드 컨트롤러는 노드의 상태를, 엔드포인트 컨트롤러는 서비스와 파드의 연결을, 서비스 어카운트 컨트롤러는 네임스페이스에 대한 기본 계정을 관리하는 식으로 분업화되어 동작한다. 모든 컨트롤러는 API 서버를 유일한 정보원으로 삼아 상태를 조회하고 변경함으로써 시스템의 일관성을 유지한다.
5. 설정과 관리
5. 설정과 관리
컨트롤러 매니저의 설정과 관리는 주로 구성 파일과 커맨드라인 인자를 통해 이루어진다. 기본적으로 쿠버네티스 클러스터 구성 요소로서 시스템드나 kubeadm과 같은 도구에 의해 자동으로 배포되며, /etc/kubernetes/manifests/ 디렉터리 내 매니페스트 파일에서 그 설정을 확인할 수 있다. 관리자는 이 파일을 수정하거나 kube-controller-manager 바이너리를 직접 실행할 때 인자를 전달하여 동작을 제어한다.
주요 설정 항목으로는 대상 API 서버의 주소(--master), 클러스터 내 CIDR 블록 지정(--cluster-cidr), 리소스 동기화 주기 조정(--node-monitor-period), 그리고 고가용성 구성을 위한 리더 선출(--leader-elect) 파라미터 등이 있다. 또한, 다양한 컨트롤러(예: 노드 컨트롤러, 레플리케이션 컨트롤러, 엔드포인트 컨트롤러)의 세부 동작을 제어하는 전용 인자들도 존재한다.
관리 작업에는 주로 로그 모니터링과 상태 점검이 포함된다. 컨트롤러 매니저의 로그는 kubectl logs 명령어를 통해 확인할 수 있으며, 이를 통해 리소스 조정 과정에서의 이벤트나 오류를 파악한다. 정상적인 동작을 확인하기 위해 kubectl get componentstatuses(kubectl get cs) 명령어를 실행하여 컨트롤러 매니저의 건강 상태를 점검할 수 있다.
고가용성 설정을 위해서는 일반적으로 동일한 구성으로 여러 컨트롤러 매니저 인스턴스를 실행하고 --leader-elect=true 옵션을 활성화한다. 이렇게 하면 리더 선출 메커니즘을 통해 항상 하나의 인스턴스만이 활성 컨트롤 루프를 실행하고, 나머지는 대기 상태를 유지하며 장애 발생 시 자동으로 페일오버가 이루어지도록 보장한다.
6. 문제 해결
6. 문제 해결
컨트롤러 매니저의 문제 해결은 주로 로그 분석과 상태 점검을 통해 이루어진다. 가장 일반적인 방법은 컨트롤러 매니저의 로그를 확인하는 것이다. 로그는 컨트롤러 매니저가 API 서버와의 통신 문제, 리소스 동기화 실패, 내부 오류 등을 포함한 다양한 문제를 진단하는 데 핵심적인 정보를 제공한다. 예를 들어, 특정 컨트롤러가 지속적으로 재시도하거나 특정 이벤트에 반응하지 않는 경우 로그를 통해 원인을 파악할 수 있다.
컨트롤러 매니저의 전반적인 건강 상태는 쿠버네티스 클러스터의 관리 도구를 통해 점검할 수 있다. kubectl get componentstatuses 명령어를 실행하거나 클러스터 모니터링 대시보드를 확인하여 컨트롤러 매니저가 정상적으로 실행 중인지 확인하는 것이 첫 단계다. 또한, 컨트롤러 매니저가 관리하는 특정 리소스(예: 레플리카셋, 노드, 엔드포인트)의 상태가 기대한 대로 유지되지 않는다면, 해당 리소스를 관리하는 컨트롤러에 문제가 있을 가능성이 있다.
주요 문제 원인으로는 권한 부족, 네트워크 분리로 인한 API 서버 연결 불가, 리소스 할당량(CPU/메모리) 초과, 그리고 잘못된 구성이 있다. 컨트롤러 매니저는 필요한 RBAC 권한을 가지고 있어야 하며, 충분한 시스템 리소스를 확보해야 안정적으로 동작한다. 구성 오류는 주로 커맨드라인 인수나 컨피그맵을 통해 전달되는 파라미터에서 발생하며, 공식 문서를 참조하여 설정값을 재확인하는 것이 좋다.
복잡한 문제의 경우, 특정 컨트롤러의 디버그 로그 레벨을 높이거나, etcd에 저장된 리소스의 선언적 상태와 실제 상태를 비교해 보는 것이 도움이 될 수 있다. 컨트롤러 매니저 자체의 재시작은 일시적인 해결책이 될 수 있지만, 근본적인 원인을 찾아 수정하지 않으면 문제가 재발할 수 있다.
