쿠버네티스 컨트롤러(Kubernetes Controller): 자동화된 클러스터 관리의 핵심

쿠버네티스(Kubernetes)는 컨테이너 오케스트레이션을 위한 강력한 플랫폼이며, 다양한 자동화 기능을 제공하여 클러스터를 효율적으로 운영할 수 있도록 합니다. **컨트롤러(Controller)**는 이러한 자동화 기능을 담당하는 핵심 컴포넌트 중 하나로, 클러스터의 상태를 지속적으로 모니터링하고 사용자가 원하는 상태를 유지하도록 합니다.

이 글에서는 쿠버네티스 컨트롤러의 개념, 주요 역할, 종류, 작동 방식 및 실전 예제까지 다룹니다.


📌 목차

  1. 쿠버네티스 컨트롤러란?
  2. 컨트롤러의 주요 역할
  3. 쿠버네티스 컨트롤러의 종류
    • ReplicationController & ReplicaSet
    • Deployment
    • StatefulSet
    • DaemonSet
    • Job & CronJob
    • Horizontal Pod Autoscaler (HPA)
  4. 컨트롤러의 작동 방식
  5. 컨트롤러 사용 예제
  6. 결론

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

🛠 컨트롤러(Controller)란?

컨트롤러는 쿠버네티스에서 애플리케이션과 인프라의 상태를 지속적으로 감시하고, 정의된 목표 상태(desired state)와 현재 상태(current state)가 일치하도록 자동으로 조정하는 역할을 합니다.

🔥 컨트롤러가 필요한 이유

  • 클러스터에서 자동 복구(Self-healing) 기능 제공.
  • 필요에 따라 스케일링(Scaling) 수행.
  • 네트워크 및 애플리케이션 업데이트 시 무중단 배포(Rolling Update) 지원.
  • 주기적인 작업 실행 및 리소스 최적화 가능.

2. 컨트롤러의 주요 역할

쿠버네티스 컨트롤러는 다음과 같은 역할을 수행합니다.

  1. 애플리케이션 가용성 보장
    • 특정 개수의 파드(Pod)가 항상 실행되도록 유지.
    • 장애가 발생하면 새로운 파드를 자동으로 생성.
  2. 자동 복구 (Self-Healing)
    • 노드 장애나 네트워크 장애 발생 시, 정상적인 노드에서 새로운 파드를 생성.
  3. 스케일링 (Scaling)
    • 트래픽 증가 시 자동으로 파드 개수를 조정하여 부하를 분산.
  4. 롤링 업데이트 및 롤백 지원
    • 새 버전의 애플리케이션을 배포할 때 무중단으로 업데이트 수행.
    • 문제가 발생하면 이전 버전으로 즉시 롤백 가능.

3. 쿠버네티스 컨트롤러의 종류

쿠버네티스에서 제공하는 주요 컨트롤러는 다음과 같습니다.

1) ReplicationController & ReplicaSet

역할: 특정 개수의 동일한 파드를 유지하고 장애 발생 시 자동으로 복구.
ReplicaSet은 ReplicationController의 개선된 버전.

<yaml>

apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-replicaset
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx

2) Deployment (디플로이먼트)

역할: 롤링 업데이트 및 롤백 지원, 안정적인 배포를 위해 사용.
✅ ReplicaSet을 관리하는 상위 컨트롤러.

<yaml>

apiVersion: apps/v1
kind: Deployment
metadata:
name: my-deployment
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx:1.21
<bash>

# 배포 실행
kubectl apply -f my-deployment.yaml

# 롤백 수행
kubectl rollout undo deployment my-deployment

3) StatefulSet

역할: 상태를 유지해야 하는 애플리케이션 (예: 데이터베이스, 메시지 큐) 관리.
✅ Pod에 고유한 ID 및 고정된 네트워크 이름 제공.

<yaml>

apiVersion: apps/v1
kind: StatefulSet
metadata:
name: my-database
spec:
replicas: 3
selector:
matchLabels:
app: database
template:
metadata:
labels:
app: database
spec:
containers:
- name: postgres
image: postgres

4) DaemonSet

역할:노드마다 반드시 하나의 파드가 실행되도록 보장.
✅ 모니터링 에이전트, 로그 수집기 등에 사용.

<yaml>

apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-agent
spec:
selector:
matchLabels:
app: log-agent
template:
metadata:
labels:
app: log-agent
spec:
containers:
- name: fluentd
image: fluentd

5) Job & CronJob

역할: 한 번 실행 후 종료되는 작업 수행 (예: 데이터 백업, 배치 작업).
✅ CronJob은 정해진 일정에 맞춰 Job을 실행.

<yaml>

apiVersion: batch/v1
kind: Job
metadata:
name: backup-job
spec:
template:
spec:
containers:
- name: backup
image: my-backup-image
restartPolicy: Never
<yaml>

apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 3 * * *" # 매일 새벽 3시 실행
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: my-backup-image
restartPolicy: OnFailure

6) Horizontal Pod Autoscaler (HPA)

역할: CPU 및 메모리 사용량을 기준으로 자동으로 파드 개수를 조정.

<bash>

# HPA 생성 (CPU 사용률이 50%를 초과하면 자동 확장)
kubectl autoscale deployment my-deployment --cpu-percent=50 --min=2 --max=10

4. 컨트롤러의 작동 방식

  1. 사용자가 YAML 파일을 통해 원하는 상태(Desired State)를 정의.
  2. 쿠버네티스 API 서버가 이를 etcd에 저장.
  3. 컨트롤러가 현재 상태(Current State)와 비교하여 차이를 확인.
  4. 필요한 경우 자동으로 새로운 파드를 생성하거나 업데이트 진행.

5. 컨트롤러 사용 예제

<bash>

# Deployment 생성
kubectl apply -f my-deployment.yaml

# 컨트롤러 상태 확인
kubectl get deployments

# 스케일링
kubectl scale deployment my-deployment --replicas=5

# HPA 적용
kubectl autoscale deployment my-deployment --cpu-percent=60 --min=2 --max=10

6. 결론

쿠버네티스 컨트롤러는 클러스터 상태를 지속적으로 감시하고 애플리케이션의 안정성을 보장하는 중요한 역할을 합니다.

컨트롤러를 활용하면?

  • 애플리케이션의 자동 복구(Self-healing)
  • 무중단 배포(Rolling Update)롤백(Rollback)
  • 자동 스케일링(Auto-scaling)
  • 작업 자동화(Job, CronJob)

컨트롤러를 제대로 이해하고 활용하면, 클라우드 네이티브 환경에서 더욱 강력한 애플리케이션을 구축할 수 있습니다! 🚀