ํ”ผ๋“œ๋กœ ๋Œ์•„๊ฐ€๊ธฐ
๐Ÿงน Keeping Your Kubernetes Cluster Clean with the Descheduler
Dev.toDev.to
Infrastructure

Descheduler ๋„์ž…์„ ํ†ตํ•œ K8s ํด๋Ÿฌ์Šคํ„ฐ ๋ฆฌ์†Œ์Šค Drift ์ž๋™ ์ตœ์ ํ™”

๐Ÿงน Keeping Your Kubernetes Cluster Clean with the Descheduler

Hamdi (KHELIL) LION2026๋…„ 6์›” 26์ผ10๋ถ„intermediate

Context

kube-scheduler์˜ ๋‹จ๋ฐœ์„ฑ ๋ฐฐ์น˜ ๊ฒฐ์ •์œผ๋กœ ์ธํ•ด ๋…ธ๋“œ ์ถ”๊ฐ€, ๋ ˆ์ด๋ธ” ๋ณ€๊ฒฝ, ๋…ธ๋“œ ์žฅ์•  ๋“ฑ ๋™์  ํ™˜๊ฒฝ ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ๋ฆฌ์†Œ์Šค ๋ถˆ๊ท ํ˜• ๋ฐœ์ƒ. ์‹œ๊ฐ„์ด ํ๋ฅผ์ˆ˜๋ก ํŠน์ • ๋…ธ๋“œ์— ๋ถ€ํ•˜๊ฐ€ ์ง‘์ค‘๋˜๋Š” Hotspot ํ˜„์ƒ๊ณผ Affinity ๊ทœ์น™ ์œ„๋ฐ˜ ๋“ฑ ํด๋Ÿฌ์Šคํ„ฐ ์ƒํƒœ์˜ Entropy ์ฆ๊ฐ€๋กœ ์ธํ•œ ์šด์˜ ํšจ์œจ ์ €ํ•˜.

Technical Solution

  • Eviction API ๊ธฐ๋ฐ˜์˜ ๊ฐ„์ ‘ ์ œ์–ด ๊ตฌ์กฐ ์„ค๊ณ„๋กœ ๊ธฐ์กด kube-scheduler์™€์˜ ํ˜ธํ™˜์„ฑ ๋ฐ PodDisruptionBudgets(PDB) ์ค€์ˆ˜ ๋ณด์žฅ
  • Profiles ๋ฐ Plugins ์•„ํ‚คํ…์ฒ˜๋ฅผ ํ†ตํ•œ ์ „๋žต์  Pod ์ œ๊ฑฐ ๋กœ์ง ๋ถ„๋ฆฌ ๋ฐ ๊ฐœ๋ณ„ ์„ค์ • ๊ฐ€๋Šฅ ๊ตฌ์กฐ ์ฑ„ํƒ
  • LowNodeUtilization ๋ฐ HighNodeUtilization ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•œ ๋…ธ๋“œ ๊ฐ„ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋ฅ ์˜ ์ƒํ•œ ๋ฐ ํ•˜ํ•œ ๋ฐธ๋Ÿฐ์‹ฑ ๊ตฌํ˜„
  • RemoveDuplicates ๋ฐ TopologySpreadConstraint ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ†ตํ•œ ๊ณ ๊ฐ€์šฉ์„ฑ(HA) ๋ณด์žฅ์„ ์œ„ํ•œ Pod ๋ถ„์‚ฐ ๋ฐฐ์น˜ ๊ฐ•์ œ
  • Default Evictor์˜ nodeFit ์„ค์ •์„ ํ†ตํ•œ ๋Œ€์ฒด ๊ฐ€๋Šฅ ๋…ธ๋“œ ์กด์žฌ ์—ฌ๋ถ€ ๊ฒ€์ฆ ํ›„ Eviction ์ˆ˜ํ–‰์œผ๋กœ ๋ฌดํ•œ ๋ฃจํ”„ ๋ฐฉ์ง€
  • Dry run ๋ชจ๋“œ์™€ Prometheus ๋ฉ”ํŠธ๋ฆญ ๊ธฐ๋ฐ˜์˜ ๊ด€์ธก ๊ฐ€๋Šฅ์„ฑ์„ ํ™•๋ณดํ•˜์—ฌ ์‹ค์ œ ์ ์šฉ ์ „ ์˜ํ–ฅ๋„ ๋ถ„์„ ์ฒด๊ณ„ ๊ตฌ์ถ•

- [ ] RemoveDuplicates ๋ฐ LowNodeUtilization ํ”Œ๋Ÿฌ๊ทธ์ธ ์šฐ์„  ์ ์šฉ์„ ํ†ตํ•œ ๊ธฐ๋ณธ ๋ฐธ๋Ÿฐ์‹ฑ ๊ฒ€ํ†  - [ ] ๋ฌดํ•œ Eviction ๋ฃจํ”„ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด Default Evictor์˜ nodeFit: true ์„ค์ • ํ•„์ˆ˜ ํ™•์ธ - [ ] PDB ์„ค์ • ์ƒํƒœ๋ฅผ ์ ๊ฒ€ํ•˜์—ฌ Descheduler์— ์˜ํ•œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์„œ๋น„์Šค ์ค‘๋‹จ ๊ฐ€๋Šฅ์„ฑ ๋ฐฐ์ œ - [ ] Dry run ๋ชจ๋“œ ์‹คํ–‰ ํ›„ ๋กœ๊ทธ ๋ถ„์„์„ ํ†ตํ•ด ๋™์ผ Pod์˜ ๋ฐ˜๋ณต์  Eviction ๋ฐœ์ƒ ์—ฌ๋ถ€ ๊ฒ€์ฆ - [ ] ํด๋Ÿฌ์Šคํ„ฐ ์•ˆ์ •ํ™”๋ฅผ ์œ„ํ•ด CronJob ๋ชจ๋“œ ์ ์šฉ ์‹œ ์‹คํ–‰ ๊ฐ„๊ฒฉ(Interval) ์ตœ์ ํ™”

์›๋ฌธ ์ฝ๊ธฐ