지속적인 POD 관리를 위한 컨트롤러 소개(Replication Controller, ReplicaSet, DaemonSet)

호제로·2022년 9월 25일
0

Container

목록 보기
2/4

쿠버네티스에서는 POD의 지속적인 관리를 위해 Replication 기능을 지원하는 서비스가 있다.
POD의 상태를 주기적으로 관리하여 특정 노드나 POD에서 이상케이스가 발생 할 경우 자동으로 생성/관리 해주는 역할을 수행한다.

쿠버네티스에는 주기적인 POD 상태 관리를 위해 사용하는 서비스는 Replication Controller, ReplicaSet, DaemonSet 등 이 있다.


Replication Controller vs ReplicaSet

Replication Controller는 템플릿에 POD 셀렉터를 지정하여 특정 레이블에 속한 POD에 대해서 주기적으로 POD 상태를 체크하고 관리한다.
POD 셀렉터를 지정하기 때문에 특정 레이블을 가진 POD만 관리 가능하다.
ex) app=blue

apiVersion: v1
kind: ReplicationController
metadata:
  name: nginx
spec:
  replicas: 3
  selector:        --> selector를 이용
    app: nginx
  template:
    metadata:
      name: nginx
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx
        ports:
        - containerPort: 80

Replication Contoller에서 특정 레이블만 가진 POD를 관리했다면,
ReplicaSet은 특정 레이블의 키값을 가지거나, 특정 레이블을 조건으로 설정하여 Replication Controller 보다 더 다양한 군집으로 POD를 관리할 수 있다.
apiVersion으로 apps/v1 이 추가되며 selector(label)을 필수로 입력해야 한다.
ex) app=blue, app=yellow

— ReplicaSet MatchLabels 사용 예제

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-1
spec:
  replicas: 2
  selector:
    matchLabels:         -- matchlabels를 이용
      app: yellow
  template:
    metadata:
      labels:
        app: yellow
    spec:
      containers:
      - name: nginx
        image: nginx

또한 MatchExpression을 통해서 여러 레이블을 가진 POD를 선택할 수 있다.
Expression에 사용되는 Operator는 다음과 같다.

  • In : 레이블 값이 지정된 값중 하나와 일치
  • NotIn : 레이블 값이 지정된 값과 일치하지 않아야 함
  • Exists : 파드는 지정된 키를 가진 레이블이 포함되어야 함 (값은 상관 없음)
  • DoesNotExist : 파드에 지정된 키를 가진 레이블이 포함되지 않아야 함 (값은 상관 없음)

표현식을 지정하는 경우 셀렉터가 파드와 매칭 되기 위해선 모든 표현식이 True 여야 한다.
— ReplicaSet MatchExpressions 사용 예제

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-2
spec:
  replicas: 2
  selector:
    matchExpressions:      --- matchExpressions 사용 예제 
      - key: app
        operator: In
        values: 
          - blue
          - yellow
  template:
    metadata:
      labels:
        app: yellow
    spec:
      containers:
      - name: nginx
        image: nginx

ReplicaSet 여러 명령어

— Replica 조회 & 생성

* Replica 생성
$ kubectl create -f {replicaset.yaml} 

* Replica 전체 조회
$ kubectl get replicaset

* Replica 상세 조회
$ kubectl describe replicaset {replicaset-name}

— Replica Scale

* kubectl scale 명령어를 통한 Scale 
$ kubectl scale —replicas=5 replicaset {replicaset-name}

* kubectl edit 명령어를 통한 scale
$ kubectl edit replicaset {replicaset-name}
$ replicas: {new-scale-num}  -> replica 개수 수정 및 저장 

— Replica Image 수정 및 적용

# Replica image 수정
$ kubectl edit replicaset {replicaset-name}
  — image 필드 부분에 정상적인 image 입력

# 이후 pod 삭제—> 삭제되면 자동으로 replicas 개수만큼 다시 생성됨
$ kubectl delete pod {pod-name}

DaemonSet

DaemonSet은 앞서 소개한 ReplicaSet, Replica Controller와 같이 지속적인 POD 상태를 유지하기 위해 사용되는 컨트롤러 이다.
다만, 앞서 소개한 컨트롤러와의 차이점은 DaemonSet은 각 노드 당 1개의 POD만 유지 한채 클러스터에 전체(또는 일부) 노드에 배포하기 위해 사용된다.
DaemonSet을 설정하면 신규로 생성되는 노드의 경우 설정된 POD가 노드에 자동으로 띄워지며, 노드가 삭제되면 POD는 이동 없이 삭제 된다.

예를 들어, 로그 수집기나, 리소스 모니터와 같이 노드 내에서 특정 역할을 위해 1개 이상의 POD배포가 필요 없을 경우 해당 컨트롤러를 사용한다.

Replication Controller, ReplicaSet은 복제본의 개념이 있어 클러스터 내 원하는 수의 파드 복제본이 존재하지만, DaemonSet에선 복제본의 개념이 없다.
단지 파드 셀렉터와 일치하는 파드 하나가 각 노드에 실행 중인지 판단한다.

보통 특정 노드에 파드 1개만 배포하고자 할 경우 DaemonSet에 노드 셀렉터를 지정하거나
테인트 & 톨러레이션를 지정하여 배포할 노드를 지정하여 사용한다.

Taint

테인트는 한국말로 번역하면 오염시키다는 의미이다.
특정 노드마다 설정하는 옵션으로 노드에 Taint 옵션을 설정할 경우 이 노드를 오염(?)시켜 POD를 스케쥴하지 않는 다는 의미이다.

Taint에서 사용 할 수 있는 옵션은 3가지가 있다.

  • NoSchedule : toleration이 없으면 pod이 스케쥴되지 않음, 기존 실행되던 pod에는 적용 안됨
  • PreferNoSchedule : toleration이 없으면 pod을 스케줄링안하려고 하지만 필수는 아님, 클러스터내에 자원이 부족하거나 하면 taint가 걸려있는 노드에서도 pod이 스케줄링될 수 있음
  • NoExecute : toleration이 없으면 pod이 스케줄되지 않으며 기존에 실행되던 pod도 toleration이 없으면 종료시킴.

Toleration

톨러레이션은 한국말로 번역하면 용인, 관용의 의미이다.
동일하다 노드마다 설정하는 옵션으로 위에서 설정한 테인트를 무시시키는 옵션이다.

위 두가지 옵션을 통해 특정 노드를


Reference

https://etloveguitar.tistory.com/56

profile
Cloud Infra Structure & Developer

0개의 댓글