[Kubernetes] Controller, Replication Controller, ReplicationController, ReplicaSet, Deployment


서론

쿠버네티스 시스템 내 여러 구성 요소의 상태를 지속적으로 감시하며, 전체 시스템이 원하는 상태로 동작하도록 유지하는 프로세스이다.

Kubernetes 안에는 Node Controller, Replication Controller 이 외에도 다양한 컨트롤러가 존재하며 deployment, service, namespace, PV 등 모든 개념들은 전부 컨트롤러에 의해 동작한다.

이 컨트롤러들은 모두 Kubernetes Controller Manager라는 하나의 프로세스에 포함되어 있다.

따라서 Kubernetes Controller Manager를 설치하면, 여러 컨트롤러도 함께 설치된다.

이 장에서는 Kube Controller Manager가 무었인지 그리고 이에 속해있는 Node Controller와 Replication 컨트롤러에 대해 알아본다.

Node Controller

  • Kube API server를 통해 노드 상태를 감시하고, 애플리케이션이 계속 실행되도록 필요한 조치를 취한다.

동작방식

  1. Node Controller는 노드 상태를 5초마다 검사한다.
  2. Node Controller가 노드의 건강 상태를 지속적으로 확인할 수 있다.
  3. 만약 노드로부터 heartbeat 신호를 받지 못하면, 40초 동안 기다린 후 해당 노드는 unreachable(도달 불가) 상태로 표시된다.
  4. 노드가 unreachable로 표시된 후에는 다시 살아나기를 5분간 기다린다.
  5. 5분이 지나도 노드가 복구되지 않으면, 해당 노드에 할당된 파드들을 삭제하고, ReplicaSet에 속한 파드라면 건강한 노드에 다시 생성한다.

Replication Controller

  • 이 컨트롤러는 ReplicaSet의 상태를 감시하고, 지정된 개수의 파드가 항상 유지되도록 한다.
  • 만약 파드가 죽으면, 새로운 파드를 생성한다.

Controller Manager

  • kubeadm으로 쿠버네티스를 구축했다면 kube-system 네임스페이스의 kube controller manager를 마스터 노드에 파드 형태로 배포한다.
  • 그리고 이 파드에 대한 설정은 /etc/kubernetes/manifests/kube-controller-manager.yaml 파일을 통해 확인 할 수 있다.
  • 여기에는 node-monitor-grace-period, node-eviction-timeout 외의 다양한 컨트롤러의 활성화 여부등에 대한 옵션들이 존재한다(기본적으로 모든 컨트롤러는 실행되도록 설치된다).
  • 따라서 어떤 컨트롤러가 동작하지 않거나 문제가 발생한 경우 이 파일을 확인하면 된다.

Replication Controller vs Replica Set

  • Replica(레플리카): 애플리케이션의 실행 인스턴스, 즉 파드의 복제본이다.
  • Replicaset & RC(Replication Controller): 지정된 수의 파드(레플리카)를 항상 유지함
    • 예: 3개로 설정하면 하나가 죽어도 다시 1개를 자동 생성해서 항상 3개 유지
  • 단일 파드만 필요할 경우에도 유용
    • 파드가 죽으면 자동으로 새 파드 생성
  • 다수의 노드에 걸쳐 파드를 배포하여 고가용성과 부하 분산 지원

Replication controller

  • spec: 생성할 객체 내부 구성을 정의한다.
  • template: 컨트롤러가 생성할 파드가 어떤 파드인지 정의해야 함으로 파드 템플릿을 작성한다.
    • 기존 Pod Definition에서 apiVersion과 kind 두 줄만 제외하고 가져온다
      # pod-definintion.yaml
      
      apiVersion: v1
      kind: Pod
      metadata:
        name: myapp-pod
        labels:
            app: myapp
            type: front-end
      
      spec:
        containers:
          - name: nginx-container
            image: nginx
apiVersion: v1
kind: ReplicationController
metadata:
	name: myapp-rc
	labels:
	  app: myapp
	  type: front-end
	  
spec:
  template:
    metadata:
		  name: myapp-pod
		  labels:
		      app: myapp
		      type: front-end
		
		spec:
		  containers:
		    - name: nginx-container
		      image: nginx
  • replicaset: 파드(레블리카셋) 갯수를 설정해줘야한다.
apiVersion: v1
kind: ReplicationController
metadata:
	name: myapp-rc
	labels:
	  app: myapp
	  type: front-end
	  
spec:
	replicas: 3
  template:
    metadata:
		  name: myapp-pod
		  labels:
		      app: myapp
		      type: front-end
		
		spec:
		  containers:
		    - name: nginx-container
		      image: nginx

  

ReplicaSet

Replication Controller와 작성방법은 동일하돼, Selector 라는 개념이 포함된다.

생성 당시 존재하던 파드도 관리 대상에 포함시킬 수 있는 것에 차이가 있다.

예를들어 미리 만들어둔 파드가 selector의 라벨과 일치하면 레블리카셋이 그 파드도 포함해 수를 계산한다.

항목ReplicationControllerReplicaSet
apiVersionv1apps/v1
selector 명시생략 가능 (template하위에 정의된 파드의 label 속성으로 간주)반드시 명시해야 함(특정 Pod의 label)
기존 파드 인식X (직접 생성한 파드만 관리)O (selector로 기존 파드도 관리 가능)
Deployment와 통합사용 불가Deployment의 기반 리소스
  • Replication Controller(Selector를 적용하지 않아도 된다)
apiVersion: v1
kind: ReplicationController
metadata:
  name: myapp-rc
spec:
  replicas: 3
  template:
    metadata:
      labels:
        app: myapp     # ⬅️ 이게 자동 selector 기준이 됨
    spec:
      containers:
        - name: myapp-container
          image: nginx
  • ReplicaSet(Selector를 적용해줘야 한다)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
	name: myapp-replicaset
	labels:
	  app: myapp
	  type: front-end
	  
spec:
	replicas: 3
	selector:
    matchLabels:
      type: front-end
      
  template:
    metadata:
		  name: myapp-pod
		  labels:
		      app: myapp
		      type: front-end # ⬅️ 이걸 직접 명시해야함
		
		spec:
		  containers:
		    - name: nginx-container
		      image: nginx

  

Deployment

ReplicaSet

  • Deployment는 Replicaset상위 레벨의 Kubernetes 객체로, ReplicaSet을 자동으로 관리한다
  • Deployment는 직접적으로 파드를 생성하지 않고, 내부적으로 ReplicaSet을 생성하여 파드를 관리한다.
  • 사용자가 kubectl create -f deployment.yaml 명령으로 Deployment를 생성하면, Kubernetes가 자동으로 ReplicaSet을 생성하고, 그 ReplicaSet이 다시 파드들을 생성한다.
  • 즉, Deployment > ReplicaSet > Pod 구조이다

Deployment Yaml

  • ReplicaSet과 매우 유사, kind만 다름
apiVersion: apps/v1
kind: Deployment
metadata:
	name: myapp-replicaset
	labels:
	  app: myapp
	  type: front-end
	  
spec:
	replicas: 3
	selector:
    matchLabels:
      type: front-end # ⬅️ 여기에 명시
      
  template:
    metadata:
		  name: myapp-pod
		  labels:
		      app: myapp
		      type: front-end # ⬅️ 이걸 직접 위에 명시해야함
		
		spec:
		  containers:
		    - name: nginx-container
		      image: nginx

  
  • Deployment 수정명령어
kubectl edit deployment my-deployment