본문 바로가기
Framework and Tool/Kubernetes

Kubernetes - Replication controller

by ocwokocw 2022. 10. 11.

- 출처: Kubernetes in action

- 레플리케이션 컨트롤러

레플리케이션 컨트롤러(이하 "rc")는 쿠버네티스 리소스이며 파드가 항상 실행되도록 보장해준다. 어떤 워커노드가 다운 되거나 워커 노드 내에서 파드가 사라지면 감지해서 교체 파드를 생성한다.
 
직접 생성한 파드 A와 rc에 의해 생성된 파드 B가 같은 워커 노드에 있을 때 노드가 다운 된다면 파드 A는 유실되지만 파드 B는 rc에 의해 관리되기 때문에 새로 생성된다.

- rc의 동작

rc는 실행중인 파드 목록을 모니터링해서 "특정" 유형의 파드수가 설정한 파드 수와 일치하는지를 확인한다. 모니터링해서 파드 수가 모자라면 신규 파드를 생성하며 파드가 많아지면 제거한다.
 
파드수가 모자라는 상황은 이해가 가는데 어떻게 파드가 많아질 수 있는지에 대해 의문을 품을수도 있다. 누군가 수동으로 파드를 생성하거나 파드 유형을 변경하거나 의도한 파드수를 줄이면 노드 내 동작하고 있는 파드수가 많아질 수 있게 된다.
 
rc가 파드 목록을 모니터링할 때 "특정" 유형의 파드 수를 확인한다고 언급했는데 사실 어떤 유형의 파드란 없는 개념이며 실제로는 레이블 셀렉터와 일치하는 파드 세트를 말한다.
 
컨트롤러 조정 루프는 아래와 같은 순서로 동작한다.
 
  1. 레이블 셀렉터와 매칭되는 파드 수를 구함
  2. 설정된 파드 수와 비교
  3. 초과 분을 삭제하거나 모자란 파드를 생성
  4. 1.번의 동작으로 돌아감
 
위의 조정 루프의 동작과정을 보면 유추할 수 있겠지만 rc에는 3가지 필수요소가 있다.
 
  • 레이블 셀렉터: rc에서 관리할 범위를 설정
  • 레플리카 수: 의도한 파드의 수
  • 파드 템플릿: 새로운 파드 레플리카 생성시 사용할 템플릿
 
레이블 셀렉터나 파드 템플릿을 변경하면 어떻게 될까?
 
  • 레이블 셀렉터 변경: 기존 파드가 rc의 관리 범위를 벗어나서 파드 관리를 중지하게 된다. 그렇다고 해서 기존의 파드가 사라지는것은 아니다.
  • 파드 템플릿 변경: 역시 기존 파드에 영향을 미치지 않으며 신규 파드를 생성할 때는 변경된 파드 템플릿을 기반으로 생성된다.
 
파드를 수동으로 생성하지 않고 rc를 사용하면 아래와 같은 장점이 있다.
 
  • 기존 파드가 사라질 때 설정한 레플리카 수에 맞춰서 신규 파드를 생성해준다.
  • 노드에 장애가 발생하면 해당 노드 안에 있던 파드의 교체 복제본을 생성한다.
  • 수동 혹은 자동으로 scale out을 쉽게 제공한다.

- rc 생성

아래 내용과 같이 kubia-rc.yaml 파일을 작성한다.
 
apiVersion: v1
kind: ReplicationController
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: ocwokocw/kubia
        ports: 
        - containerPort: 8080
 
kind 에 레플리케이션 항목을 기술해준다. spec 에는 설정할 레플리카 수와 현재 파드를 구할 때 사용할 레이블 셀렉터를 지정한다. template 섹션은 새 파드를 생성할 때 사용하는 파드 템플릿이다.
 
spec 에서 지정한 레이블 셀렉터와 template에 지정한 레이블은 동일해야 한다. 만약 spec.template.metadata.labels.app을 kubiaa로 일부러 틀리게 설정한다면 생성되지 않는다.
 
 
 
다시 yaml 예제와 같이 정확한 정보를 기입해서 "k create -f"를 이용해서 생성해보자.
 
 
 
의도한 파드 설정 수대로 생성되었고, 레이블도 기대한 대로 태깅되었다.
 

- rc 작동 확인

앞서 설명에서 rc는 파드를 관리하므로 삭제하면 신규 대체 파드를 생성하다고 했었다. 파드 목록중 하나를 삭제해보자.
 
 
 
하나를 삭제하면 곧바로 신규 파드 하나를 생성한다.
 
rc의 정보도 조회할 수 있다. "kubectl get" 명령어가 손에 익었다면 어림짐작으로 명령어를 예상할 수 있을것이다. 의도한 파드 수와 현재 파드수 레디 상태인 파드수를 알려준다.
 
더욱 자세한 정보를 조회하고 싶다면 "kubectl describe" 명령어를 이용한다.
 
 
 
describe 명령어 결과에서 Replicas 에는 의도한 파드 수와 현재 파드 수를 알려준다. Events 에는 rc와 관련된 이벤트를 알려준다. 아까 파드를 삭제한 뒤로 두어번 더 삭제해본 후 조회한것이다. 어떤 파드가 새로 생성되었는지 내역이 자세히 나와있음을 알 수 있다.
 
파드를 삭제했을 때 rc가 대응하는것을 보고 "파드 삭제에 대한 이벤트를 rc가 감지해서 반응하였다."라고 생각할 수 있다. 결과적으로 보면 맞는말이긴 하지만 이벤트에 반응하는것이 아니라 결과적인 상태(부족해진 파드 수)에 대응한것이다.
 
rc는 노드 장애에도 대응한다. rc가 노드가 다운된것을 감지하면 파드를 대체하기 위한 새 파드를 기동한다. 다만 minikube는 워커노드가 하나 밖에 없으므로 실험을 하려면 GKE 로 여러 노드를 사용해야 해서 생략한다.

- rc 밖으로 파드 이동

rc가 생성한 파드는 rc에 의해서 관리되긴 하지만 직접적으로 참조 관계를 갖진 않는다. rc는 설정한 레이블 셀렉터와 일치하는 파드를 관리할 뿐이다.
 
파드의 레이블을 변경하면 rc 범위에서 제거하거나 추가될 수 있으며 다른 rc로 이동도 가능하다.
 
파드에 레이블을 추가하면 rc는 신경쓰지 않는다.
 
 
 
하지만 레이블을 수정하면 얘기가 달라진다. 3 파드중 하나의 app=kubia 레이블 값을 foo로 변경해보자. 수정이므로 --overwrite 옵션을 잊지말자.
 
 
 
kubia-rwl9n 파드의 레이블을 app=foo 로 변경했다. 이렇게 되면 rc는 app=kubia 레이블 셀렉터로 조회했을 때 2개밖에 얻지 못하는데 의도한 파드 수는 3개 이므로 신규 파드를 생성한다.
 
그리고 헷갈릴 수 있는데 레이블을 변경한 파드는 삭제 되지 않고 유지된다. rc에 의해서 직접적으로 참조 되지는 않는다고 했다. 만약 app=foo 로 변경한 파드를 삭제하면 해당 파드는 관리되지 않으므로 유실될것이다.
 
이를 응용하면 파드를 디버깅할 때 유용하게 사용할 수 있다. 만약 일정 시간이 지나고 이벤트가 발생해서 기존 파드가 제대로 동작하지 않는 버그가 발생했다고 가정해보자. 파드를 rc 밖으로 빼내면 rc는 신규 파드를 생성할것이다. rc 밖으로 빼낸 파드를 디버깅 용도로 사용할 수 있는것이다.

- 파드 템플릿 변경

rc의 파드 템플릿은 언제든지 수정이 가능하다. 파드 템플릿은 이미 생성된 파드의 컨텐츠는 신경쓰지 않으므로 수정해도 기존 파드에는 영향을 주지 않는다. 기존 파드에 신규 파드 템플릿을 적용하고 싶다면 기존 파드를 삭제해서 신규 파드를 생성하게 의도해야 한다.
 
rc는 "kubectl edit rc [rc 이름]" 명령어로 편집할 수 있다. "kubectl edit rc kubia" 명령어를 실행하면 기본 편집기가 실행되는데 아래와 같이 template 레이블에 foo=bar를 추가해준다.
 
 
 
 
 
단순히 파드 템플릿을 수정한다고 해서 기존에 실행되던 파드에 레이블이 추가되진 않는다. 파드를 하나 삭제한 후 다시 정보를 조회하면 foo=bar가 추가된것을 확인할 수 있다.
 
 

- 파드 scailing

파드 수를 변경하려면 rc의 replicas 필드값을 변경하면 된다. "kubectl edit rc kubia"로 rc 파일을 수정하여 replicas를 10으로 한 후 저장하면 아래와 같이 파드가 10개로 늘어난다.
 
 
 
rc 파일이 아닌 명령어로도 scale out이 가능한데 "kubectl scale rc kubia --replicas=10" 명령어를 수행하면 된다.
 
쿠버네티스에서 파드를 scaleout 한다는것은 파드 복제본 수를 10개인 상태로 하고 싶다고 선언하는것이다. 만약 명령형으로 현재 파드 수를 고려해서 +x개를 추가하라고 명령해야 한다면 불편하겠지만 쿠버네티스는 선언적인 접근법으로 사용자에게 편리함을 제공한다.
 

- rc 삭제

kubectl delete로 rc를 삭제하면 파드도 삭제된다.
 
 
 
만약 rc만 삭제하고 파드를 유지하고 싶다면 --cascade=false 옵션을 추가해준다.
 
 

'Framework and Tool > Kubernetes' 카테고리의 다른 글

Kubernetes - job and cron job  (0) 2022.10.21
Kubernetes - ReplicaSet, DaemonSet  (0) 2022.10.14
Kubernetes - Liveness probe  (0) 2022.10.10
Kubernetes - Namespace  (0) 2022.10.09
Kubernetes - Label 및 Annotation  (0) 2022.10.09

댓글