컨트롤러
쿠버네티스에서 리소스를 관리하는 객체로, 시스템의 현재 상태(actual state)와 원하는 상태(desired state)를 지속적으로 비교하여 차이를 자동으로 수정하는 역할을 수행

- 컨트롤러는 특정 리소스의 상태를 확인하고, 쿠버네티스 API와 상호작용하여 시스템을 원하는 상태로 유지
- 컨트롤러는 레이블 셀렉터를 통해 자신이 관리하는 리소스를 식별
컨트롤러의 필요성
- Pod는 일회성의 생애 주기를 가짐으로, 유실 시 자동으로 복구되지 않음
- 따라서 컨트롤러를 통해 Pod의 복제본 수 유지, 스케일링, Pod 유실 시 복구 등과 관리 작업을 자동으로 수행해야함
주요 컨트롤러
- Deployment: Pod의 복제본 수를 관리하고, Pod를 최신 상태로 유지
- ReplicaSet: 지정된 수의 Pod를 항상 실행되도록 관리
- StatefulSet: Pod가 고유한 네트워크 ID와 영속적 저장소를 가지도록 보장
- DaemonSet: 각 노드에서 하나의 Pod가 실행되도록 보장
- Job: 단발성 작업(One-time task)을 처리, 작업이 완료되면 종료
- CronJob: Job을 정기적으로 실행하도록 스케줄링
Deployment
Pod와 ReplicaSet을 관리하는 컨트롤러 리소스
주요 기능
- 파드 유실 시 복구: Pod가 유실되면, 자동으로 복구
- Pod 복제본 수 유지: ReplicaSet를 통해 Pod를 설정된 복제본 수로 유지
- Pod 스케일링: 복제본 수를 조정하면, 자동으로 Pod의 수가 변경됨
- 롤링 업데이트 및 롤백: Pod 버전을 자동으로 업데이트하거나, 문제가 발생하면 이전 버전으로 롤백

Deployment 매니페스트
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-deployment
labels:
app: my-app
spec:
replicas: 3
selector:
matchLabels:
app: my-app
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: app-container
image: my-app-image:1.0.0
ports:
- containerPort: 80
- apiVersion: 리소스를 정의하는 쿠버네티스 API 버전
- kind: 생성하려는 쿠버네티스 객체의 유형, Pod 객체를 지정
- metadata: Pod의 메타데이터 정보
- name: Pod의 이름으로 클러스터 내에서 고유해야함
- labels: 리소스를 식별하는 데 사용하는 키-값 쌍
- spec: Pod의 동작을 정의
- containers: Pod에 포함될 컨테이너를 정의
- name: 컨테이너의 이름, Pod 내에서 고유해야함
- image: 컨테이너에서 사용할 이미지
- resources: 컨테이너의 리소스 사용량 설정
- limits: 컨테이너가 사용할 수 있는 최대 리소스
- memory: 컨테이너가 사용할 수 있는 최대 메모리 크기
- cpu: 컨테이너가 사용할 수 있는 최대 CPU 자원
- limits: 컨테이너가 사용할 수 있는 최대 리소스
- ports: 컨테이너가 사용하는 네트워크 포트
- containerPort: 컨테이너 내부에서 노출될 포트를 지정
- containers: Pod에 포함될 컨테이너를 정의
매니페스트 파일로 Deployment 생성하기
nginx Pod를 관리하는 Deployment 생성
- 복제본 수는 3개로 지정
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.14.2
ports:
- containerPort: 80
매니페스트 파일을 지정하고 적용하기
$ kubectl apply -f nginx-deployment.yaml
다음과 같이 nginx Pod가 복제본 수 만큼 생성됨
- Deployment가 생성한 Pod의 이름은 컨트롤러 객체 이름 뒤에 무작위 문자열을 덧붙이는 형태
$ kubectl get deploy
$ kubectl get replicaset
$ kubectl get pod

임의로 Pod를 삭제해도 다시 3개로 복구됨
$ kubectl delete pod nginx-deployment-d556bf558-k76jj
$ kubectl get pod

생성된 Pod를 자세히 확인해보면, 라벨을 가지고 있으며 해당 라벨 셀렉터를 가진 Replicaset에 의해 관리됨
$ kubectl describe pod nginx-deployment-d556bf558-tgrfs

Replicaset은 Deployement에 의해 관리되는 것을 확인할 수 있음
$ kubectl describe replicaset nginx-deployment-d556bf558

rollout
현재 리비전이 하나 밖에 없으며, 새로운 버전이 배포된 적이 없음
$ kubectl rollout history deployment nginx-deployment

yaml 파일에서 nginx 이미지를 버전 업 하고, 새로운 버전을 배포하기 위한 전략을 설정
- annotations을 통해 업데이트 사항 기록하는 것이 좋음
- strategy에서 배포 전략을 RollingUpdate로 설정
- nginx 이미지 버전을 1.27.3로 변경하기
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
annotations:
kubernetes.io/change-cause: "image updated to 1.27.3"
spec:
replicas: 3
strategy:
type: RollingUpdate # 롤링 업데이트 방식
rollingUpdate:
maxSurge: 1 # 한 번에 교체할 수 있는 파드 수
maxUnavailable: 1 # 동시에 종료할 수 있는 파드 수
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.27.3
ports:
- containerPort: 80
매니페스트 파일 적용하고, rollout history 확인해보면 새로운 리비전으로 변경됨
$ kubectl apply -f nginx-deployment.yaml
$ kubectl rollout history deployment nginx-deployment

새롭게 배포된 Replicaset의 id와 pod의 id가 일치하는 것을 확인할 수 있음

rollback
현재 리비전 확인
$ kubectl rollout history deployment nginx-deployment

rollout undo 명령을 통해 nginx-deployment를 이전 리비전으로 rollback
- rollout history 확인해보면, 이전 리비전으로 변경됨
$ kubectl rollout undo deployment nginx-deployment
$ kubectl rollout history deployment nginx-deployment

이전 배포 버전으로 Replicaset이 변경되었으며, Replicaset id와 pod의 id도 마찬가지로 이전 버전으로 변경
$ kubectl get rs
$ kubectl get pod

Pod 하나를 자세히 확인해보면, nginx 이미지 버전이 1.27.3에서 1.14.2으로 변경됨
$ kubectl describe pod nginx-deployment-d556bf558-lkqqs

참고:
'DevOps > Kubernetes' 카테고리의 다른 글
[k8s] ConfigMap & Secret (0) | 2025.01.09 |
---|---|
[k8s] Service (0) | 2025.01.09 |
[k8s] Pod (0) | 2025.01.09 |
[k8s] minikube 설치 & kubectl 사용하기 (1) | 2025.01.09 |
[k8s] Kubernetes 개념 및 구성요소 (0) | 2024.10.21 |