본문 바로가기

Kubenetes/Kubernetes Controller

레플리케이션 컨트롤러 (Replication Controller)

- 레플리케이션 컨트롤러는 포드가 항상 실행되도록 유지하는 쿠버네티스 리소스

- 노드가 클러스터에서 사라지는 경우 또는 노드에서 포드가 제거된 경우와 같이 어떤 이유로든 포드가 사라지면 레플리케이션컨트롤러는 누락된 포드를 감지하고 대체 포드를 만든다.

 

노드가 실패하면 레플리케이션컨트롤러가 지원하는 포드만 다시 생성

 

[레플리케이션컨트롤러의 동작]

 

레플리케이션컨트롤러는 실행 중인 포드의 목록을 지속적으로 모니터링하고 '유형'의 실제 포드 수가 원하는 수와 항상 일치하는지 확인

 

 

[컨트롤러의 연결 고리]

레플리케이션 컨트롤러의 조정 루프

 

[레플리케이션켠트롤러의 세가지 요소]

 

ㅁ 레플리케이션컨트롤러의 범위에 있는 포드를 결정하는 라벨 셀렉터

ㅁ 실행해야 하는 포드의 원하는 수를 지정하는 복제본 수

ㅁ 새로운 포드 복 제본을 만들 때 사용되는 포드 템플릿

 

레플리케이션컨트롤러의 세가지 핵심 요소(포드 셀렉터, 복제본 수, 포드 템플릿)

 

[컨트롤러의 라벨 셀렉터 또는 포드 템플릿 변경에 따른 효과]

 

- 라벨 셀렉터 및 포드 템플릿의 변경 사항은 기존 포드에는 영향을 끼치지 않음

- 라벨 셀렉터를 변경하면 기존 포드가 레플리케이션컨트롤러의 범위를 벗어나 컨트롤러가 해당 포드를 신경 쓰지 않음

- 레플리케이션컨트롤러는 포드를 만든 후 컨테이너의 실제 컨텐츠(컨테이너 이미지, 환경 변수, 기타 사항 등)을 신경 쓰지 않음

따라서 변경된 템플릿은 레플리케이션컨트롤러로 만든 새로운 포드에만 영향을 줌

 

[레플리케이션컨트롤러를 사용해 얻는 이점]

 

- 포드가 없는 경우 새 포드를 시작해 포드(또는 여러 포드 복제본)가 항상 실행되도록 함

- 클러스터 노드에 장애 발생 시 장애가 발생한 노드에서 실행 중인 모든 포드의 대체 복제본(복제 제어기의 제어하에 있던 복제본)을 만듬

- 수동으로 또는 자동으로 포드를 쉽게 수평 스케일링 함.

 

ㅇ 참고: Pod 인스턴스는 절대로 다른 노드로 재배치되지 않음. 대신 레플리케이션컨트롤러는 대체할 인스턴스와 관련이 없는 완전히 새로운 인스턴스를 만듬

 

[레플리케이션컨트롤러 생성]

 

- 레플리케이션컨트롤러의 YAML 정의: kubia-rc.yaml

apiVersion: v1
kind: ReplicationController                #레플리케이션컨트롤러(RC)의 매니페스트 정의
metadata:
    name: kubia                                   #레플리케이션컨트롤러의 이름
spec:
    replicas: 3                                      #원하는 포드 인스턴스의 수
    selector:
         app: kubia
template:                                          #새 포드를 생성하는 포드 템플릿
    metadata:
         labels:
              app: kubia
     spec:
         containers:
         - name: kubia
           image: luksa/kubia
           ports;
           - containerPort: 8080

 

$ kubectl create -f kubia-rc.yaml

replicationcontoller "kubia" created.

 

- 이 컨트롤러는 항상 라벨 셀렉터 app=kubia와 일치하는 세 개의 포드 인스턴스를 유지

- 포드 수가 충분하지 않다면 포드 템플릿으로 새 포드 생성

- 템플릿의 포드 라벨은 분명히 레플리카컨트롤려의 라벨 셀렉터와 일치해야 함.

   ㅇ 만약 일치 하지 않으면 컨트롤러는 새로운 포드를 무기한 생성

   ㅇ 새 포드를 스핀업시킨다고 해도 원하는 복제본 수에 근접한 실제 복제수가 생성되지 않기 때문

 

[실행중인 레플리케이션 컨트롤러 보기]

 

$ kubectl get pods

 

[레플리케이션컨트롤러의 정보 얻기]

 

$ kubectl get rc

 

[레플리케이션컨트롤러의 세부 정보 표시]

 

$ kubectl describe rc kubia

 

- 관리된 포드의 라벨 변경 시

라벨을 변경해 레플리케이션컨트롤러 범위에서 포드 제거

 

[포드 템플릿 변경]

 

레플리케이션컨트롤러의 포드 템플릿은 언제든지 수정 가능

$ kubectl edit rc kubia

 

레플리케이션컨트롤러의 포드 템플릿을 변경하면 이후에 생성된 포드에만 영향을 미치며 기존 포드에는 영향을 미치지 않는다.

 

[수평 포드 스케일링]

 

ㅁ 레플리케이션컨트롤러 스케일업(확장)

 

기존 레플리케이션컨트롤러의 숫자를 10까지 늘리려면

$ kubectl scale rc kubia --replication=10

 

ㅁ 레플리케이션컨트롤러의 정의를 편집해 스케일링

 

$ kubectl edit rc kubia

 

apiVersion: v1
kind: ReplicationController
metadata
   ...
spec:
    replicas: 3              # 3을 10으로 변경
    selector:
        app: kubia
   ...

 

파일을 저장하고 편집기를 닫으면 레플리케이션컨트롤러가 업데이트 되고 즉시 포드의 수를 10으로 스케일링함

$ kubectl get rc

NAME      DESIRED       CURRENT      READY       AGE

kubia        10                 10                  4                21m

 

ㅁ kubectl scale 명령으로 스케일링 다운

$ kubectl scale rc kubia --replicas=3

 

[레플리케이션 컨트롤러 삭제]

 

- kubectl delete로 레플리케이션컨트롤러를 삭제하면 해당 포드도 삭제됨

- 레플리케이션컨트롤러 삭제 시 --cascade=false 옵션을 통해 레플리케이션컨트롤러가 생성한 포드는 실행 삭제 그대로 둘수도 있음 

 

$ kubectl delete rc kubia --cascade=false

replicationcontroller "kubia" deleted

 

--casecade=false를 사용해 복제 컨트롤러를 삭제해 관리되지 않은 포드로 만들 수 있다.

   

'Kubenetes > Kubernetes Controller' 카테고리의 다른 글

StatefulSet  (0) 2021.02.13
Deployment - 애플리케이션 업데이트  (0) 2021.02.13
잡 리소스 및 스케줄링  (0) 2021.02.11
레플리카셋(Replicaset)  (0) 2021.02.11