ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Kube] Node, Node Pool, Taint, Label
    개발 2024. 11. 27. 21:46

    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을 구별하기 위한 용도라고 보면 될 듯 하다.

    댓글

Designed by Tistory.