Taints와 Toleration

Taints사용시 노드의 관점에서 지정된 팟이외의 할당되지않는 걸 보장한다. 다만 팟의 입장에서 Taints가 걸려있어도 Toleration(용인)속성이 있다면 할당된다.

상기 기능은 지정된 팟을 지정된 노드에 할당하는 기능이 아니며 Affinity를 사용하면 가능하다.

Taints는 노드에서 kube-scheduler가 팟을 할당해줄때 받는 정책과 레이블을 지정한다.

아래 예시는 node1에 key: value 라는 Taints를 할당하며 Toleration 미충족시 정책은 NoSchedule로 지정하는 명령어이다.

1
kubectl taint nodes node1 key=value:NoSchedule

설정되면 지정한 레이블을 Toleration하지않는 팟에대해 아래와 같이 작동한다.

  • NoSchedule : 기존의 맞지않는 팟은 그대로 두고 앞으로 들어오는 요청에대해서 거부함
  • PreferNoSchedule : 위와같으나 모든 노드에서 배치할 공간이 없을때 허용(후순위 배치)
  • NoExecute : 기존 팟들도 정책에 맞지않은 팟들은 제거함

Toleration은 팟에 설정하는 것으로 노드에 Taints가 걸려있더라도 무시하고 할당하게 하는 속성을 의미한다.

pod의 spec에 toleration을 지정한다. toleration을 지정하는 방법은 두가지가 있는데 아래의 equals 연산자 사용과 집합연사자 사용이 있다.

1
2
3
4
5
tolerations:
- key: "key"
  operator: "Equal"
  value: "value"
  effect: "NoSchedule"

집합 연산자는 아래와 같이 동작한다.

  • In : Key가 존재하며 Value가 일치
  • NotIn: Key가 존재하며 Value가 불일치
  • Exist : Key가 존재 ```yaml tolerations:
  • key: "node.kubernetes.io/unreachable" operator: "Exists" effect: "NoExecute" ``` --------

Node Selector

팟에 NodeSelector를 설정하게되면 Node의 레이블과 정확히 일치하는 곳에만 배포된다. 다만 equals만 가능하며 Anti의 기능이 없으며 미할당시 옵션도 없기때문에 아래나오는 Affinity를 더 자주 사용한다

Affinity와 Anti-Affinity

Affinity/Anti-Affinity 는 아래의 operator를 지원한다.

  • Exists : 해당 key의 존재하는 경우
  • NotIn : 해당 key의 value가 일치하지 않는경우
  • in : 해당key의 value가 일치할 경우

Affinity는 해당 노드에 할당하는 것으로 Anti-Affinity는 할당되지 않도록 하는 것이다. 또한 Node Selector와 다르게 할당 옵션이 존재한다.

case DuringScheduling DuringExecution
1 required Ignored
2 required required
3 preferred Ignored
  • DuringScheduling
    • required : 주어진 조건에(operator) 만족하는 노드에만 할당, 없을시 미할당
    • preferred : 주어진 조건에(operator) 만족하는 노드에 우선 할당, 없을시 다른노드에 할당
  • DuringExecution
    • Ignored : 이미 배포된 팟에는 미적용
    • required : 이미 배포된 팟에도 적용, 미일치시 해당팟을 종료

Resource Requirements and Limits

Requirements는 요구조건으로 팟이 필요한 리소스의(cpu,mem,disk etc.) 최소치를 지정한다.

limit은 팟의 리소스 사용의 최대치를 지정한다. 팟이 사용할 수 있는 최대 리소스의 양은 아래와 같다.

1
 Requirement <= 사용가능한 자원의 양 <= Limit

cpu

  • 단위
    • 1cpu == 1 vcpu == 쓰레드
  • 초과시 Throttle상태가 된다.

mem

  • 단위
    • 1K = 1000bytes
    • 1Ki = 1024bytes
  • 초과시 강제 종료

default Requirement & Limit 지정하는법

아래 예시는 팟의 기본 메모리 하한과 상한을 각 256,512로 지정하는 예시이다.

아래 파일과 같이 작성 뒤 저장 후 kubectl apply -f {file-name.yaml}

mem

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

cpu

1
2
3
4
5
6
7
8
9
10
11
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container

팟배포시에도 상한과 하한을 지정할 수 있다. 지정시 아래의 규칙에 따른다.

  • 상한 하한 둘다 미지정시 : 둘다 기본값
  • 상한만 지정시 : 상한, 하한 모두 상한값
  • 하한만 지정시 : 상한은 기본값 하한은 지정된값