DevOps

노드에 파드 할당하기

YoonJong 2026. 5. 13. 13:54
728x90
반응형

요약

NodeSelector: Pod 주체 -> 나는 해당 Label이 있는 node로 갈거야.

Taint(필터/오염): Node 주체 -> 허락받지 않는 pod는 접근 불가.

Toleration(허가증): pod 주체 -> 해당 pod는 Taint를 견딜 수 있는 접근 권한이 있다.

 

*세 가지 종류는 각각 독립적으로 동작하지만, 셋을 조합해서 사용했을 때 의도한 대로 Pod를 격리하고 배치할 수 있다.

--

 

간단한게 생각하면 k8s에서는 pod를 적절한 노드에 배치하는 작업은 두 가지 메커니즘을 통해 이루어진다.

1. pod의 node 선택

2. node의 거부

--

 

NodeSelector 는 pod가 주체이며 node를 선택한다.

- pod 설정에 특정 노드 라벨 설정 

- k8s의 스케줄러는 pod의 요구사항과 node의 라벨을 대조하여 일치하는 노드에만 pod를 배치

 ㄴ 조건에 맞는 node가 없으면 pod가 pending 상태로 남는다.

 ㄴ 단순히 Label 일치여부만 본다 -> 복잡한 구조는 NodeAffinity 사용이 필요

 

karpenter를 특정 노드에 배치하는 예시

nodegroup: infra 라벨이 있는 노드에만 배치한다,

# nodeselector 사용
# === Karpenter Helm 설치 ===
resource "helm_release" "karpenter" {
  namespace  = "kube-system"
  name       = "karpenter"
  repository = "oci://public.ecr.aws/karpenter"
  chart      = "karpenter"

  wait    = true
  timeout = 300
  values = [
    <<-EOT
    nodeSelector:
      nodegroup: infra
    dnsPolicy: Default
    settings:
      clusterName: ${module.eks.cluster_name}
      clusterEndpoint: ${module.eks.cluster_endpoint}
      interruptionQueue: ${module.karpenter.queue_name}
    webhook:
      enabled: false
    EOT
  ]
}

--

 

Taints $ Tolerations 

 

Taints: 노드에 "오염"을 설정해서, 허가받지 않은 pod가 자원을 뺏지 못하게 방어.

- node가 주체가 되어 자신에게 맞지 않는 pod가 배포되는 것을 막는 방식

- Effect 종류

 ㄴ NoSchedule: 허가 설정이 없는 pod는 스케줄링 하지 않음

 ㄴ PreferNoSchedule: 가급적 피하지만, 자리가 없으면 배포 허용

 ㄴ NoExecute: 조건에 맞지 않는 기존 pod까지 밖으로 쫓아냄

# neo4j Pod가 아닌 pod들은 배치하지 않게 오염시킨다.
taints = [
  {
    key    = "dedicated"
    value  = "neo4j"
    effect = "NoSchedule" # Neo4j Pod 외 다른 서비스 스케줄링 방지
  }
]

 

Tolerations: Pod가 주체이며, Taint가 걸린 노드에 들어갈 수 있는 허가증.

- Tolerations이 있다고 해서 반드시 그 Node로 가는건 아니고, 자격만 얻는다.

tolerations:
- key: dedicated
  value: neo4j
  effect: NoSchedule
  operator: Equal

--

 

조합 방식 결과 및 특징
NodeSelector만 사용 포드는 특정 노드로 가려 함. 하지만 일반 포드들도 해당 노드에 들어올 수 있음 (격리 불가).
Taint & Toleration만 사용 일반 포드는 해당 노드에 못 들어옴. 하지만 전용 포드가 다른 일반 노드로 가버릴 수 있음.
전부 조합 (Best Practice) 완벽한 전용 노드(Dedicated Node) 구성 가능.
1. Taint로 일반 포드 차단
2. nodeSelector로 전용 포드를 해당 노드로 유도
3. Toleration으로 차단막 통과

 

세 가지를 조합하면 아래 흐름으로 완벽한 전용 노드가 구성된다.

 

1. Taint로 일반 pod 차단

2. nodeSelector로 전용 pod를 해당 node로 유도

3. Toleration으로 Taint 차단막 통과

  # Jenkins Pod 설정
  nodeSelector:
    nodegroup: jenkins      # jenkins 라벨이 있는 노드로만 이동
  tolerations:
    - key: dedicated
      value: jenkins
      effect: NoSchedule
      operator: Equal       # jenkins Taint를 가진 노드 진입 허용

  # Jenkins 전용 NodePool (Karpenter)
  taints = [
    {
      key    = "dedicated"
      value  = "jenkins"
      effect = "NoSchedule"  # Jenkins Pod 외 다른 Pod 스케줄링 방지
    }
  ]

 

이렇게 구성하면 Jenkins pod는 반드시 jenkins Node로만 가고, jenkins 노드에는 Jenkins Pod만 올라오는 완전한 격리가 완성된다.

728x90
반응형