요약
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만 올라오는 완전한 격리가 완성된다.
'DevOps' 카테고리의 다른 글
| Karpenter + Spot 조합을 알아보자 (2) (0) | 2026.05.15 |
|---|---|
| Karpenter + Spot 조합을 알아보자 (1) (0) | 2026.05.13 |
| EKS에서 파드에 AWS 권한 부여하는 3가지 방법 (0) | 2026.05.10 |
| MSK Connect + Debezium 이용하여 CDC 파이프라인 구축 (0) | 2026.05.07 |
| Karpenter 이해하기 (0) | 2026.05.07 |