kubernets

 

드디어 Configuration 의 마지막 장인 Node Selectors 까지 왔다.

 

Node Selectors

  • 하나의 클러스터는 여러개의 노드를 가질 수 있다.
  • node 에 미리 label 을 설정하여, 파드의 매니페스트 필드에 node selector 를 설정할 수 있다.

 

생각보다 간단한 개념이었는데.. 실습을 해본다면

 

# 우선 node 에 Label 을 설정해본다. (Taint 설정이랑 비슷..)
$ kubectl label nodes <node-name> <label-key>=<label-value>

# ex)
$ kubectl label nodes node-1 size=Large

 

매니페스트 파일에는 다음과 같이 설정한다.

 

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
  nodeSelector:
    size: Large

 

하지만 보다시피 단순히 Label 을 지정하는 것과는 별다를 바가 없어 보여서,

좀 더 복잡하게 (예를들면 Not Small 이나 Large or Medium 같은) 설정을 해보고 싶다면 Node Affinity 의 개념을 알아야 한다고 한다.

 

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx:1.14.2
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: size
          
            # Large, Medium 노드에 생성
            operator: In
            values:
            - Large
            - Medium
            
            # Not Small
            operator: NotIn
            values:
            - Small
            
            # key 필드만 있는 경우
            operator: Exists
            
            # key 필드가 없는 경우
            operator: DoesNotExist

 

매니페스트가 상당히 복잡해졌다.

이걸 다 외운다면 바보같은 짓이다. 왜냐하면 알 수 있는 다양한 방법이 있다.

예를 들면 kubectl explain pods --recursive | less 를 통해 검색해서 보는 방법이라던지, 공식 매뉴얼을 보면 된다.

 

Node Affinity 에서 사용하는 상태에는 2가지가 있다.

  • requiredDuringSchedulingIgnoredDuringExecution
  • preferredDuringSchedulingIgnoredDuringExecution:

 

간단히 말해서 두가지 타입의 차이는,

  • required 는 해당 하는 조건의 노드가 없으면 스케줄링 되지 않는다.
  • preferred 는 해당 하는 조건의 노드가 없으면 사용 가능한 노드 아무곳에 스케줄링 된다.

라는 것이다.

 

추가적으로, 

DuringScheduling 은 파드가 존재하지 않고 처음 생성될 때를 의미하고,

DuringExecution 은 파드가 실행 중 or 변경이 되었을 때를 의미한다.

 

IgnoredDuringExecution 은 실행 중이거나 변경이 되었을 때는 무시되지만

RequiredDuringExecution 은 변경하거나 실행 중인 파드의 노드변경이 될 수 있다.

 

추후엔 requiredDuringSchedulingRequiredDuringExecution 타입도 나올 예정이라고 한다.

 

이렇게 해보고 나니, 노드를 선택한다는 점에서 Node Selectors & Node Affinity 와 Taints & Toleration 은 서로 조금 비슷하지만 차이가 있다.

 

Taints & Toleration

  • Toleration을 가진 파드가 Taints를 가지고 있는 노드로 유인한다.
  • Toleration을 가진 파드가 다른 노드에 붙을 수도 있다.

비유하자면 민들레(Taints를 가지고 있는 노드)은 꿀벌(Toleration을 가진 파드)을 유인한다.

하지만 꿀벌호박꽃(Taints가 없는 노드)도 좋아한다.

 

빨간 파드를 주목

 

Node Selectors & Node Affinity

  • 어피니티가 없는 파드가 특정 라벨을 가지고 있는 노드에 붙을 수 있다.

비유하자면 꿀벌을 좋아하는 꽃(Label 을 가지고 있는 노드)에 파리(그냥 파드)가 올 수도 있다.

(너무 극단적인가.. 파리라니)

 

빨간 노드를 주목

 

결론은, Taints와 Label(Node Affinity)를 적절히 써서 원하는 동작을 하게끔 유도해야한다는 것이다.

 

ps. 이번달 안에 5장을 완료하고, 13장 까지 있지만 이론은 8장 까지라

4월 말에는 충분히 시험을 치를 수 있을 것 같다.

 

열심히 달려보자~