106. 테인트(Taint)와 톨러레이션(Toleration) - K8s 스케줄링 거부와 용인
⚠️ 이 문서는 쿠버네티스 클러스터에서 1번 노드(서버)가 딥러닝 AI 연산을 위해 1,000만 원짜리 초고가 GPU(그래픽카드)를 달아놨는데, 건방진 'Nginx 웹 서버 파드' 같은 싸구려 잡동사니들이 허락도 없이 이 비싼 1번 서버로 굴러들어와 램을 뺏어 먹는 재앙을 막기 위해, **노드(서버 기계)에는 "아무 파드나 들어오지 마!"라고 고약한 냄새(Taint, 흠집)를 뿌려놓고, 오직 이 냄새를 견딜 수 있는 '내성(Toleration, 백신)'을 가진 특별한 VIP 파드들만 그 노드에 찰떡같이 스케줄링되게 만드는 철벽같은 통제 기법인 '테인트와 톨러레이션'**을 다룹니다.
핵심 인사이트 (3줄 요약)
- 본질: 파드(세입자)가 방을 고르는 게 아니라, 노드(방주인)가 파드를 발로 차서 거부(Repel)하는 방어적 스케줄링 기술이다.
- 가치: 특정 워커 노드를 모니터링 전용, GPU 전용, 또는 사장님 전용 등 '특별한 목적(Dedicated)'으로만 깨끗하게 격리하여 사용하고 싶을 때, 잉여 잡다한 파드들이 섞여 들어오는 것을 100% 물리적으로 차단하는 가장 훌륭한 바리케이드다.
- 기술 체계: 쫓아내는 주체인 노드에 바르는
Taint(독가스), 그리고 쫓겨나지 않으려고 파드 뱃속에 달아주는 방독면인Toleration(내성/용인). 이 두 개의 톱니바퀴가 열쇠와 자물쇠처럼 완벽하게 스펠링이 맞아야만 비로소 노드 위로 파드가 사뿐히 안착한다.
Ⅰ. 야생의 스케줄러와 VIP 노드의 붕괴
K8s는 눈이 멀었다. 방만 비어 있으면 아무나 쑤셔 넣는다.
- 기본 스케줄러의 무차별적 배정:
- 노드 1번은 100만 원짜리 일반 CPU 깡통 서버다. 노드 2번은 1,000만 원짜리 A100 GPU가 4개 박힌 최고급 서버다.
- 주니어 개발자가 그냥
nginx파드 10개를 띄웠다. K8s의 스케줄러는 1번, 2번 노드의 가격 차이 따위는 관심이 없다. "어? 2번 방 텅 비었네?" 하면서 싸구려 웹 서버 파드 5개를 비싼 2번 GPU 노드에 쑤셔 넣는다. - 정작 진짜 딥러닝 학습을 돌려야 할 AI 파드가 들어오려니 2번 방이 꽉 차서(Pending) 학습이 멈춰버리는, 수천만 원의 클라우드 요금이 공중 분해되는 대형 사고가 터진다.
- 테인트 (Taint: 노드에 뿌리는 독가스):
- 관리자(DBA)가 눈이 뒤집혀 터미널을 연다.
kubectl taint nodes node2 gpu=true:NoSchedule - 이 명령어 한 줄이 2번 노드 건물 전체에 **'독가스(Taint)'**를 뿜어낸다.
- 냄새의 룰(
NoSchedule)은 지독하다. "지금부터 방독면(Toleration)이 없는 모든 파드는 이 노드에 얼씬도 하지 마라! 오면 K8s가 발로 차서 쫓아낼 것이다!"
- 관리자(DBA)가 눈이 뒤집혀 터미널을 연다.
📢 섹션 요약 비유: 1번 노드는 싸구려 국밥집이고, 2번 노드는 1인당 50만 원짜리 미슐랭 식당입니다. 쿠버네티스(관광 가이드)는 멍청해서 동네 잼민이들(잡다한 파드)을 2번 식당에 몽땅 밀어 넣어 자리를 차지하게 만듭니다. 참다못한 식당 사장님(관리자)은 식당 문에 "정장(Toleration) 입은 사람 외 절대 출입 금지(Taint)"라는 무시무시한 빨간 경고 딱지를 붙여버렸습니다. 이제 츄리닝 입은 잼민이들은 2번 식당 근처엔 얼씬도 못 하고 1번 국밥집으로만 도망치게 되는 무자비한 입구 컷 통제 시스템입니다.
Ⅱ. 톨러레이션 (Toleration): 독가스를 뚫는 방독면
독가스를 뿜었다면, 내 새끼에게는 해독제를 쥐여줘야 들어간다.
- 내성(방독면)의 부여:
- 2번 노드(GPU 서버)에 테인트(독가스)를 뿌려놨으니, 이제 아무 파드도 못 들어간다.
- 진짜 GPU가 필요한 'AI 딥러닝 파드'를 띄울 시간이다. 이 파드의
yaml파일 설정 창을 연다. tolerations: - key: "gpu", operator: "Equal", value: "true", effect: "NoSchedule"이라는 4줄짜리 코드를 적어 넣는다. 이것이 바로 이 파드에게 **'방독면(Toleration)'**을 씌워준 것이다.
- 매칭과 무혈입성:
- K8s 스케줄러가 이 AI 파드를 들고 2번 노드 앞으로 간다. 2번 노드는
gpu=true라는 독가스를 뿜고 있다. - 스케줄러가 파드 뱃속을 뒤져본다. "오호, 이 파드는
gpu=true독가스를 마셔도 안 죽는 완벽히 똑같은 규격의 방독면(Toleration)을 끼고 있네?" - 결국 1만 개의 다른 파드들은 냄새를 못 참고 튕겨 나갔지만, 방독면을 쓴 이 VIP AI 파드 하나만이 유유히 2번 노드에 사뿐히 안착(Schedule)하여 비싼 GPU 자원을 100% 독점하며 행복하게 학습을 시작한다.
- K8s 스케줄러가 이 AI 파드를 들고 2번 노드 앞으로 간다. 2번 노드는
📢 섹션 요약 비유: 식당 문에 붙은 "정장(Taint) 안 입으면 출입 금지" 푯말을 보고 모든 손님이 도망갔습니다. 이때 진짜 돈 많은 VIP 손님(AI 파드)이 최고급 아르마니 정장(Toleration)을 쫙 빼입고 식당 문을 엽니다. 웨이터(K8s 스케줄러)가 복장을 스캔하고 "아이고 VIP님 오셨습니까! 복장 규정과 100% 일치하시네요!" 라며 문을 활짝 열어주고, 식당 전체를 대관한 것처럼 조용하고 넓게 쓰도록 모시는 환상적인 드레스 코드 매칭 기술입니다.
Ⅲ. 노드의 3가지 테인트 효과 (Effect)
"안 들어온 놈만 쫓아낼까, 아니면 이미 들어와 있던 놈도 목을 쳐서 쫓아낼까?"
- NoSchedule (가벼운 입구 컷):
- 가장 자비롭고 많이 쓰이는 효과다.
- 새로 들어오려는 놈들 중 방독면이 없는 놈들만 100% 입구에서 튕겨내 배정(Schedule)을 막는다.
- 하지만 맹점이 있다. 내가 2번 노드에 독가스(Taint)를 뿌리기 '직전'에, 이미 2번 노드에 알박기하고 살고 있던 멍청한 Nginx 파드들은 어떻게 될까?
NoSchedule은 자비롭기 때문에 "이미 들어와 있던 놈들은 방독면이 없어도 봐준다. 그냥 살게 냅둔다." (방 빼지 않음).
- NoExecute (무자비한 방 빼기 / 학살) $\star$:
- 관리자가 눈이 뒤집혔을 때 쓴다.
- 노드에
NoExecute테인트를 뿌리는 순간, 새로 들어오려는 놈을 막는 것은 물론이고, "지금 방독면 없이 이 노드에 살고 있는 모든 세입자(기존 파드)들을 단 1초의 망설임도 없이 그 즉시 죽여버리고(Evict) 노드 밖으로 쫓아낸다!" - 쫓겨난 불쌍한 파드들은 빈 공간이 있는 1번 노드 국밥집으로 허겁지겁 도망가 다시 태어난다. 보안 사고가 났거나 노드를 완전히 비워버리고(Drain) 서버를 물리적으로 꺼야 할 때 쓰는 가장 강력한 무기다.
- PreferNoSchedule (부드러운 권고):
- "웬만하면 방독면 없는 애들은 다른 방으로 가라~ 근데 정 다른 방이 다 꽉 차서 터질 것 같으면, 어쩔 수 없지. 우리 방으로라도 들어와."
- 쫓아내긴 하되, 클러스터 전체 공간이 모자란 극한 상황에서는 융통성을 발휘해 임시로 거주를 허락해 주는(Prefer) 아주 부드러운 정책이다.
📢 섹션 요약 비유: 식당 사장님의 3가지 쫓아내기 룰입니다. NoSchedule은 "지금부터 추리닝 입은 손님은 새로 안 받아! 단, 이미 홀에 들어와서 밥 먹고 있는 추리닝 손님들은 쫓아내면 정 없으니까 그냥 냅둬라"입니다. NoExecute는 사장님이 극대노한 상태입니다. "추리닝 입은 놈들은 새로 못 들어오는 건 당연하고, 지금 입에 밥 넣고 있는 추리닝 손님들 당장 멱살 잡고 밖으로 다 집어 던져버려!"라는 피도 눈물도 없는 소탕 작전입니다. PreferNoSchedule은 "추리닝 손님은 옆 가게로 보내! 근데 옆 가게가 만석이라 비 오는데 손님 밖에서 얼어 죽게 생겼으면 그냥 우리 가게 구석에 좀 받아줘라"라는 융통성 넘치는 권고 사항입니다.