본문 바로가기
Containers/Kubernetes

4.2. Replication Controller

by shinebee* 2020. 7. 24.
  • kubernetes의 컨트롤러는 파드를 올바르게 동작하기 위해 특정 상태를 보장하기 위한 기능이다.
  • 특정 상태는 컨트롤러에 따라 동작하는 방식 및 정의하는 상태에 따라 다르다.

 

 

1.  replication controller란?

  • 파드가 특정 개수만큼이 복제되고 동작하는 것을 보장한다.
  • 최신 버전에서는 잘 쓰지 않는다.
  • label을 수정하면 label이 달라지기 때문에 복제본을 새로 만든다 -> 복제본이 하나 없어졌다고 판단하기 때문에
  • 노드에 문제가 발생했거나 파드가 문제가 생겨 원하는 수의 파드가 동작하지 않는다면 자동으로 스케줄러에 의해 새로운 노드나 기존 노드에 다시 새로운 파드를 생성해 원하는 수의 파드를 복제해서 동작시킨다.
  • 파드가 원하는 수보다 많은 경우에도 원하는 파드 수로 맞춘다.
    -->  불필요한 파드를 제거해 원하는 수를 맞춘다.

 

  • 원하는 수의 복제본 보다 더 많은 복제본이 생길 수 있는 경우
    • 수동으로 동일한 형식의 파드를 생성
    • 기존 파드의 유형을 변경
    • 원하는 수의 파드 복제본 수를 줄인 경우

 

  • 즉, 실행중인 파드의 목록을 주기적으로 모니터링하고, 원하는 수의 파드 수와 항상 일치시킨다.

 

  • 레플리케이션 컨트롤러를 구성하기 위한 세 가지 요소
    • 파드를 지정하는 레이블 셀렉터 (selector)
    • 새로운 파드의 복제본을 만들기 위한 파드 템플릿 (template)
    • 복제본 수 (replicas)

 

  • 레플리케이션 컨트롤러가 제공하는 기능
    • 원하는 복제보 수의 파드가 없는 경우 파드 템플릿을 이용하여 파드를 생성
    • 노드에 장애가 발생하면 장애가 발생한 노드에서 실행 중이던 파드의 복제본을 다른 노드에 생성
      • 노드에 장애가 발생한 것을 어떻게 알까?  ->  통신이 안된다.
    • 수동이나 자동으로 파드를 수평 스케일링할 수 있다.

 

 

2. replication controller 생성

# mynapp-rc.yaml

apiVersion: v1
kind: ReplicationController
metadata:
  name: mynapp-rc
spec:
  replicas: 3
  selector:
    app: mynapp-rc
  template:
    metadata:
      labels:
        app: mynapp-rc
    spec:
      containers:
      - name: mynapp
        image: http
        ports:
        - containerPort: 80
  • 복제본 = 3개
  • 레플리케이션이 관리할 파드의 레이블 셀렉터 = app: mynapp-rc
  • 생성할 파드는 템플릿에 정의

 

  • 레플리케이션 컨트롤러 생성
kubectl create -f mynapp-rc.yaml

 

 

3. replication controller 확인

  • DESIRED : 원하는 복제본의 개수는 3개
  • CURRENT : 현재 존재하는 파드는 3개
  • READY :  준비된 파드는 없다.  ->  파드가 생성중이기 때문

 

  • 파드의 목록 확인

  • 레플리케이션 컨트롤러가 처음 만들어졌을 때는 app=mynapp-rc 레이블을 가지고 있는 파드가 없기 때문에 복제본 3개를 생성한다.

 

  • 파드에 구성된 레이블 살펴보기

  • 모든 파드가 요구하는 복제본 개수만큼 만들어져 있다.

 

  • 레플리케이션 컨트롤러의 자세한 정보 확인

 

 

4. replication controller와 pod

  • 래플리케이션 컨트롤러에서 노드의 장애 발생을 가정하고 파드를 삭제했을 때 어떻게 되는지 확인.

 

  • 마지막 파드 (mynapp-rc-9wcpj)를 삭제해본다.
kubectl delete pods mynapp-rc-9wcpj

 

  • 파드가 삭제되고 있는 도중 다른 터미널에서 파드의 목록 확인

  • mynapp-rc-9wcpj 파드는 삭제되고 있는 중이다. (또는 이미 삭제되었을 수 있다) 
  • mynapp-rc-mnbfx 파드가 새로 생성되었다.
  • 레플리케이션 컨트롤러는 파드의 목록을 확인하고 있다가 파드가 없어지면 파드의 복제본 수에 맞춰 파드를 생성한다는 것을 알 수 있다.
  • kubectl describe 명령어로 자세한 정보를 확인 해보면 정확하게 어떤 파드가 생성되었는지 확인할 수 있다.
  • 파드를 삭제하기 전 watch 명령이나 --watch 옵션을 사용하여 실시간으로 확인할 수도 있다.

 

 

5. replication controller와 label

  • 레플리케이션 컨트롤러는 관리할 파드를 파드의 레이블과 레플리케이션 컨트롤러의 레이블 셀렉터를 이용하여, 관리할 파드를 지정하고 관리한다.

 

1) 기존 파드에 레이블 추가

  • 파드의 목록 및 레이블 확인

 

  • mynapp-rc-mnbfx 파드에 env=dev 레이블 추가
kubectl label pods mynapp-rc-mnbfx env=dev

  • 기존 파드에 추가 레이블만 구성되었고 변경된 사항은 없다.

 

2) 기존 파드의 레이블 변경

  • app=mynapp-rc를 다른 레이블로 변경
kubectl label pods mynapp-rc-mnbfx app=test --overwrite

  • mynapp-rc-mnbfx 파드의 레이블을 app=test로 변경한 이후, 레플리케이션 컨트롤러는 app=mynapp-rc 레이블을 가진 파드가 두 개 밖에 없기 때문에, 새로운 파드를 생성.
  • 이제부터 mynapp-rc-mnbfx 파드는 더이상 mynapp-rc 레플리케이션 컨트롤러가 관리하는 파드가 아니다.

 

  • 다시 원래대로 mynapp-rc-mnbfx 파드의 레이블을 app=mynapp-rc로 변경
kubectl label pods mynapp-rc-mnbfx app=mynapp-rc --overwrite

  • 파드의 레이블이 원래대로 변경되었기 때문에 mynapp-rc 레플리케이션 컨트롤러의 관리 파드로 지정되었다.
  • 그러나 레플리케이션 컨트롤러는 관리 할 파드가 네 개나 외었으므로 파드 하나를 삭제한다.
  • 삭제되는 파드의 기준은 가장 최근(ACE) 에 생성된 파드가 대상

 

 

6. 파드의 수평 스케일링

1) 명령을 이용한 스케일링

  • 복제본 수를 변경하여 스케일링
kubectl scale replicationcontroller mynapp-rc-replicas=4

  • mynapp-rc-rlrr9 파드가 추가로 생성되었다.
  • kubectl describe 명령의 Event 필드를 확인  ->  어떠한 파드가 생성되었는지 알 수 있다.

 

2) 오브젝트 수정을 이용한 스케일링

kubectl edit rc mynapp-rc
  • vi 편집기로 수정이 가능하다.
  • 수정 : replica: 5
  • kubectl edit 명령
    • 저장할 때 출력에 "XXX edited" 라고 나오는지 반드시 확인!
    • KUBE_EDITOR 환경변수에 에디터를 지정하여 vi/vim 이외의 원하는 에디터로 수정할 수 있다.
    • 실제 YAML 파일의 내용을 변경하지는 않는다.  -> 기록이 남지 않아 권장하지 않는다.

 

  • mynapp-rc 레플리케이션 컨트롤러의 상태 확인

  • 새로운 파드가 생성되어 총 다섯개의 파드가 존재.

 

3) 오브젝트 파일 수정을 이용한 스케일링

  • 현재 pod는 scaling을 통해 다섯 개가 구성되었다.
  • 그러나 YAML 파일을 수정한 것이 아니기 때문에 YAML 파일 내의 복제본 수는 여전히 세 개로 정의되어있다.
  • YAML 파일을 이용한 scaling은 YAML 파일을 변경한 후, kubectl replace  명령을 사용하는 것이다.
  • 이는 기존 생성된 오브젝트의 구성과 YAML 파일의 구성정보를 비교한 후 변경된 사항에 대해서만 반영한다.
kubectl replace -f mynapp-rc.yaml

 

  • 레플리케이션 컨트롤러 상태 확인

 

 

7. replication controller 및 pod 삭제

  • 컨트롤러에 의해 관리되는 pod들은 pod 자체를 삭제하더라도 복제본 조건에 따라 다시 생성된다.
  • 그렇기 때문에 pod를 삭제하기보다 컨트롤러를 직접 삭제해야 한다.
  • 컨트롤러에 의해 관리되는 pod 도 같이 삭제된다.

 

  • 컨트롤러 삭제 명령
kubectl delete replicationcontrollers mynapp-rc
//kubectl delete rc mynapp-rc

 

  • 상태 확인

'Containers > Kubernetes' 카테고리의 다른 글

4.4. DaemonSet  (0) 2020.07.29
4.3. ReplicaSet  (0) 2020.07.28
4.1. Liveness Probe  (0) 2020.07.24
3.4. namespace  (0) 2020.07.24
3.2. Label 및 Selector  (0) 2020.07.23

댓글