[Kubernetes] 데몬셋

안녕하세요? 정리하는 개발자 워니즈 입니다. 이번시간에는 쿠버네티스 데몬셋에 대해서 알아보는 시간을 갖겠습니다.

DaemonSet은 모든(혹은 몇몇의 지정된) Node들에 특정 Pod 한개를 유지시켜주는 Controller입니다.

동작방식은 Node들이 Cluster내에 추가될 때, DaemonSet으로 정의된 Pod가 자동으로 생성됩니다. 반대로 Node가 Cluster내에서 삭제 가 된다면, DaemonSet에 대한 Pod가 자동적으로 제거가 됩니다.

보통 이런 특성 때문에 DaemonSet은 Cluster내의 logging 및 자원 모니터링과 같은 곳에 효과적으로 사용될 수 있습니다.

쉽게 이야기해서, Node가 신규로 Cluster내에 들어올때 Monitoring과 같은 Container를 띄워서 내부 Pod들을 감시하도록 설계하는 것입니다. 모든 노드의 Pod들을 모니터링하는 역할은 반드시 필요하겠지요?

그래서 데몬셋은 Node에 무조건적으로 있어야하고 특수한 역할을 하는 Container에 대해서 적합합니다.

1. 데몬셋 스펙 작성

DaemonSet의 Spec은 앞서서의 Deployment, Pod의 스펙과 크게 다르지 않습니다.

  • ## 데몬셋 생성

작성한 daemonset yaml파일을 쿠버네티스 클러스터에 배포합니다.

확인 결과

2. 특정 노트에서의 Pods 실행

데몬셋 자체는 Pod를 관리한다는 점에서 Deployment와 유사하지만, 모든 노드 혹은 특정노드에만 스케쥴링이 가능하다는 장점이 있습니다.

  • node selector
  • node affinity
  • taint & toleration

위의 3가지 개념에 대해서 정리해보도록 하겠습니다.

  1. node selector
    Selector로 지정된 label 과 Node에 지정된 label이 매칭되는 Node에만 Pod를 배포
  2. node affinity
    affinity로 지정된 Node 명과 일치된 Node명에만 Pod가 배포
  3. taint & toleration
    Taints가 지정된 Node에는 tolerations이 매칭되는 Pod만 배포할 수 있음.

위의 config를 지정하지 않으면 모든 Node에 대해서 데몬셋 컨트롤러가 동작하여 Pod를 전체 Node에 배포합니다.

nodeSelector는 nodeSelector로 지정된 Lavel로 Node에 정의된 Lavel이 매칭되는 Node를 찾아서 스케쥴링 하는 기능으로 위의 예제에서 nodeSelector를 추가하고 node1에 Lavel을 추가하여 Pod가 node1 노드에만 배포되는 과정을 실습해보겠습니다.

  1. Node에 app: dev라는 레이블을 추가합니다.

  1. DaemonSet Controller에 app:dev을 추가합니다.

  1. daemonset, pod를 조회해 결과를 확인해보면 Pod의 갯수가 1개로 줄어들었음을 확인 할 수 있습니다.

  • ## .spec.template.spec.affinity

affinity또한 nodeSelector와 마찬가지로 affinity로 선언된 Node를 매칭하는 매커니즘으로 동작하지만 nodeSelector와는 다르게 표현식을 사용해 Node의 Lavel과 매칭시킬 수 있는 특징이 있습니다.

예를 들어 아래와 같이 affinity를 정의하면 Node에 정의된 Lavel 중 kubernetes.io/hostname=node1에 매칭되는 Node에 스케쥴링이 이루어지게 됩니다. 자세한 내용은 node affinity를 참고바랍니다.

  • ## taint & toleration

toleration을 가진 Pod들만 taint를 가진 Node를 포함한 모든 노드에 스케쥴링되는 개념으로 taint & toleration로 스케쥴되는 과정은 설명하기 까다로운 부분이 있어, 예시로 대신하겠습니다.

우선 최초 위의 예제에서 Pod를 조회해보면 모든 노드에 배포되는 것을 확인할 수 있습니다.

보통 컨테이너를 배포하면 replica숫자에 맞춰서 모든 노드들에 배포가 진행이 됩니다. 마스터노드는 통상 배포가 되지 않는데, 기본적으로 컨테이너는 master node에 배포되지 않도록 설정되어 있습니다. 그 이유는 master node에 taint 가 설정되어 있기 때문입니다.

만약 master node에도 컨테이너를 배포하기 위해서는 pod에 master node에 설정된 taint에 해당되는 toleration을 추가해 주어야합니다.

즉 toleration을 가진 Pod들만 taint를 가진 Node를 포함한 모든 노드에 스케쥴링이 가능합니다.

3. 마치며…

이번시간에는 데몬셋 에 대해서 알아보는 시간을 갖었습니다. 데몬셋을 활용하면, Node가 추가 되더라도 기본적으로 수행되어야 하는 업무(로깅, 모니터링 등)에 대해서 수행하는 Pod를 띄울 수 있습니다.

또한, 그 Pod가 어떠한 특정 노드에서만 실행되게도 제어가 가능합니다. 이렇게 기본 Pod를 셋팅하고 특정 노드까지 제어해줌으로써 자동적으로 worker 노드가 Join이 되어도 기본적인 업무 수행이 가능해집니다.

다음 이시간에는 Helm에 대해서 알아보는 시간을 갖도록 하겠습니다.

댓글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다