개발 이야기/쿠버네티스

쿠버네티스 - 레플리케이션컨트롤러 - 17

석구석구 2021. 9. 22. 23:54
레플리케이션컨트롤러의 역할은 실행중인 파드의 수를 레이블 셀렉터와 일치시키는 것이다.

 

쿠버네티스는 애플리케이션의 실행을 보장한다. 이런 기능을 담당하는 리소스가 레플리케이션 컨트롤러다. 노드가 다운되는 등, 특정 이유로 인해 파드가 사라진 경우 파드를 재실행한다. 반대로 너무 많은 파드가 실행된 경우 제거한다. 말 그대로 복제본(레플리카)을 컨트롤 한다. 이러한 조정 절차는 다음과 같다.

 

  1. 레이블 셀렉터와 매칭되는 파드를 찾는다.
  2. 매칭 된 파드의 수와, 설정된 수를 비교한다.
  3. 많다면 파드를 삭제하고, 부족하다면 현재 템플릿에서 파드를 추가 생성한다.

레플리케이션 컨트롤러는 세 가지 중요 요소를 가지고 있다.

 

  1. 레이블 셀렉터(label selector)는 레플리케이션컨트롤러의 파드의 매칭 범위를 결정한다.
  2. 레플리카 수(replica count)로 파드의 실행 수를 지정한다.
  3. 파드 템플릿(pod template)은 새로운 파드를 만들 때 사용된다.

* 1번 레이블 셀렉터와 2번 파드 템플릿을 수정하더라도 기존 파드에는 영향을 미치지 않는다.

 

레플리케이션 컨트롤러를 이용함으로서 얻는 이점은 

  1. 파드가 항상 실행되도록 한다.
  2. 노드에 장애가 발생하면 모든 파드에 관한 복제본이 생성된다.
  3. 수동/자동으로 수평 확장이 쉽다.

백문이 불여일행이다. 한번 레플리케이션컨트롤러를 생성해보자.

apiVersion: v1
kind: ReplicationController
metadata:
  name: suk9-rc
spec:
  replicas: 3
  selector:
    app: suk9-rc
  template:
    metadata:
      labels:
        app: suk9-rc
    spec:
      containers:
      - name: suk9-rc
        image: seokkyulee/suk9
        ports:
        - containerPort: 8080
kubectl create -f rc.yaml
kubectl get po

3개의 파드가 생성되었다. 하나를 한번 종료해보자.

kubectl delete po suk9-rc-lnrxr
kubectl get po

종료가 잘 되는가? suk9-rc-lnrxr 파드는 종료되었겠지만, 또 다른 파드가 자동으로 생성되었다. 레플리카의 수를 3으로 지정했기 때문에 늘 파드의 수는 3개를 유지하게 된다.

kubectl get rc
kubectl describe rc suk9-rc

위 명령으로 레플리케이션컨트롤러의 정보를 얻을 수 있다. 우리가 원하는 파드의 수와 실제 파드의 수, 준비된 파드 수를 확인할 수 있다.

 

파드가 삭제었다는 정보는 트리거 역할을 하게 되고, 이를 통해 레플리케이션 컨트롤러는 파드 상태를 확인하고 적절한 조치를 취하게 된다.

 

레이블

따라서 파드의 레이블을 변경하면, 레플리케이션 컨트롤러는 그에 따른 행동을 취하게 된다. 이미 관리되고 있는 파드의 레이블을 변경해서 레플리케이션 컨트롤러의 관리에서 벗어날 수도, 그 반대로 될 수도 있다. 물론 레플리케이션의 레이블을 바꿀 수도 있다.

 

파드 템플릿

파드 템플릿은 새롭게 생성할 파드를 찍어내는 틀이라 생각하면 간단하다. 따라서 변경하더라도 이미 생성된 파드에는 영향을 주지 않는다.

kubectl edit rc suk9-rc
#KUBE_EDITOR 환경 변수에 설정된 에디터가 기본으로 사용된다.

해당 명령어로 레플리케이션 컨트롤러의 YAML 정의를 수정할 수 있다.

 

스케일링

레플리케이션 컨트롤러를 이용하면 스케일링은 정말 손가락 하나만 까딱하는 수준의 작업이 된다.

kubectl scale rc suk9-rc --replicas=10

위 명령어를 통해 suk9-rc 레플리케이션 컨트롤러의 복제본 수를 10개로 늘릴 수 있다. 그런데 우리 수준에 비해, 우아하지 못하다.

kubectl edit rc suk9-rc

YAML 정의의 spec.replicas 필드의 값을 10으로 변경하자. 간단하게 선언적 방법으로 스케일링이 이루어졌다. 심지어 변경조차 하지 않고 쿠버네티스에게 알아서 하라고 할 수도 있다.

 

삭제

kubectl delete rc suk9-rc --cascade=false

위 명령을 통해 레플리케이션 컨트롤러만 삭제할 수도 있고, cascade 옵션을 빼면 파드까지 모두 삭제할 수 있다.

 

자 이제, 레플리케이션 컨트롤러에 대한 학습은 끝났다. 이제 공식 권장 방법인 레플리카셋을 이용해보자!