쿠버네티스의 주요 컨트롤러들을 회사의 부서와 관리 체계로 비유하여 쉽게 설명드리겠습니다. 각 컨트롤러가 회사에서 어떤 역할을 맡고 있는지 이해하기 쉽도록 ReplicaSet과 같은 방식으로 설명해볼게요.
비유: 초기 인원 유지 관리팀
ReplicationController는 초기의 인원 유지 관리팀입니다. ReplicaSet과 마찬가지로 회사에서 정해진 수의 인원을 유지하게 합니다. 만약 팀원(파드)이 부족하면 새로 채용하고, 팀원이 많으면 그 수를 줄입니다.
역할:
YAML 예시:
apiVersion: v1
kind: ReplicationController
metadata:
name: frontend
spec:
replicas: 3 # 3개의 파드를 유지
selector:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-server
image: nginx:1.17
ports:
- containerPort: 80
비유: 인원 유지 관리팀
ReplicaSet은 회사에서 특정 팀(파드)에 항상 정해진 수의 직원을 유지하게 하는 관리팀입니다. 인원이 부족해지면 새로운 직원을 채용하고, 인원이 너무 많으면 불필요한 인원을 정리합니다.
역할:
YAML 예시:
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
spec:
replicas: 3 # 3개의 파드 유지
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-server
image: nginx:1.17
ports:
- containerPort: 80
ReplicationController는 ReplicaSet의 이전 버전이라고 보시면 됩니다. 기능적으로는 매우 비슷하지만, 기술적으로는 ReplicaSet이 더 발전된 버전입니다. 여전히 몇몇 환경에서는 ReplicationController를 사용하는 경우도 있으므로, 함께 알아두면 좋습니다.
ReplicationController는 오래된 방식이기 때문에 현재는 대부분 ReplicaSet이 그 자리를 대체하고 있지만, 기존 클러스터에서는 여전히 ReplicationController가 사용되기도 합니다.
Deployment는 ReplicaSet을 생성하고 관리하는 상위 리소스입니다. Deployment는 파드의 생성, 업데이트, 삭제를 더 유연하게 관리할 수 있도록 설계되었으며, 주로 롤링 업데이트(Rolling Update)와 롤백(Rollback) 기능을 제공합니다.
Deployment가 관리하는 역할:
YAML 예시:
apiVersion: apps/v1
kind: Deployment
metadata:
name: frontend-deployment
spec:
replicas: 3 # 파드 수를 설정
selector:
matchLabels:
app: web
template:
metadata:
labels:
app: web
spec:
containers:
- name: web-server
image: nginx:1.17
strategy:
type: RollingUpdate # 롤링 업데이트 전략
rollingUpdate:
maxSurge: 1
maxUnavailable: 1
Deployment는 ReplicaSet을 관리하는 컨트롤러입니다. 즉, Deployment는 직접 파드를 관리하지 않고, ReplicaSet을 통해 간접적으로 파드를 관리합니다. Deployment는 다음과 같은 방식으로 동작합니다:
Deployment가 ReplicaSet을 생성:
롤링 업데이트 시 새로운 ReplicaSet 생성:
여러 ReplicaSet을 관리:
롤백 기능:
즉, ReplicaSet은 파드의 개수를 유지하는 역할을 맡고 있으며, Deployment는 ReplicaSet을 관리하면서 배포, 업데이트, 롤백 같은 고급 기능을 수행합니다. 또한 Deployment는 새로운 ReplicaSet을 생성하면서 애플리케이션을 업데이트하고, 필요에 따라 롤백하여 안정적으로 애플리케이션을 운영할 수 있게 합니다.
이렇게 Deployment와 ReplicaSet은 밀접한 관계를 가지며, ReplicaSet이 파드를 직접 관리하는 반면, Deployment는 그 위에서 배포와 버전 관리 등 더 넓은 범위의 작업을 수행합니다.
이 관계를 단계별로 보면:
비유: 데이터베이스 및 고유 식별 관리팀
StatefulSet은 특정한 순서와 고유한 식별자가 중요한 부서를 관리합니다. 마치 데이터베이스와 같이 특별한 번호가 붙은 서버들이 필요할 때, 이 팀은 각 서버가 순서대로 배치되며 고유한 아이디를 가지고 관리되도록 합니다.
역할:
YAML 예시:
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: db-statefulset
spec:
serviceName: "db"
replicas: 3
selector:
matchLabels:
app: database
template:
metadata:
labels:
app: database
spec:
containers:
- name: mysql
image: mysql:5.7
volumeMounts:
- name: mysql-persistent-storage
mountPath: /var/lib/mysql
volumeClaimTemplates:
- metadata:
name: mysql-persistent-storage
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
비유: 회사의 모든 부서에 필수 서비스를 배포하는 팀
DaemonSet은 회사의 모든 부서에 필수적인 소프트웨어를 설치하는 역할을 합니다. 예를 들어, 보안 소프트웨어나 모니터링 도구가 모든 서버(노드)에 설치되도록 보장합니다.
역할:
YAML 예시:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: log-daemon
spec:
selector:
matchLabels:
name: log-agent
template:
metadata:
labels:
name: log-agent
spec:
containers:
- name: log-agent
image: fluentd:latest
비유: 단기 프로젝트 팀
Job은 회사에서 단기적으로 일회성 작업을 처리하기 위해 운영되는 프로젝트 팀과 같습니다. 특정 작업을 완료한 후 종료되며, 다시 시작할 필요가 없습니다.
역할:
YAML 예시:
apiVersion: batch/v1
kind: Job
metadata:
name: backup-job
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:latest
command: ["backup", "/data"]
restartPolicy: OnFailure
비유: 회사의 정기적인 업무를 관리하는 팀
CronJob은 매일 일정한 시간에 해야 하는 정기적인 업무를 관리합니다. 예를 들어, 매일 밤에 백업 작업을 하거나, 주기적으로 보고서를 생성하는 업무를 처리합니다.
역할:
YAML 예시:
apiVersion: batch/v1
kind: CronJob
metadata:
name: nightly-backup
spec:
schedule: "0 2 * * *" # 매일 새벽 2시에 실행
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: backup-tool:latest
command: ["backup", "/data"]
restartPolicy: OnFailure
쿠버네티스의 다양한 컨트롤러는 마치 회사에서 다양한 부서와 관리 팀이 제각기 역할을 하듯이 각기 다른 목적을 위해 존재합니다.
이렇게 각 컨트롤러가 특정 목적에 맞춰 서버와 파드를 관리함으로써, 회사와 같은 복잡한 시스템이 원활하게 돌아가게 됩니다.