본문 바로가기
Infra/Kubernetes

[Kubernets] Replication Controller, ReplicaSet - Template, Replicas, Selector

by 진꿈청 2024. 9. 5.

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`를 새로 만들어준다.

 

이때, 이러한 특성을 사용해서 앱에 대한 업그레이드가 가능하다.

 

  1. `Template`에 v2에 관한 `Pod`를 업데이트를 한 뒤 기존에 연결되어 있는 `Pod`를 다운시킨다.
  2. `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`만 선택한다.
  • NotIn
    • NotIn은 말 그대로 In의 반대로 키 A에 벨류값이 2, 3이 아닌 `Pod`가 선택된다.

 

이렇게 `ReplicaSet`은 다양한 방식으로 `Pod`를 선택할 수 있는 옵션을 제공해준다.

 

방금 설명한 이 `mathExpressions`는 앞으로도 다른 오브젝트들에서 많이 사용하게 될 것이므로,

잘 알아두는 것이 좋다고 한다.