[k8s] Controller - ReplicationController(RC)

2022. 9. 10. 20:24[ DevOps ]/[ k8s ]

 

이번 포스팅에서는 쿠버네티스의 컨트롤러 중에서 ReplicationController에 대해 다룬다.

 

 

 

ReplicationController

- 요구하는 Pod의 개수를 보장하는 가장 기본적인 컨트롤러 역할을 한다.

- 요구하는 Pod 개수가 부족하면 template을 이용해 Pod를 추가한다.

- 요구하는 Pod 수보다 많으면 최근에 생성된 Pod를 삭제한다.

 

 

ReplicationController의 기본 구성

- selector

- replicas

- template

 

RC Definition 예시

- label은 key:value 형태로 정의된다.

selector에서 정의한 <key>:<value>와 같은 label을 가진 Pod를 replicas 만큼 운영한다.

- 컨트롤러는 현재 운영되고 있는 Pod들을 모니터링하면서 <key>:<value>와 같은 형태로 label을 가지고 있는 컨테이너가 동작중인지를 살펴보고 개수가 많으면 줄이고 적으면 추가로 생성한다. 추가로 생성할 때에는 Template에서 정의한 기준으로 만든다.

- ReplicationController는 'label, selector를 기준으로' 컨테이너들을 스캔하고 replicas 만큼의 개수를 보장해주는 컨트롤러이다. 실행 중인 Pod가 어떤 컨테이너로 실행 중인지는 중요하지 않다. 무조건  selector에서 정의한 label을 기준으로 Pod를 컨트롤한다.

 

 

 

기본 Pod 정의와 ReplicationController 정의 비교

 

기존 Pod 정의에서도 각 Pod 마다 label을 정의할 수 있었다. label은 key:value 형태로 정의된다. 오른쪽 ReplicationController의 정의에서 selector 필드는 app: webui라는 label을 가진 Pod를 3개 보장해달라는 의미이다. 이때 새로 생성할 Pod의 정의는 template에서 한다.

 

label은 app: webui, name: nginx, version: 1.14, type: frontend 등과 같이 해당 Pod를 의미하는 형식으로 나타내는 것이 일반적이다.

 

** 중요 **

Pod template은 반드시 selector에 있는 <key>: <value>를 labels 필드로 포함하고 있어야 한다. 단, template의 labels에 정의된 label 개수는 selector에 정의된 label보다 많아도 상관없다. 단, template에 정의된 label 중 하나는 selector에 포함되어야 한다. rc의 selector는 label들의 AND 조건을 기반으로 연산하기 때문에 2개 이상의 label을 selector에 정의한다면 template의 label에도 이를 모두 포함해야 rc의 스캔 대상이 된다.

 

 


 

실습

- rc-nginx.yaml 파일

apiVersion: v1
kind: ReplicationController
metadata:
  name: rc-nginx
spec:
  replicas: 3
  selector:
    app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14

출처: https://github.com/237summit/Getting-Start-Kubernetes

 

실행

$ kubectl create -f rc-nginx.yaml

 

결과

- 동작중인 rc-nginx pod가 없으므로 replicas 개수에 맞게 총 3개가 새롭게 시작되었음을 확인할 수 있다.

 

 

위와 같이 describe 명령으로 rc에 대한 정보를 확인할 수 있다.

 

replicas 수정 후 결과 확인

만약 위 상황에서 동일한 label을 가진 다른 Pod를 실행시킬 경우 바로 Terminating 된다. 이미 3개의 Pod가 정상적으로 수행되고 있기 때문이다. 

 

replicas 수를 늘리고 싶다면 edit 커맨드를 사용해서 rc 파일을 수정하면 된다. 

 

$ kubectl edit rc rc-nginx

 

 

또는 아래와 같이 scale 커맨드를 사용해서 커맨드로 바로 scale in/out 할 수 있다.

 

$ kubectl scale rc rc-nginx --replicas=2

 

이때 쿠버네티스는 가장 최근에 실행된 pod를 중지한다. scale 커맨드를 사용하면 edit에서 사용했던 파일의 replicas개수가 변경된 걸로 반영되어 있음을 확인할 수 있다.

 

 

컨테이너 변경 후 결과 확인

위와 같이 edit 커맨드로 rc 파일에서 template 필드의 containers 이미지를 기존 nginx:1.14에서 nginx1.15로 변경했지만 아래와 같이 실행 중인 Pod에는 아무런 변화가 없다. (기존 nginx 1.14가 Running 중이다) 즉, rc는 selector만 보고 Pod를 컨트롤한다. (Rolling Update 미지원)

 

 

Pod 삭제 후 결과 확인

아래와 같이 'rc-nginx-w96sw' Pod를 delete 하고 RC에 의해 새로 생성된 Pod(lh6zm)의 이미지 버전을 확인해본 결과 아래와 같이 새로운 컨테이너가 실행되었음을 확인할 수 있다.

 

 

즉, template은 새로운 Pod를 생성할 때 사용되는 필드임을 확인할 수 있다. 이를 활용하면 RC를 기반으로도 Rolling Update를 할 수 있지만 여러 개의 Pod를 한 번에 진행하기에는 어려움이 있을 것이라 생각한다.

 

 

 

 

 

 

Reference

- 따배쿠, https://youtu.be/5X3t6VJH2vQ

- kubernetes docs, https://kubernetes.io/ko/docs/concepts/architecture/controller/

- ReplicationController docs, https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicationcontroller/

- yaml 실습 파일, https://github.com/237summit/Getting-Start-Kubernetes

- 롤링 업데이트 k8s docs, https://kubernetes.io/ko/docs/tutorials/kubernetes-basics/update/update-intro/