[Kube] Node, Node Pool, Taint, Label
ACK Serverless 를 사용하는 경우에는 클라우드에서 제공하는 노드를 자동으로 사용하게 된다. 그런데 GPU나 ARM 처럼 특정한 장비를 운용하고 싶은 경우에는 Node 와 Node Pool 이라는 개념을 공부하게 된다.
Node
ACK 에서 애플리케이션을 실행하는 유닛이다. 물리 장비일수도 있고 VM 일수도 있다. 애플리케이션 실행에 필요한 CPU, 메모리, 네트워크 리소스를 제공한다.
Node 에는 kubelet, kube-proxy 같은 쿠버네테스 컴포넌트가 설치되어 있어 일반 컴퓨터처럼 노드 위에 여러개의 컨테이너를 실행할 수 있다.
Node Pool
동일한 스펙을 가진 노드를 묶어서 관리할 수 있는 툴이다. 클라우드 환경에서 노드를 생성하고 관리하는데 이용되며 일반적으로 클러스터에는 한개 이상의 노드풀이 존재한다.
노드풀을 이용하면 고성능 노드와 일반 노드를 따로 구성하고 애플리케이션마다 성격에 적합한 리소스를 할당해줄 수 있다. 인공지능 서비스처럼 GPU 리소스가 필요한 애플리케이션의 경우에는 GPU 장비가 설치된 노드에 할당하고 ARM 위에 돌아야 하는 애플리케이션의 경우에는 ARM 장비의 노드에 할당하도록 만드는 방식이다.
노드풀을 이용하면 노드를 쉽게 추가, 삭제할 수 있다. 클라우드 서비스마다 노드의 auto scaling 옵션을 제공한다.
Taint
노드에는 Taint 라는 옵션을 설정해서 노드에서 실행될 수 있는 Pod 을 지정할 수 있다.
kubectl taint nodes node1 dedicated=teamA:NoSchedule
node1 에 dedicated 라는 키와 teamA 라는 값을 가진 taint 를 추가한다.
NoSchedule 은 taint 값을 갖고 있지 않는 Pod은 스케줄링 되지 않게 하겠다는 뜻이다. NoSchedule 은 새로운 Pod 에 대해서만 규칙을 강제하고 기존에 있는 Pod 에 대해서는 예외를 적용한다.
하지만 NoExecute 옵션을 적용하면 기존에 있는 Pod 도 모두 방출(evict) 된다. PreferNoSchedule 은 노드에 스케줄링 되는것 가능한 피하지만 강제하지는 않는다. 만약 클러스터 리소스가 부족하면 taint 옵션이 없는 Pod 도 여기에 할당될 수 있게 된다.
NodeScheduel, NoExecute, PreferNoSchedule 옵션을 Effect 라고 말하는데 상황에 따라서 적절한 Effect 를 설정해야한다.
노드에는 이렇게 설정하고 Pod 에는 Toleration 옵션을 주면 taint 를 설정한 노드에서 실행될 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "teamA"
effect: "NoSchedule"
containers:
- name: example-container
image: nginx
그런데 여기서 실행될 수 있다는 말은 반드시 실행된다는 의미는 아니며 여전히 다른 노드에도 붙을 수 있다. Pod 가 특정한 taint 가 설정된 노드에서만 실행되고 하고 싶은 경우에는 라벨을 사용해야한다.
Label
노드의 리소스를 식별하기 위한 용도다. 특정한 조건을 갖고 있는 노드에 대해서 label 을 이용해 식별자를 부여할 수 있다.
kubectl label nodes node1 dedicated=teamA
node1 이라는 노드에 dedicated 라는 키와 teamA 라는 식별자를 부여했다.
노드를 설정하고나면 Pod 에 nodeSelector 옵션을 이용해서 특정한 노드에서 실행하도록 설정할 수 있다.
apiVersion: v1
kind: Pod
metadata:
name: example-pod
spec:
nodeSelector:
dedicated: "teamA"
tolerations:
- key: "dedicated"
operator: "Equal"
value: "teamA"
effect: "NoSchedule"
containers:
- name: example-container
image: nginx
Taint 와 Label 개념이 헷갈릴 수 있는데 간단히 Label 은 Pod 에서 식별자를 찾아가는 용도, Taint 는 노드에서 Pod을 구별하기 위한 용도라고 보면 될 듯 하다.