서론
쿠버네티스 시스템 내 여러 구성 요소의 상태를 지속적으로 감시하며, 전체 시스템이 원하는 상태로 동작하도록 유지하는 프로세스이다.
Kubernetes 안에는 Node Controller, Replication Controller 이 외에도 다양한 컨트롤러가 존재하며 deployment, service, namespace, PV 등 모든 개념들은 전부 컨트롤러에 의해 동작한다.
이 컨트롤러들은 모두 Kubernetes Controller Manager라는 하나의 프로세스에 포함되어 있다.
따라서 Kubernetes Controller Manager를 설치하면, 여러 컨트롤러도 함께 설치된다.
이 장에서는 Kube Controller Manager가 무었인지 그리고 이에 속해있는 Node Controller와 Replication 컨트롤러에 대해 알아본다.

Node Controller
- Kube API server를 통해 노드 상태를 감시하고, 애플리케이션이 계속 실행되도록 필요한 조치를 취한다.
동작방식
- Node Controller는 노드 상태를 5초마다 검사한다.
- Node Controller가 노드의 건강 상태를 지속적으로 확인할 수 있다.
- 만약 노드로부터 heartbeat 신호를 받지 못하면, 40초 동안 기다린 후 해당 노드는 unreachable(도달 불가) 상태로 표시된다.
- 노드가 unreachable로 표시된 후에는 다시 살아나기를 5분간 기다린다.
- 5분이 지나도 노드가 복구되지 않으면, 해당 노드에 할당된 파드들을 삭제하고, ReplicaSet에 속한 파드라면 건강한 노드에 다시 생성한다.
Replication Controller
- 이 컨트롤러는 ReplicaSet의 상태를 감시하고, 지정된 개수의 파드가 항상 유지되도록 한다.
- 만약 파드가 죽으면, 새로운 파드를 생성한다.
Controller Manager
- kubeadm으로 쿠버네티스를 구축했다면 kube-system 네임스페이스의 kube controller manager를 마스터 노드에 파드 형태로 배포한다.
- 그리고 이 파드에 대한 설정은
/etc/kubernetes/manifests/kube-controller-manager.yaml파일을 통해 확인 할 수 있다. - 여기에는 node-monitor-grace-period, node-eviction-timeout 외의 다양한 컨트롤러의 활성화 여부등에 대한 옵션들이 존재한다(기본적으로 모든 컨트롤러는 실행되도록 설치된다).
- 따라서 어떤 컨트롤러가 동작하지 않거나 문제가 발생한 경우 이 파일을 확인하면 된다.
Replication Controller vs Replica Set

- Replica(레플리카): 애플리케이션의 실행 인스턴스, 즉 파드의 복제본이다.
- Replicaset & RC(Replication Controller): 지정된 수의 파드(레플리카)를 항상 유지함
- 예: 3개로 설정하면 하나가 죽어도 다시 1개를 자동 생성해서 항상 3개 유지
- 단일 파드만 필요할 경우에도 유용
- 파드가 죽으면 자동으로 새 파드 생성
- 다수의 노드에 걸쳐 파드를 배포하여 고가용성과 부하 분산 지원
Replication controller
- spec: 생성할 객체 내부 구성을 정의한다.
- template: 컨트롤러가 생성할 파드가 어떤 파드인지 정의해야 함으로 파드 템플릿을 작성한다.
- 기존 Pod Definition에서 apiVersion과 kind 두 줄만 제외하고 가져온다
# pod-definintion.yaml apiVersion: v1 kind: Pod metadata: name: myapp-pod labels: app: myapp type: front-end spec: containers: - name: nginx-container image: nginx
- 기존 Pod Definition에서 apiVersion과 kind 두 줄만 제외하고 가져온다
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp-rc
labels:
app: myapp
type: front-end
spec:
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx

- replicaset: 파드(레블리카셋) 갯수를 설정해줘야한다.
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp-rc
labels:
app: myapp
type: front-end
spec:
replicas: 3
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end
spec:
containers:
- name: nginx-container
image: nginx
ReplicaSet
Replication Controller와 작성방법은 동일하돼, Selector 라는 개념이 포함된다.
생성 당시 존재하던 파드도 관리 대상에 포함시킬 수 있는 것에 차이가 있다.
예를들어 미리 만들어둔 파드가 selector의 라벨과 일치하면 레블리카셋이 그 파드도 포함해 수를 계산한다.
| 항목 | ReplicationController | ReplicaSet |
| apiVersion | v1 | apps/v1 |
| selector 명시 | 생략 가능 (template하위에 정의된 파드의 label 속성으로 간주) | 반드시 명시해야 함(특정 Pod의 label) |
| 기존 파드 인식 | X (직접 생성한 파드만 관리) | O (selector로 기존 파드도 관리 가능) |
| Deployment와 통합 | 사용 불가 | Deployment의 기반 리소스 |
- Replication Controller(Selector를 적용하지 않아도 된다)
apiVersion: v1
kind: ReplicationController
metadata:
name: myapp-rc
spec:
replicas: 3
template:
metadata:
labels:
app: myapp # ⬅️ 이게 자동 selector 기준이 됨
spec:
containers:
- name: myapp-container
image: nginx
- ReplicaSet(Selector를 적용해줘야 한다)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: myapp-replicaset
labels:
app: myapp
type: front-end
spec:
replicas: 3
selector:
matchLabels:
type: front-end
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end # ⬅️ 이걸 직접 명시해야함
spec:
containers:
- name: nginx-container
image: nginx
Deployment

ReplicaSet
- Deployment는 Replicaset상위 레벨의 Kubernetes 객체로, ReplicaSet을 자동으로 관리한다
- Deployment는 직접적으로 파드를 생성하지 않고, 내부적으로 ReplicaSet을 생성하여 파드를 관리한다.
- 사용자가
kubectl create -f deployment.yaml명령으로 Deployment를 생성하면, Kubernetes가 자동으로 ReplicaSet을 생성하고, 그 ReplicaSet이 다시 파드들을 생성한다. - 즉, Deployment > ReplicaSet > Pod 구조이다
Deployment Yaml
- ReplicaSet과 매우 유사, kind만 다름
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp-replicaset
labels:
app: myapp
type: front-end
spec:
replicas: 3
selector:
matchLabels:
type: front-end # ⬅️ 여기에 명시
template:
metadata:
name: myapp-pod
labels:
app: myapp
type: front-end # ⬅️ 이걸 직접 위에 명시해야함
spec:
containers:
- name: nginx-container
image: nginx
- Deployment 수정명령어
kubectl edit deployment my-deployment
Comment