본문 바로가기

Kubernetes

쿠버네티스 노드 스케줄링

매니페스트를 통해 쿠버네티스 사용자와 관리자는 노드 스케줄링을 할 수 있다.

 

일단 쿠버네티스 사용자가 배치하고 싶은 노르를 선택하는 방법이다.

종류 개요
nodeSelector(가장 단순한 노드 어피니티) 단순한 노드 어피니티 가능
노드 어피니티 특정 노드상에서만 실행
노드 안티어피니티 특정 노드 이외에서 실행
인터파드 어피니티 특정 파드가 존재하는 도메인(노드, 존 등)에서 실행
인터파드 안티어피니티 특정 파드가 존재하지 않는 도메인(노드, 존 등)에서 실행

 

쿠버네티스 클러스터에서 노드 리소스에는 노드의 PC정보 등이 라벨로 지정되어있다. 노드 스케줄링을 위해 사용자가 지정한 라벨을 추가로 부여할 수 있으면 명령어는 kubectl label node로 지정할 수 있다.

 

단순한 노드 어피니티만을 실행하는 경우 nodeSelector을 사용할 수 있다.

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-nodeselector
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
  nodeSelector:
    disktype: ssd

이런식으로 파드가 배포되면 생성된 파드는 disktype=ssd인 레이블이 부여된 노드임을 확인할 수 있다.

 

노드 어피니티

노드 어피니티(Node Affinity)는 파드를 특정 노드에 스케줄링하는 정책이다.

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
            - hdd
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: kubernetes.io/hostname
            operator: In
            values:
            - gks-k8s-default-pool
  containers:
  - name: nginx-container
    image: nginx:1.16

 

노드 어피니티는 필수 스케줄링 정책을 설정하는 requiredDuringSchedulingIgnoredDuringExecution과 우선 스케줄링 정책을 설정하는 preferredDuringSchedulingIgnoredDuringExecution로 나뉜다.

 

예제에서는 필수 조건으로 disktype이 hdd 일것과 우선 조건으로 kubernetes.io/hostname이 gks-k8s-default-pool일 것을 지정하고 있다

 

인터파드 어피니티

인터파드 어피니티는 특정 파드가 실행되는 도메인에 파드를 스케줄링하는 정책이다.

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: app
            operator: In
            values:
            - sample-app
        topologyKey: kubernetes.io/hostname
  containers:
  - name: nginx-container
    image: nginx:1.16

기본적으로 노드 어피니티와 구조가 비슷하지만 한 가지 크게 다른 점은 topologyKey가 추가된 부분이다. topologyKey는 어느 범위를 스케줄링 대상으로 할지를 지정한다. 예제를 보면 app=sample-app 레이블을 가진 파드가 실행되는 노드의 kubernetes.io/hostname과 같은 값을 가진 노드에 스케줄링한다는 의미이다. 예제에는 없지만 파드 어피니티에도 preferredDuringSchedulingIgnoredDuringExecution가 존재한다. 

 

인터파드 안티어피니티는 노드 안티어피니티와 다르게 spec.affinity.podAntiAffinity를 지정할 수 있게 되어 있다. labelSelector나 topologyKey 등 사용법은 동일하다.

 

 

테인트와 톨러레이션

지금까지의 노드/인터파드 어피니티는 파드를 스케줄링할 때 쿠버네티스 사용자가 특정 노드를 선택하는 스케줄링 정책이었다. 반면 테인트(Taints)와 톨러레이션(Tolerations)은 반대 개념으로 쿠버네티스 관리자가 배치하고 싶지 않은 노드를 저장하는 방법이다. 

 

테인트는 세 가지 파라미터를 사용한 Key=Value:Effect 형식으로 구성된다. 노드에 테인트를 부여하려면 kubectl taint 명령어를 사용한다.

 

# 특정한 한 대의 노드에 env=prd:NoSchedule 테인트를 부여
kubectl taint node gke-k8s-default-pool env=prd:NoSchedule

# 특정 레이블을 가진 모든 노드에 env=prd:NoSchedule 테인트를 부여
kubectl taint node -l kubernetes.io/os=linux env=prd:NoSchedule

# env를 키로 하는 테인트 삭제
kubectl taint node gke-k8s-default-pool env-

# env를 키로 하는 NoSchedule 테인트 삭제
kubectl taint node gke-k8s-default-pool env:NoSchedule-

 

부여된 테인트를 확인하려면 kubectl describe 명령어를 사용한다. Effect는 테인트와 톨러레이션이 일치하지 않을 경우의 동작이다. Effect는 총 세 종류가 있으며 PreferNoSchedule/NoSchedule/NoExecute 순서로 조건이 엄격해진다.

 

Effet 종류 개요
PreferNoSchedule 가능한 한 스케줄링하지 않음
NoSchedule 스케줄링하지 않음(이미 스케줄링된 파드는 그대로 유지)
NoExecute 실행을 허가하지 않음(이미 스케줄링된 파드는 정지됨)

 

PreferNoSchedule Effect는 가능한 한 스케줄링하지 않은 테인트 Effect지만 파드에 톨러레이션 설정이 없는 경우나 테인트에 일치하지 않은 경우에도 스케줄링 대상 노드가 된다.

 

NoSchedule Effect는 반드시 스케줄링하지 않는 테인트 Effect이다. 파드에 톨러레이션 설정이 없을 경우나 톨러레이션에 일치하지 않은 경우에는 스케줄링을 허가하지 않는다.

 

NoExecute Effect는 노드상에서 조건이 일치하지 않는 파드는 절대로 동작시키지 않는 테인트이며 이미 파드가 기동 중인 상태에서 테인트와 톨러레이션이 일치하지 않는 경우에도 바로 파드를 정지한다. 

 

톨러레이션은 Key/Value/Effect를 지정하고 테인트에서 부여된 Key/Value/Effect가 같은 경우에 조건이 일치한다고 판단하고 허용한다. 

 

apiVersion: v1
kind: Pod
metadata:
  name: sample-tolerations
spec:
  containers:
  - name: nginx-container
    image: nginx:1.16
  tolerations:
  - key: "env"
    operator: "Equal"
    value: "Pod"
    effect: "NoSchedule"

 

Key 조건식에 사용 가능한 오퍼레이터는 Exists 또는 Equal 중에서 선택할 수 있다. NoSchedule과 NoExecute의 경우 조건과 Effect 모두 일치할 경우에 스케줄링된다. PreferNoSchedule의 경우는 조건이 일치하지 않아도 스케줄링되지만 우선순위가 내려간다. 

'Kubernetes' 카테고리의 다른 글

쿠버네티스 헬름  (0) 2022.01.31
쿠버네티스 보안  (0) 2022.01.31
쿠버네티스 헬스 체크  (0) 2022.01.22
쿠버네티스 리소스 관리 및 오토 스케일링  (0) 2022.01.08
쿠버네티스 볼륨  (0) 2022.01.02