Kubernetes는 현대 클라우드 네이티브 환경에서 컨테이너화된 애플리케이션을 관리하기 위한 오픈소스 플랫폼입니다. Kubernetes의 내부 동작 원리와 그 아키텍처, 특히 컨트롤러의 역할을 이해하는 것은 DevOps 엔지니어에게 필수적입니다. 이번 글에서는 Kubernetes의 기본 아키텍처와 컨트롤러의 동작 원리를 깊이 있게 살펴보겠습니다.

Kubernetes 아키텍처

Kubernetes는 크게 두 가지 주요 구성 요소로 나눌 수 있습니다: 마스터 노드와 워커 노드.

  • 마스터 노드: 클러스터의 제어 평면(control plane)을 담당합니다. API 서버, 스케줄러, 컨트롤러 매니저 및 etcd로 구성되어 있으며, 이들을 통해 클러스터 상태를 관리합니다.
  • 워커 노드: 실제 애플리케이션이 실행되는 곳입니다. 각 워커 노드는 Kubelet, Kube-Proxy, 그리고 Container Runtime(예: Docker)으로 구성됩니다.

이 두 노드 간의 상호작용을 통해 Kubernetes는 애플리케이션의 배포, 확장 및 관리를 자동화합니다.

컨트롤러의 역할

Kubernetes에서 컨트롤러는 클러스터 상태를 유지하는 중요한 역할을 합니다. 컨트롤러는 원하는 상태(desired state)와 현재 상태(current state)를 비교하여, 필요한 경우 현재 상태를 원하는 상태로 변경하는 작업을 수행합니다.

주요 컨트롤러 유형

  1. Replication Controller: 같은 포드를 여러 개 복제하여 가용성을 높입니다. 만약 어떤 포드가 실패하면, Replication Controller는 새로운 포드를 생성하여 최소 복제 수를 유지합니다.
  2. Deployment Controller: 애플리케이션의 배포를 관리합니다. 롤링 업데이트와 롤백 기능을 제공하여 안정적인 배포를 지원합니다.
  3. DaemonSet Controller: 모든 노드에 특정 포드를 배포할 수 있도록 해줍니다. 예를 들어, 로그 수집기와 같은 애플리케이션에 유용합니다.
  4. Job Controller: 일회성 작업을 수행하는 포드를 관리합니다. 작업이 완료되면 포드는 종료됩니다.
  5. StatefulSet Controller: 상태를 유지해야 하는 애플리케이션을 위해 설계되었습니다. 데이터베이스와 같은 상태 저장 애플리케이션에 적합합니다.
  6. 컨트롤러 동작 원리

    컨트롤러는 클러스터의 상태를 지속적으로 모니터링합니다. 이를 통해 현재 상태를 확인하고, 실제 상태가 원하는 상태와 다른 경우 적절한 조치를 취합니다. 예를 들어, Deployment Controller를 사용하여 애플리케이션을 배포한다고 가정해 보겠습니다.

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: example-deployment
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: example
      template:
        metadata:
          labels:
            app: example
        spec:
          containers:
          - name: example-container
            image: example-image:latest

    위의 YAML 파일은 3개의 복제 포드를 생성하는 Deployment 리소스를 정의합니다. Deployment Controller는 이 정의를 기반으로 포드가 생성되도록 합니다. 만약 하나의 포드가 실패한다면, Controller는 자동으로 새로운 포드를 생성하여 3개의 복제 수를 유지합니다.

    컨트롤러의 실행 흐름

    Kubernetes의 컨트롤러는 이벤트 기반으로 작동합니다. Kubernetes API 서버는 클러스터의 상태 변경을 감지하고 해당 이벤트를 컨트롤러에 전달합니다. 컨트롤러는 이 이벤트를 처리하고 필요한 작업을 수행합니다.

  7. 이벤트 감지: API 서버에서 리소스의 상태 변화(예: 포드 생성, 삭제 등)를 감지합니다.
  8. 비교: 컨트롤러는 현재 상태와 원하는 상태를 비교합니다.
  9. 조치: 두 상태가 불일치할 경우, 컨트롤러는 조치를 취합니다(예: 포드 생성, 삭제 등).

이러한 흐름은 Kubernetes의 비동기적인 특성을 활용하여, 클러스터의 효율성과 안정성을 높이는 데 기여합니다.

마무리

Kubernetes의 내부 동작 원리와 컨트롤러 아키텍처를 이해하는 것은 클라우드 네이티브 애플리케이션을 효과적으로 운영하는 데 중요한 요소입니다. 각 컨트롤러가 수행하는 역할과 그 동작 원리를 이해함으로써, DevOps 엔지니어는 클러스터 관리를 보다 효율적으로 수행할 수 있습니다. 이러한 지식을 바탕으로 Kubernetes를 활용한 다양한 시나리오를 구성하고, 최적의 애플리케이션 배포 및 관리를 실현할 수 있기를 바랍니다.