쿠버네티스(Kubernetes)는 컨테이너 오케스트레이션을 위한 강력한 플랫폼이며, 다양한 자동화 기능을 제공하여 클러스터를 효율적으로 운영할 수 있도록 합니다. **컨트롤러(Controller)**는 이러한 자동화 기능을 담당하는 핵심 컴포넌트 중 하나로, 클러스터의 상태를 지속적으로 모니터링하고 사용자가 원하는 상태를 유지하도록 합니다.
이 글에서는 쿠버네티스 컨트롤러의 개념, 주요 역할, 종류, 작동 방식 및 실전 예제까지 다룹니다.
📌 목차
- 쿠버네티스 컨트롤러란?
- 컨트롤러의 주요 역할
- 쿠버네티스 컨트롤러의 종류
- ReplicationController & ReplicaSet
- Deployment
- StatefulSet
- DaemonSet
- Job & CronJob
- Horizontal Pod Autoscaler (HPA)
- 컨트롤러의 작동 방식
- 컨트롤러 사용 예제
- 결론
1. 쿠버네티스 컨트롤러란?
🛠 컨트롤러(Controller)란?
컨트롤러는 쿠버네티스에서 애플리케이션과 인프라의 상태를 지속적으로 감시하고, 정의된 목표 상태(desired state)와 현재 상태(current state)가 일치하도록 자동으로 조정하는 역할을 합니다.
🔥 컨트롤러가 필요한 이유
- 클러스터에서 자동 복구(Self-healing) 기능 제공.
- 필요에 따라 스케일링(Scaling) 수행.
- 네트워크 및 애플리케이션 업데이트 시 무중단 배포(Rolling Update) 지원.
- 주기적인 작업 실행 및 리소스 최적화 가능.
2. 컨트롤러의 주요 역할
쿠버네티스 컨트롤러는 다음과 같은 역할을 수행합니다.
- 애플리케이션 가용성 보장
- 특정 개수의 파드(Pod)가 항상 실행되도록 유지.
- 장애가 발생하면 새로운 파드를 자동으로 생성.
- 자동 복구 (Self-Healing)
- 노드 장애나 네트워크 장애 발생 시, 정상적인 노드에서 새로운 파드를 생성.
- 스케일링 (Scaling)
- 트래픽 증가 시 자동으로 파드 개수를 조정하여 부하를 분산.
- 롤링 업데이트 및 롤백 지원
- 새 버전의 애플리케이션을 배포할 때 무중단으로 업데이트 수행.
- 문제가 발생하면 이전 버전으로 즉시 롤백 가능.
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. 컨트롤러의 작동 방식
- 사용자가 YAML 파일을 통해 원하는 상태(Desired State)를 정의.
- 쿠버네티스 API 서버가 이를
etcd
에 저장. - 컨트롤러가 현재 상태(Current State)와 비교하여 차이를 확인.
- 필요한 경우 자동으로 새로운 파드를 생성하거나 업데이트 진행.
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)
컨트롤러를 제대로 이해하고 활용하면, 클라우드 네이티브 환경에서 더욱 강력한 애플리케이션을 구축할 수 있습니다! 🚀