Kubernetes dedicated node pattern for Daemonsets

deploy Daemonset to dedicated nodes

k8s를 운영하다 보면 전용 노드를 사용할 필요성을 느낄때가 있습니다. 특정 기능을 수행하기 위해서 라던지 아니면 특정 포트를 hostport 혹은 hostnetwork등으로 독점적으로 사용하던지 등의 경우들입니다. 이럴땐 Deployment보다 Daemonset을 이용하면 노드당 1개의 pod을 띄우기 때문에 쉽게 해당 노드들에 특정 기능을 수행하게 할 수 있으나 Daemonset의 특성상 모든 node에 들어가게 되거나 아니면 내가 원하는 특수한 node에 들어가지 못하는 경우 들이 있습니다.

그래서 이런 경우를 해결하기 위한 가이드를 작성해 봤습니다. 우선 이번 글은 전용 노드(Daemonset들이 정확하게 그 node에만 구성)를 만드는것을 설명합니다.

예를 들면 위와 같이 왼쪽 pod은 왼쪽 2개의 node에 스케쥴링이 되길 원하고, 오른쪽 pod은 오른쪽 2개의 node에 스케쥴링 되고 싶어하는 상태를 가정합니다.

label & nodeSelector

우선 labelnodeSelector는 위와 같은 역할을 합니다. 왼쪽과 같이 만약 nodeSelector가 있는 pod(daemonset)일 경우 해당하는 label이 있는 node에만 스케쥴링 가능합니다. 오른쪽 pod과 같이 만약 nodeSelector가 없으면 결국 모든 node에 배포 됩니다.

즉, node에 label을 해둔다면 특정 nodeSelector가 있는 pod들을 스케쥴링 가능합니다. 하지만 아직도 nodeSelector가 없는 pod들이 스케쥴링 되는 문제가 남아 있습니다.

taint & toleration

tainttoleration은 개인적으로 이 단어를 각각 오점관용으로 해석해서 기억하고 있습니다.

특정한 오점을 가진 node를 수용할 수 있는 관용을 가진 pod이 스케쥴링 될 수 있다.

여기서는 저 말뜻과 같이 특정 taint가 걸려 있으면 toleration을 갖지 못한 pod들은 스케쥴링이 되지 못합니다. 즉, 저런 toleration을 가진 pod들만 taint을 가진 노드를 포함한 모든 노드에 스케쥴링 가능합니다.

만약 이기능을 사용하면 특정 pod들을 들어오지 못하게 하는 노드들을 생성 할 수 있으나 아직도 toleration이 있는 pod들이 다른 노드에도 스케쥴링 되는 문제가 있습니다.

label & nodeSelector + taint & toleration

즉, 이정도만 설명하면 눈치채시겠지만 이 두 기능을 섞으면 정확히 원하는 pod(Daemonset)을 원하는 노드에 스케쥴링 시킬 수 있습니다. 이런 방법들을 응용하면 또한 여러 가지 방법으로 사용가능하니 여러 패턴을 생각해보는 것도 좋을 것 같습니다.

label & selector와 taint & toleration

다시 한번 정리하면 아래와 같습니다.

node labeled node not labeled
matched selector O X
not matched selector X X
node tainted node not tainted
matched toleration O O
not matched toleration X O
node labeled node not labeled
NO selector O O
node tainted node not tainted
NO toleration X O

위와 같은 패턴을 이용해서 ingress node등을 구성하는 등의 패턴으로 이용할 수 있습니다. 추가로 아래 발표했던 자료를 참고해 보시면 조금 더 도움이 될것 같습니다.