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`들만 선택하는 옵션이다.
- In
- In이라는 `operator`는 키와 벨류를 지정할 수 있다. 키를 A라고 설정하고 벨류를 2, 3이라고 설정하면
이 키가 A인 `Pod`들 중에 벨류가 2, 3인 `Pod`만 선택한다.
- In이라는 `operator`는 키와 벨류를 지정할 수 있다. 키를 A라고 설정하고 벨류를 2, 3이라고 설정하면
- NotIn
- NotIn은 말 그대로 In의 반대로 키 A에 벨류값이 2, 3이 아닌 `Pod`가 선택된다.
이렇게 `ReplicaSet`은 다양한 방식으로 `Pod`를 선택할 수 있는 옵션을 제공해준다.
방금 설명한 이 `mathExpressions`는 앞으로도 다른 오브젝트들에서 많이 사용하게 될 것이므로,
잘 알아두는 것이 좋다고 한다.
'Infra > Kubernetes' 카테고리의 다른 글
[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 |
[Kubernetes] Pod - Container, Label, NodeSchedule (0) | 2024.08.12 |