Kubernetes

이번 포스팅에서는 컨트롤러에 대해 알아볼 것이다.
Kubernetes
의 컨트롤러는 여러 기능을 통해 서비스를 관리하고 운영하는데 큰 도움을 준다.

Auto Healing
노드 위에Pod
가 있는데 해당Pod
가 갑자기 다운되던가 아니면 해당Pod
가 스케줄링 되어있는 노드가 다운되면
해당Pod
에서 돌아가던 서비스에 장애가 온 것이다.
이때,Controller
는 이걸 즉각적으로 인지하고Pod
를 다른 노드에 새로 만들어준다.
이걸Auto Healing
기능이라고 한다.
Auto Scaling
Pod
의 리소스가 리미트 상태가 됐을 때Controller
는 이 상태를 파악하고Pod
를 하나 더 만들어준다.
즉, 부하가 분산되며Pod
가 죽지 않도록 해줘서 해당 서비스가 성능에 대한 장애 없이 안정적으로 운영된다.
Software Update
여러Pod
에 대한 버전을 업그레이드 해야 될 경우Controller
를 통해 한번에 쉽게 할 수 있다.
또한, 업그레이드 도중에 문제가 생기면 롤백을 할 수 있는 기능도 제공한다.
Job
일시적인 작업을 해야 될 경우Controller
가 필요한 순간에만Pod
를 만들어서 해당 작업을 이행하고 삭제한다.
이렇게 되면 그 순간에만 자원이 사용되며 작업 후 다시 반환 되기에 효율적인 자원 활용이 가능해진다.
Kubernetes
의 여러 오브젝트들이 위의 컨트롤러의 역할을 지원을 해준다.
Replication Controller, ReplicaSet
설명하기에 앞서 Replication Controller
는 현재 Deprecated
된 오브젝트이다.
따라서, 이걸 대체로 사용하는게 ReplicaSet
이다.

Template
과 Replicas
의 기능은 Replication Controller
와 ReplicaSet
오브젝트의 공통된 기능이다.
그리고 Selector
에 관해서는 Replication Controller
에는 없고 ReplicaSet
에만 좀 더 확장된 기능이다.
Replication Controller
를 아직 사용중이라면 그걸 ReplicaSet
으로 업데이트 하는 것은 실습 때 좀 더 알아보도록 하자.
Template 기능
Template
기능을 설명하기에 앞서 Controller
와 Pod
는 서비스와 Pod
처럼 라벨과 셀렉터로 연결이 된다.
그래서, 위의 그림처럼 라벨이 붙어있는 Pod
가 있고 여기에 셀렉터가 매핑되는 Controller
를 만들면 연결이 된다.
그리고 Controller
를 만들 때 Template
으로 Pod
의 내용을 넣게 되면 Controller
는 파드가 죽으면 재생성 한다고 언급했다.
그래서, Pod - type: web
가 다운되면 Controller
안에 있는 Template
으로 Pod
를 새로 만들어준다.
이때, 이러한 특성을 사용해서 앱에 대한 업그레이드가 가능하다.
Template
에 v2에 관한Pod
를 업데이트를 한 뒤 기존에 연결되어 있는Pod
를 다운시킨다.Controller
는 해당Template
을 가지고Pod
를 재생성하기에 새로 업그레이드된Pod
가 만들어지며
버전 업그레이드를 수동으로 할 수 있게 된다.
YAML 내용과 함께 살펴보자.
Pod
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
type: web
spec:
contianers:
- name: container
image:
tmkube/app:v1
우선, Pod
에 라벨이 달려져 있다.
Replication Controller
apiVersion: v1
kind: ReplicationController
metadata:
name: replication-1
spec:
replicas: 1
selector:
type: web
template:
metadata:
name: pod-1
labels:
type: web
spec:
containers:
- name: contianer
image: tmkube/app:v2
그리고 Replication Controller
를 만들 때 위처럼 셀렉터로 연결을 하면 연결이 된다.
이대 Template
으로 Pod
의 내용이 들어가는데 여기도 마찬가지로, 라벨을 지정을 해줘야
새로 만들어졌을 때 Controller
와 연결이 된다.
Replicas 기능
Replicas
는 기능 자체는 간단하다.
Replicas
만큼 Pod
의 개수가 관리가 된다.
만약, Replicas
를 1로 지정하면 Pod
삭제시 하나의 Pod
만 재생성을 해준다.
그런데 만약, 해당 값을 3으로 늘리게 되면 그 수만큼 Pod
가 늘어나면서 Scale Out
이 된다.
마찬가지로, Pod
들을 모두 삭제하면 Controller
는 레플리카 개수만큼
3개의 Pod
를 다시 만들어준다.
apiVersion: v1
kind: ReplicationController
metadata:
name: replication-1
spec:
replicas: 1 -> 3
selector:
type: web
template:
metadata:
name: pod-1
labels:
type: web
spec:
containers:
- name: contianer
image: tmkube/app:v2
YAML 내용을 보면 replicas
의 개수를 늘려주면 Scale-Out
이 되는거고 반대로 수치를 내리면 Scale-In
이 되는 것이다.
위에서 설명한 Template
기능과 Replicas
기능을 사용하면
Pod
와 Controller
를 따로 만들지 않고 한번에 만드는 것이 가능하다.
apiVersion: v1
kind: ReplicationController
metadata:
name: replication-1
spec:
replicas: 2
selector:
type: web
template:
metadata:
name: pod-1
labels:
type: web
spec:
containers:
- name: contianer
image: tmkube/app:v2
이유는 당연하게도 해당 Controller
는 Replicas
가 2라고 되어있는데 현재 연결되어 있는 Pod
가 없으므로
Template
에 있는 Pod
의 내용을 가지고 2개의 Pod
를 자동으로 생성하기 때문이다.
Selector 기능
다음으로는 Selector
기능에 관한 설명이다.
Selector
는 ReplicaSet
에만 있는 기능이다.
먼저 Replication Controller
의 셀렉터는 키와 라벨이 같은 Pod
들과 연결을 해준다.
만약, 키와 밸류 중에 하나라도 다르면 연결을 하지 않는다.
반면 ReplicaSet
에는 셀렉터에 두 가지 추가적인 속성이 존재한다.

하나는 matchLabels
라고 해서 Replication Controller
와 같이 키와 벨류가 모두 같아야 연결을 해주는 기능이 있다.
다른 하나는 matchExpressions
라는 속성이다. 이건 키와 밸류를 좀 더 디테일 하게 컨트롤하는 것이 가능하다.
예를 들어 key: ver
이라고 넣고 operator: Exists
라고 넣게 되면 벨류는 다르지만,
해당 라벨의 키가 ver
인 모든 Pod
를 선택하게 된다.
YAML 내용을 살펴보자.
apiVersion: v1
kind: ReplicaSet
metadata:
name: replica-1
spec:
replicas: 3
selector:
matchLabels:
type: web
matchExpressions:
- {key: ver, operator: Exists}
template:
metadata:
name: pod-1
...
selector
에 바로 키-벨류가 들어가지 않고 matchLabels
와 matchExpressions
가 들어간다.
matchLabels
에는 키-벨류가 들어가 있고 matchExpressions
에는 상세한 설정이 들어간다.
그리고 operator
에는 Exists
말고 몇 가지 더 옵션이 더 존재한다.

- Exists
- 내가 키를 정하고 그에 맞는 키의 값을 가지고 있는 파드들을 연결한다.
- DoesNotExist
- 키를 똑같이 A라고 설정을 했을 때 키 값이 A가 아닌 다른
Pod
들만 선택하는 옵션이다.
- 키를 똑같이 A라고 설정을 했을 때 키 값이 A가 아닌 다른
- In
- In이라는
operator
는 키와 벨류를 지정할 수 있다. 키를 A라고 설정하고 벨류를 2, 3이라고 설정하면
이 키가 A인Pod
들 중에 벨류가 2, 3인Pod
만 선택한다.
- In이라는
- NotIn
- NotIn은 말 그대로 In의 반대로 키 A에 벨류값이 2, 3이 아닌
Pod
가 선택된다.
- NotIn은 말 그대로 In의 반대로 키 A에 벨류값이 2, 3이 아닌
이렇게 ReplicaSet
은 다양한 방식으로 Pod
를 선택할 수 있는 옵션을 제공해준다.
방금 설명한 이 mathExpressions
는 앞으로도 다른 오브젝트들에서 많이 사용하게 될 것이므로,
잘 알아두는 것이 좋다고 한다.
'Infra > Kubernetes' 카테고리의 다른 글
[Kubernetes] Pod - LifeCycle (0) | 2025.03.07 |
---|---|
[Kubernetes] Namespace, ResourceQuota, LimitRange (0) | 2024.09.04 |
[Kubernetes] ConfigMap, Secret - Env, Mount (0) | 2024.09.02 |
[Kubernetes] Volume - emptyDir, hostPath, PV/PVC (0) | 2024.08.28 |
[Kubernetes] Service - ClusterIP, NodePort, LoadBalancer (0) | 2024.08.27 |