개발 창고/Server

쿠버네티스 컨트롤러 매니저: 클러스터 상태를 지키는 자동화의 핵심

Royzero 2025. 9. 17. 22:00
반응형

설명 (Description): 쿠버네티스 컨트롤러 매니저(kube-controller-manager)의 역할과 핵심 원리인 제어 루프(Control Loop)를 알아보세요. 노드, 레플리카셋, 디플로이먼트 등 다양한 내장 컨트롤러가 어떻게 클러스터의 '원하는 상태'를 지속적으로 유지하는지 심층적으로 설명합니다.

TL;DR: 쿠버네티스 컨트롤러 매니저는 컨트롤 플레인의 핵심 구성요소로, 클러스터의 전반적인 상태를 모니터링하고 관리하는 두뇌와 같습니다. 이 매니저는 여러 컨트롤러 프로세스를 하나의 바이너리로 묶어 실행하며, 각 컨트롤러는 특정 리소스의 '현재 상태(current state)'를 사용자가 정의한 '원하는 상태(desired state)'와 일치시키는 역할을 합니다. 이 과정을 '제어 루프(Control Loop)' 또는 '조정 루프(Reconciliation Loop)'라고 부릅니다. 이를 통해 쿠버네티스는 장애 발생 시 자동으로 복구하고, 배포를 자동화하는 등 강력한 자체 회복(self-healing) 능력을 갖게 됩니다.


1. 쿠버네티스 컨트롤러 매니저란?

쿠버네티스(Kubernetes) 클러스터는 여러 컴포넌트가 유기적으로 동작하는 복잡한 시스템입니다. 그중에서도 컨트롤러 매니저(kube-controller-manager)는 API 서버를 통해 클러스터의 상태를 지속적으로 감시하고, 우리가 YAML 파일 등으로 정의한 '원하는 상태'와 '현재 상태'의 차이를 발견하면 이를 바로잡는 역할을 수행하는 핵심 컨트롤 플레인 컴포넌트입니다.

가장 쉬운 비유는 '온도 조절 장치'입니다. 사용자가 희망 온도를 24°C로 설정하면('원하는 상태'), 온도 조절 장치는 현재 온도를 계속 확인하다가('현재 상태') 온도가 설정값보다 낮아지면 히터를 켜고, 높아지면 에어컨을 켜서 24°C를 유지합니다. 컨트롤러 매니저 내부의 각 컨트롤러들도 이와 동일한 원리, 즉 제어 루프(Control Loop)를 기반으로 동작합니다.

컨트롤러 매니저는 복잡성을 줄이기 위해 여러 컨트롤러들을 하나의 프로세스로 통합하여 실행합니다. 예를 들어 노드의 상태를 감시하는 컨트롤러, 파드의 개수를 관리하는 컨트롤러 등이 모두 컨트롤러 매니저 안에서 각자의 임무를 수행합니다.

Why it matters: 컨트롤러 매니저는 쿠버네티스 자동화와 자체 회복 능력의 심장입니다. 사용자가 일일이 클러스터의 상태를 확인하고 조치하지 않아도, 컨트롤러 매니저가 24시간 내내 클러스터를 안정적인 상태로 유지해주기 때문에 개발자와 운영자는 애플리케이션 자체에 더 집중할 수 있습니다.

2. 컨트롤러 매니저의 핵심 원리: 제어 루프

모든 쿠버네티스 오브젝트는 spec 필드와 status 필드를 가집니다.

  • spec: 사용자가 정의하는 원하는 상태(Desired State)입니다. 예를 들어 "nginx 파드를 3개 실행시켜줘"와 같은 명세입니다.
  • status: 시스템에 의해 관리되는 현재 상태(Current State)입니다. 현재 실제로 실행 중인 nginx 파드가 몇 개인지를 나타냅니다.

컨트롤러의 기본 로직은 매우 간단한 무한 루프로 표현할 수 있습니다.

for {
  desired_state := getDesiredState()
  current_state := getCurrentState()
  if desired_state != current_state {
    makeChanges(desired_state)
  }
}

각 컨트롤러는 자신이 담당하는 리소스를 API 서버를 통해 계속 지켜보다가(watch), spec과 status 사이에 불일치가 발생하면 API 서버에 필요한 변경(파드 생성, 삭제 등)을 요청하여 상태를 일치시킵니다. 이 과정이 바로 제어 루프 또는 조정(Reconciliation)입니다.

Why it matters: '선언적 API'라는 쿠버네티스의 특징이 바로 이 제어 루프 덕분에 가능합니다. 사용자는 '어떻게' 할지를 명령하는 대신 '무엇을 원하는지' 선언하기만 하면, 컨트롤러가 그 상태를 만들기 위한 모든 작업을 자동으로 처리합니다.

3. 주요 내장 컨트롤러 종류와 역할

kube-controller-manager에는 다양한 컨트롤러가 내장되어 있으며, 각기 다른 리소스를 책임집니다. 다음은 가장 핵심적인 컨트롤러들의 역할입니다.

컨트롤러 주요 역할 사용 예시
노드(Node) 컨트롤러 노드의 상태를 주기적으로 확인하고, 응답 없는 노드의 파드를 다른 정상 노드로 옮깁니다. 물리 서버 장애 발생 시 해당 서버에서 실행되던 앱을 자동으로 다른 서버에서 재시작
레플리카셋(ReplicaSet) 컨트롤러 지정된 수의 파드 복제본이 항상 실행되도록 보장합니다. 특정 애플리케이션 파드가 3개로 유지되도록 설정
디플로이먼트(Deployment) 컨트롤러 레플리카셋을 관리하여 애플리케이션의 점진적 업데이트(롤링 업데이트)와 롤백을 처리합니다. 무중단으로 애플리케이션 새 버전 배포
스테이트풀셋(StatefulSet) 컨트롤러 데이터베이스와 같이 상태 유지가 필요한 애플리케이션을 관리하며, 고유한 네트워크 식별자와 안정적인 스토리지를 보장합니다. 순서에 맞게起動되어야 하는 데이터베이스 클러스터 관리
데몬셋(DaemonSet) 컨트롤러 클러스터의 모든 (또는 특정) 노드에 파드 복제본이 하나씩 실행되도록 합니다. 모든 노드에 로그 수집 에이전트나 모니터링 에이전트 배포
잡(Job) 컨트롤러 한 번 실행되고 성공적으로 완료되어야 하는 배치(batch)성 작업을 관리합니다. 데이터 마이그레이션, 임시 분석 작업 실행
서비스(Service) 컨트롤러 type: LoadBalancer 서비스를 생성할 때 클라우드 제공업체의 API와 연동하여 실제 로드 밸런서를 생성하고 설정합니다. 클라우드 환경에서 애플리케이션을 외부에 노출

노드 컨트롤러의 동작 방식

노드 컨트롤러는 클러스터의 안정성을 유지하는 데 매우 중요합니다. 동작 방식은 다음과 같습니다 (기본값 기준).

  1. 상태 확인: 5초마다 각 노드의 상태를 확인합니다.
  2. Unreachable 상태 변경: 노드로부터 40초 동안 응답이 없으면, 해당 노드의 상태를 Unreachable로 변경합니다.
  3. 파드 축출(Eviction): Unreachable 상태가 추가로 5분간 지속되면, 해당 노드에서 실행 중이던 모든 파드를 제거(evict)하기 시작합니다.
  4. 자동 복구: 만약 축출된 파드가 레플리카셋 등에 의해 관리되고 있었다면, 다른 정상 노드에 새로운 파드가 생성되어 서비스가 복구됩니다.

Why it matters: 각 컨트롤러의 역할을 이해하면, 내가 배포하려는 애플리케이션의 특성(상태 유지 여부, 노드 전체 배포 필요성 등)에 가장 적합한 쿠버네티스 오브젝트를 선택하여 효율적으로 관리할 수 있습니다.

4. 클라우드 컨트롤러 매니저(Cloud Controller Manager)

전통적으로 클라우드 플랫폼(AWS, GCP, Azure 등)과 연동하는 로직은 kube-controller-manager에 포함되어 있었습니다. 하지만 이는 쿠버네티스 핵심 코드와 특정 클라우드 제공업체의 코드가 강하게 결합되는 문제를 낳았습니다.

이 문제를 해결하기 위해 클라우드 컨트롤러 매니저(cloud-controller-manager)라는 별도의 컴포넌트가 도입되었습니다. 여기에는 클라우드에 특화된 컨트롤러(예: 로드밸런서를 생성하는 서비스 컨트롤러, 클라우드 라우팅 규칙을 설정하는 라우트 컨트롤러 등)가 포함됩니다. 이를 통해 쿠버네티스 코어는 클라우드 중립성을 유지하고, 각 클라우드 제공업체는 자신들의 플랫폼에 맞는 컨트롤러 매니저를 독립적으로 개발하고 제공할 수 있게 되었습니다.

Why it matters: 클라우드 컨트롤러 매니저의 분리는 쿠버네티스가 특정 클라우드에 종속되지 않고 어떤 환경에서든 일관되게 실행될 수 있도록 하는 중요한 아키텍처적 결정입니다.

결론

쿠버네티스 컨트롤러 매니저는 클러스터가 사용자가 선언한 상태를 유지하도록 끊임없이 노력하는 보이지 않는 자동화 엔진입니다. 제어 루프라는 단순하지만 강력한 패턴을 통해 노드 장애 복구, 애플리케이션 스케일링, 무중단 배포 등 쿠버네티스의 핵심적인 기능들을 구현합니다. 개발자나 운영자는 컨트롤러 매니저와 직접 상호작용할 일은 거의 없지만, 그 동작 원리를 이해하는 것은 쿠버네티스 기반 시스템의 문제를 해결하고 더 안정적으로 운영하는 데 필수적입니다.


References:

  1. kube-controller-manager | Kubernetes | 2025-04-24 | https://kubernetes.io/docs/reference/command-line-tools-reference/kube-controller-manager/
  2. Controllers | Kubernetes | 2024-09-01 | https://kubernetes.io/docs/concepts/architecture/controller/
  3. Cloud Controller Manager | Kubernetes | 2025-02-11 | https://kubernetes.io/docs/concepts/architecture/cloud-controller/
  4. Kubernetes Controller Manager: A Gentle Introduction | Komodor | 2022-08-31 | https://komodor.com/learn/controller-manager/
  5. (TIL) Kube Controller Manager in Kubernetes | 간단한 코딩 공간 | 2025-03-09 | https://simple-coding-place.tistory.com/m/74
  6. [kubernetes] 쿠버네티스의 controller(컨트롤러)란? | 코드몽규의 삽질저장소 | 2022-04-10 | https://codemonkyu.tistory.com/entry/kubernetes
반응형