반응형
kubectl label node … 는 “이미 존재하는 노드”에만 수동 적용이라
👉 오토스케일링으로 새로 뜨는 노드에는 절대 자동 적용 안 됨 ❌
1️⃣ 원칙 한 줄 요약
GPU 타입 라벨은 Node가 아니라 NodePool / AutoScalingGroup에 붙인다
2️⃣ Managed Kubernetes (정답 루트)
✅ NCP / EKS / GKE 공통 개념
Node Pool
├─ 인스턴스 타입: A100
├─ 오토스케일링
└─ 공통 라벨 (nodeLabels)
├─ 인스턴스 타입: A100
├─ 오토스케일링
└─ 공통 라벨 (nodeLabels)
👉 새 노드가 생길 때 kubelet 시작 시 자동 부착
🔹 NCP Kubernetes (GPU 노드풀)
콘솔 / API 설정 개념
nodeLabels:
gpu.vendor: nvidia
gpu.model: A100
gpu.mem: 80gb
gpu.pool: train
gpu.vendor: nvidia
gpu.model: A100
gpu.mem: 80gb
gpu.pool: train
👉 오토스케일링으로 생성되는 모든 노드에 자동 적용
📌 이게 실무 정답
🔹 AWS EKS (참고)
managedNodeGroups:
- name: gpu-a100
labels:
gpu.vendor: nvidia
gpu.model: A100
- name: gpu-a100
labels:
gpu.vendor: nvidia
gpu.model: A100
🔹 GKE
--node-labels=gpu.model=A100,gpu.pool=train
3️⃣ 온프레미스 / kubeadm 클러스터
여기서는 부트스트랩 단계에서 박아야 함
방법 ① kubelet extra args (정석)
--node-labels=gpu.vendor=nvidia,gpu.model=A100,gpu.mem=80gb
kubeadm 예시
kind: InitConfiguration
nodeRegistration:
kubeletExtraArgs:
node-labels: "gpu.vendor=nvidia,gpu.model=A100,gpu.mem=80gb"
nodeRegistration:
kubeletExtraArgs:
node-labels: "gpu.vendor=nvidia,gpu.model=A100,gpu.mem=80gb"
👉 노드 재부팅 / 재가입해도 유지됨
방법 ② Cluster Autoscaler + Launch Script
#!/bin/bash
kubeadm join ...
kubectl label node $(hostname) gpu.model=A100
kubeadm join ...
kubectl label node $(hostname) gpu.model=A100
❌ 비추천
(타이밍 이슈, race condition)
4️⃣ 절대 비추천 패턴 🚫
| 방법 | 이유 |
| kubectl 수동 라벨 | 오토스케일링 깨짐 |
| Admission Webhook | 노드엔 적용 안 됨 |
| Pod 기반 라벨링 | 의미 없음 |
| DaemonSet 라벨링 | 권한/순서 문제 |
5️⃣ GPU 타입 분리의 “완성형” 구조
NodePool: gpu-a100-train
├─ labels:
│ ├─ gpu.model=A100
│ ├─ gpu.mem=80gb
│ └─ gpu.pool=train
├─ taints:
│ └─ gpu=true:NoSchedule
└─ autoscaling: enabled
├─ labels:
│ ├─ gpu.model=A100
│ ├─ gpu.mem=80gb
│ └─ gpu.pool=train
├─ taints:
│ └─ gpu=true:NoSchedule
└─ autoscaling: enabled
Pod (TFJob):
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu.model
operator: In
values: [A100]
tolerations:
- key: gpu
operator: Equal
value: "true"
effect: NoSchedule
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: gpu.model
operator: In
values: [A100]
tolerations:
- key: gpu
operator: Equal
value: "true"
effect: NoSchedule
👉 라벨 + Taint + Affinity 삼종 세트
6️⃣ 검증 방법 (운영 필수)
# 새로 뜬 노드 확인
kubectl get node --show-labels | grep gpu.model
# TFJob Pod 배치 확인
kubectl get pod -n ml -o wide
kubectl get node --show-labels | grep gpu.model
# TFJob Pod 배치 확인
kubectl get pod -n ml -o wide
🔥 최종 결론
오토스케일링 환경에서 GPU 라벨을 kubectl로 직접 붙이는 건 “임시 처방”일 뿐이고,
정답은 NodePool / ASG 레벨에서 선언하는 것이다.
반응형
'[GPUaaS] > TensorFlow' 카테고리의 다른 글
| [중요2] 운영 표준 - TFJob.yaml (라벨/MIG/RWO/S3 적용) (0) | 2026.01.28 |
|---|---|
| [중요2] 운영 표준 - ☸️ Kubernetes + TensorFlow 구동 원리 (0) | 2026.01.28 |
| [중요2] 운영 표준 - GPU 노드 라벨 세트 (0) | 2026.01.28 |
| [GPU 타입] 운영 무중단 - 라벨 NodePool 등록 (1) | 2026.01.27 |
| [GPU] Node Affinity + GPU 타입 분리 (A100 / H100) (0) | 2026.01.26 |
| [GPU] requests = limits가 좋은 이유 (0) | 2026.01.26 |
| [TF 분산학습] 스토리지 관점 + TensorFlow 내부 동작 (0) | 2026.01.26 |
| [쿠버네티스 워크로드 개념] TFJob / CronJob / Job / Deployment / Pod (0) | 2026.01.26 |
댓글