Descheduler ๋์ ์ ํตํ K8s ํด๋ฌ์คํฐ ๋ฆฌ์์ค Drift ์๋ ์ต์ ํ
๐งน Keeping Your Kubernetes Cluster Clean with the Descheduler
AI ์์ฝ
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) ์ต์ ํ