- dMarc
- Datadog
- cloudnative
- aws ses
- DevOps
- kubernetesadmin
- Lambda
- gochannel
- SAA-CO2
- nodeaffinity
- kubernetesscheduling
- Kubernetes
- containerorchestration
- 메일 인증 프로토콜
- SPF
- SAA-CO3
- JVM
- go
- kubernetesstudyguide
- Java
- CKA
- K8S
- SMTP
- eventbridge
- EKS
- DKIM
- Certified Solutions Architect
- Fargate
- aws
- Today
- Total
DevOps Tasks
Kubernetes Taints, Tolerations, Node Affinity를 활용한 최적의 Pod 스케줄링 본문
Kubernetes의 세 가지 핵심 기능인 `taint`, `tolerations`, `nodeAffinity`를 개별적으로 사용할 때 발생할 수 있는 문제점들과, 이를 AWS 환경에서 GPU 노드, SSD 디스크 노드, 리전별 노드에 적용하여 복합적으로 사용하는 방법을 쉽게 이해할 수 있도록 설명해 드리겠습니다.
왜 세 가지 기능을 함께 사용해야 할까요?
Kubernetes에서 Pod 스케줄링을 제어하는 방법은 다양합니다.
그중에서도 `taint`, `tolerations`, `nodeAffinity`는 각각 고유한 역할을 합니다.
하지만 이들을 개별적으로 사용할 경우, 원하는 스케줄링 결과를 얻지 못할 수 있습니다.
1. `taint`와 `tolerations`만 사용할 때의 문제점
`taint`와 `tolerations`는 특정 노드에 Pod가 스케줄링되는 것을 제한하거나 허용하는 데 사용됩니다.
예를 들어, GPU를 사용하는 Pod가 GPU가 장착된 노드에만 배치되도록 설정할 수 있습니다.
문제 1: 노드의 세부 속성 미반영
`AWS`의 `p3 인스턴스`에 `dedicated=gpu:NoSchedule` 테인트를 적용했다고 가정해 봅시다.
이 설정은 GPU Pod만 해당 노드에 스케줄링되도록 합니다.
하지만 이 설정만으로는 그 노드가 SSD 디스크를 가지고 있는지, 특정 리전에 있는지 등을 제어할 수 없습니다.
쉽게 말해,
" 이 방에는 GPU Pod만 들어올 수 있어요! " 라고 표기했지만,
그 방이 SSD 디스크를 가지고 있는지, 특정 리전에 위치한 지도 신경 쓰지 못하는 상황입니다.
문제 2: Pod 간의 상호 배제 어려움
예를 들어, A 포드는 `p3 인스턴스`에만, B 포드는 `i3 인스턴스`에만 배치되도록 설정한다고 합시다.
`dedicated=blue:NoSchedule` 테인트를 `p3 인스턴스`에, `dedicated=red:NoSchedule` `taint`를 `i3 인스턴스`에 적용하면 됩니다.
하지만 동일한 `taint`를 공유하는 다른 Pod들도 같은 `tolerations`을 가지면, 원치 않는 Pod가 해당 노드에 스케줄링될 수 있습니다.
쉽게 말해,
" A 포드만 들어올 수 있어요 ! " 라고 표기했지만,
만약 다른 Pod들도 같은 조건을 만족하면, 원치 않는 Pod들이 그 방에 들어올 수 있는 상황입니다.
2. `nodeAffinity`만 사용할 때의 문제점
`nodeAffinity`는 Pod가 특정 노드에 배치되도록 규칙을 설정하는 데 유용합니다.
예를 들어, SSD 디스크가 필요한 Pod를 `i3 인스턴스`에만 배치할 수 있습니다.
문제 1: 노드의 상호 배제 제어 불가
`nodeAffinity`만 사용하면 Pod가 특정 노드에 배치되기는 하지만, 그 노드에 다른 Pod들이 들어오는 것을 막을 수 없습니다.
예를 들어, 파란색 포드가 p3 인스턴스에만 배치되도록 설정해도, 다른 색상의 포드들이 동일한 노드에 들어올 수 있습니다.
쉽게 말해,
" `p3 인스턴스`에만 GPU 파드가 들어올 수 있어요 ! " 라고 규칙을 설정했지만,
다른 유형의 파드들이 그 인스턴스에 들어오는 것을 막을 수 없는 상황입니다.
문제 2: 노드의 특정 제약 조건 미반영
특정 노드가 유지보수 중일 때, `nodeAffinity`만으로는 해당 노드에 Pod가 스케줄링되지 않도록 할 수 없습니다.
유지보수 중인 노드에 Pod를 배치하지 않으려면 별도의 제어가 필요합니다.
쉽게 말해,
" 이 방은 청소 중이라 잠시 동안 들어올 수 없어요 ! " 라고 설정했지만,
`nodeAffinity`만으로는 이를 반영할 수 없는 상황입니다.
세 가지 기능을 복합적으로 사용하는 이유
위의 문제점들을 해결하기 위해 `taint`, `tolerations`, `nodeAffinity`를 함께 사용하는 것이 중요합니다.
AWS 환경을 기준으로 어떻게 이들을 조합하여 문제를 해결할 수 있는지 살펴보겠습니다.
시나리오
- GPU 노드 (p3 인스턴스): 고성능 GPU가 탑재된 p3 인스턴스에 GPU를 필요로 하는 Pod만 스케줄링되기를 원합니다.
- SSD 디스크 노드 (i3 인스턴스): 고속 SSD 디스크가 탑재된 i3 인스턴스에 SSD를 필요로 하는 Pod만 스케줄링되기를 원합니다.
- 리전별 배치 (us-west-1 리전): 특정 리전(us-west-1)에 있는 노드에 우선적으로 Pod를 배치하고 싶습니다.
복합 사용의 해결책
`taint`, `tolerations`, `nodeAffinity`를 함께 사용하면 다음과 같은 이점을 누릴 수 있습니다.
정교한 제어
`taint`와 `tolerations`을 통해 노드의 특정 조건(예: GPU 노드)을 반영하고, `nodeAffinity`를 통해 노드의 다른 속성(예: 디스크 유형, 리전)을 추가로 제어할 수 있습니다.
우선순위 관리
`nodeAffinity`의 선호 조건을 통해 Pod가 우선적으로 특정 노드에 배치되도록 유도하면서, `taint`와 `tolerations`을 통해 필수 조건을 강제할 수 있습니다.
유연성과 안정성
복합적인 조건을 통해 클러스터의 자원을 효율적으로 관리하고, Pod의 성능과 가용성을 최적화할 수 있습니다.
복합 사용 예시
이를 구현하는 YAML 예시는 다음과 같습니다
# 이 Pod는 GPU 노드(p3 인스턴스)이면서 SSD 디스크를 가진 노드(i3 인스턴스)에 반드시 스케줄되고, 가능한 한 특정 AWS 리전(us-west-1)에 배치되도록 최적화됩니다.
apiVersion: v1
kind: Pod
metadata:
name: optimized-pod
spec:
tolerations:
- key: "dedicated"
operator: "Equal"
value: "gpu"
effect: "NoSchedule"
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: "disktype"
operator: "In"
values:
- "ssd"
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 2
preference:
matchExpressions:
- key: "zone"
operator: "In"
values:
- "us-west-1"
containers:
- name: optimized-container
image: optimized-image
설명
`tolerations`
`dedicated=gpu:NoSchedule` `taint`를 가진 `p3 인스턴스`에 스케줄 될 수 있도록 허용합니다.
`Required nodeAffinity`
`disktype=ssd` 레이블을 가진 `i3 인스턴스`에만 스케줄링됩니다.
`Preferred nodeAffinity`
가능한 한 `zone=us-west-1` 리전에 있는 노드에 우선적으로 스케줄링됩니다.
결론
Kubernetes에서 `taint`, `tolerations`, `nodeAffinity`는 Pod 스케줄링을 세밀하게 제어하는 중요한 도구들입니다.
이들을 개별적으로 사용하는 경우 발생할 수 있는 제약과 문제점을 이해하고, AWS 환경에서 이를 복합적으로 활용하면 클러스터 자원을 효율적으로 관리하고, Pod의 성능과 가용성을 최적화할 수 있습니다.
'Kubernetes' 카테고리의 다른 글
AWS Fargate에서 Pod Disruption Budget(PDB)로 OS 패치 대응하기 (0) | 2024.12.03 |
---|---|
[Kubernetes] AWS EKS에서 Kubernetes Pod별 보안 그룹 설정: 네트워크 보안 강화 (0) | 2024.12.03 |
[Kubernetes] Karpenter Spot Node 모니터링을 위한 EventBridge 설정 (0) | 2024.12.03 |
[Kubernetes] Karpenter 를 이용한 EKS 노드 그룹 관리 (0) | 2024.12.01 |
[Kubernetes] EKS CoreDNS 및 Kubelet 통신 문제 (0) | 2024.11.30 |