์ปค์Šคํ…€ ์Šค์ผ€์ค„๋ง ๊ทœ์น™ ์„ธํŠธ๋กœ ์ถ”๊ฐ€ kube-scheduler ์ƒ์„ฑ

์ปค์Šคํ…€ ์Šค์ผ€์ค„๋ง ๊ทœ์น™ ์„ธํŠธ๋กœ ์ถ”๊ฐ€ kube-scheduler ์ƒ์„ฑ

Kube-scheduler๋Š” ์ง€์ •๋œ ์ •์ฑ…์— ๋”ฐ๋ผ ๋…ธ๋“œ ์ „์ฒด์—์„œ Pod๋ฅผ ์˜ˆ์•ฝํ•˜๋Š” Kubernetes์˜ ํ•„์ˆ˜ ๊ตฌ์„ฑ ์š”์†Œ์ž…๋‹ˆ๋‹ค. ์ข…์ข… Kubernetes ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์šด์˜ํ•˜๋Š” ๋™์•ˆ ๊ธฐ๋ณธ kube-scheduler์˜ ์ •์ฑ… ์„ธํŠธ๊ฐ€ ๋Œ€๋ถ€๋ถ„์˜ ์ผ์ƒ ์ž‘์—…์— ์ ํ•ฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•˜๋Š” ๋ฐ ์ •ํ™•ํžˆ ์–ด๋–ค ์ •์ฑ…์ด ์‚ฌ์šฉ๋˜๋Š”์ง€ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํฌ๋“œ ๋ฐฐํฌ๋ฅผ ๋ฏธ์„ธ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•œ ์ƒํ™ฉ์ด ์žˆ์œผ๋ฉฐ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ์ปค์Šคํ…€ ๊ทœ์น™ ์„ธํŠธ๋กœ kube-scheduler ์ƒ์„ฑ
  2. ์ž์‹ ์˜ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  API ์„œ๋ฒ„ ์š”์ฒญ๊ณผ ํ•จ๊ป˜ ์ž‘๋™ํ•˜๋„๋ก ๊ฐ€๋ฅด์นฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ์‚ฌ์—์„œ๋Š” ์šฐ๋ฆฌ ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ ๊ณ ๋ฅด์ง€ ์•Š์€ ํฌ๋“œ ์Šค์ผ€์ค„๋ง ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ฒซ ๋ฒˆ์งธ ํฌ์ธํŠธ ๊ตฌํ˜„์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

kube-scheduler'a ์ž‘์—…์— ๋Œ€ํ•œ ๊ฐ„๋žตํ•œ ์†Œ๊ฐœ

์ฃผ๋ชฉํ•  ๋งŒํ•œ ์ ์€ kube-scheduler๊ฐ€ ํฌ๋“œ๋ฅผ ์ง์ ‘ ์˜ˆ์•ฝํ•˜๋Š” ์ผ์„ ๋‹ด๋‹นํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. ํฌ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•  ๋…ธ๋“œ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ผ๋งŒ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, kube-scheduler์˜ ์ž‘์—… ๊ฒฐ๊ณผ๋Š” ์Šค์ผ€์ค„๋ง ์š”์ฒญ์„ ์œ„ํ•ด API ์„œ๋ฒ„์— ๋ฐ˜ํ™˜ํ•˜๋Š” ๋…ธ๋“œ์˜ ์ด๋ฆ„์ด๋ฉฐ ์—ฌ๊ธฐ์—์„œ ์ž‘์—…์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.

๋จผ์ € kube-scheduler๋Š” ์กฐ๊ฑด์ž ์ •์ฑ…์— ๋”ฐ๋ผ ํฌ๋“œ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ด ๋ชฉ๋ก์˜ ๊ฐ ๋…ธ๋“œ๋Š” ์šฐ์„  ์ˆœ์œ„ ์ •์ฑ…์— ๋”ฐ๋ผ ํŠน์ • ์ ์ˆ˜๋ฅผ ๋ฐ›์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ ์ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋…ธ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์ตœ๋Œ€ ์ ์ˆ˜๊ฐ€ ๊ฐ™์€ ๋…ธ๋“œ๊ฐ€ ์žˆ์œผ๋ฉด ์ž„์˜์˜ ๋…ธ๋“œ๊ฐ€ ์„ ํƒ๋ฉ๋‹ˆ๋‹ค. ์กฐ๊ฑด์ž(ํ•„ํ„ฐ๋ง) ๋ฐ ์šฐ์„  ์ˆœ์œ„(์ ์ˆ˜ ์ง€์ •) ์ •์ฑ…์˜ ๋ชฉ๋ก ๋ฐ ์„ค๋ช…์€ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜.

๋ฌธ์ œ ๋ณธ๋ฌธ์— ๋Œ€ํ•œ ์„ค๋ช…

Nixys์—์„œ ์œ ์ง€ ๊ด€๋ฆฌ๋˜๋Š” ๋‹ค์–‘ํ•œ Kubernetes ํด๋Ÿฌ์Šคํ„ฐ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์—์„œ ๋งŽ์€ ์ˆ˜์˜ ์ฃผ๊ธฐ์  ์ž‘์—…(~ 100 CronJob ์—”ํ„ฐํ‹ฐ)์„ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ตœ๊ทผ์—์•ผ ํฌ๋“œ ์˜ˆ์•ฝ ๋ฌธ์ œ์— ์ฒ˜์Œ์œผ๋กœ ์ง๋ฉดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ํ•œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์„ค๋ช…์„ ๋‹จ์ˆœํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ๋ฅผ ๋“ค์–ด ํฌ๋ก  ์ž‘์—…์ด 24๋ถ„์— ํ•œ ๋ฒˆ ์‹œ์ž‘๋˜์–ด CPU์— ์•ฝ๊ฐ„์˜ ๋ถ€ํ•˜๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•˜๋‚˜์˜ ๋งˆ์ดํฌ๋กœ ์„œ๋น„์Šค๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ํฌ๋ก  ์ž‘์—…์„ ์œ„ํ•ด XNUMX๊ฐœ์˜ ์™„์ „ํžˆ ๋™์ผํ•œ ๋…ธ๋“œ(๊ฐ ๋…ธ๋“œ์— XNUMX๊ฐœ์˜ vCPU)๊ฐ€ ํ• ๋‹น๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋™์‹œ์— ์ž…๋ ฅ ๋ฐ์ดํ„ฐ์˜ ์–‘์ด ์ง€์†์ ์œผ๋กœ ๋ณ€ํ•˜๊ธฐ ๋•Œ๋ฌธ์— CronJob์ด ์–ผ๋งˆ๋‚˜ ์˜ค๋ž˜ ์‹คํ–‰๋ ์ง€ ์ •ํ™•ํžˆ ๋งํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ‰๊ท ์ ์œผ๋กœ ์ผ๋ฐ˜์ ์ธ kube-scheduler ์ž‘์—… ์ค‘์— ๊ฐ ๋…ธ๋“œ๋Š” 3~4๊ฐœ์˜ ์ž‘์—… ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋ฉฐ ๊ฐ ๋…ธ๋“œ์˜ CPU ๋ถ€ํ•˜์˜ ~20~30%๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์Šค์ผ€์ค„๋ง ๊ทœ์น™ ์„ธํŠธ๋กœ ์ถ”๊ฐ€ kube-scheduler ์ƒ์„ฑ

๋ฌธ์ œ ์ž์ฒด๋Š” ๋•Œ๋•Œ๋กœ cron ์ž‘์—… ํฌ๋“œ๊ฐ€ ์„ธ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•œ ์˜ˆ์•ฝ์„ ์ค‘์ง€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์–ด๋–ค ์‹œ์ ์—์„œ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜์— ๋Œ€ํ•ด ๋‹จ์ผ ํฌ๋“œ๊ฐ€ ๊ณ„ํš๋˜์ง€ ์•Š์€ ๋ฐ˜๋ฉด 6-8๊ฐœ์˜ ์ž‘์—… ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ ๋‘ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜์–ด CPU ๋ถ€ํ•˜์˜ ~40-60%๋ฅผ ์ƒ์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ปค์Šคํ…€ ์Šค์ผ€์ค„๋ง ๊ทœ์น™ ์„ธํŠธ๋กœ ์ถ”๊ฐ€ kube-scheduler ์ƒ์„ฑ

๋ฌธ์ œ๋Š” ์ ˆ๋Œ€์ ์œผ๋กœ ์ž„์˜์˜ ๋นˆ๋„๋กœ ๋ฐ˜๋ณต๋˜์—ˆ์œผ๋ฉฐ ๋•Œ๋•Œ๋กœ ์ƒˆ ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ๋กค์•„์›ƒํ•˜๋Š” ์ˆœ๊ฐ„๊ณผ ๊ด€๋ จ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

kube-scheduler์˜ ๋กœ๊น… ์ˆ˜์ค€์„ ์ˆ˜์ค€ 10(-v=10)์œผ๋กœ ๋†’์ž„์œผ๋กœ์จ ํ‰๊ฐ€ ํ”„๋กœ์„ธ์Šค์—์„œ ๊ฐ ๋…ธ๋“œ๊ฐ€ ๋ช‡ ์ ์„ ์–ป์—ˆ๋Š”์ง€ ๊ธฐ๋กํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ •์ƒ ์˜ˆ์•ฝ ์ค‘์— ๋‹ค์Œ ์ •๋ณด๊ฐ€ ๋กœ๊ทธ์— ํ‘œ์‹œ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1387 millicores 4161694720 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1347 millicores 4444810240 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node03: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1387 millicores 4161694720 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1687 millicores 4790840320 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node02: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1347 millicores 4444810240 memory bytes, score 9
resource_allocation.go:78] cronjob-1574828880-mn7m4 -> Node01: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1687 millicores 4790840320 memory bytes, score 9
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: NodeAffinityPriority, Score: (0)                                                                                       
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node01: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: TaintTolerationPriority, Score: (10)                                                                                   
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node02: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node01: SelectorSpreadPriority, Score: (10)                                                                                                        
interpod_affinity.go:237] cronjob-1574828880-mn7m4 -> Node03: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node02: SelectorSpreadPriority, Score: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574828880-mn7m4 -> Node03: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node01: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node02: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574828880-mn7m4_project-stage -> Node03: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:781] Host Node01 => Score 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 => Score 100043                                                                                                                                                                        
generic_scheduler.go:781] Host Node03 => Score 100043

์ €๊ฒƒ๋“ค. ๋กœ๊ทธ์—์„œ ์–ป์€ ์ •๋ณด๋กœ ํŒ๋‹จํ•˜๋ฉด ๊ฐ ๋…ธ๋“œ๋Š” ๋™์ผํ•œ ์ˆ˜์˜ ์ตœ์ข… ์ ์ˆ˜๋ฅผ ์–ป์—ˆ๊ณ  ๊ณ„ํš์„ ์œ„ํ•ด ๋ฌด์ž‘์œ„๋กœ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ ๊ณ„ํš ๋‹น์‹œ์˜ ๋กœ๊ทธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1587 millicores 4581125120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1087 millicores 3532549120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node02: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1587 millicores 4581125120 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: BalancedResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 987 millicores 3322833920 memory bytes, score 9
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node01: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 987 millicores 3322833920 memory bytes, score 9 
resource_allocation.go:78] cronjob-1574211360-bzfkr -> Node03: LeastResourceAllocation, capacity 23900 millicores 67167186944 memory bytes, total request 1087 millicores 3532549120 memory bytes, score 9
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node03: InterPodAffinityPriority, Score: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node02: InterPodAffinityPriority, Score: (0)                                                                                                        
interpod_affinity.go:237] cronjob-1574211360-bzfkr -> Node01: InterPodAffinityPriority, Score: (0)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node03: SelectorSpreadPriority, Score: (10)                                                                                                        
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node02: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: TaintTolerationPriority, Score: (10)                                                                                   
selector_spreading.go:146] cronjob-1574211360-bzfkr -> Node01: SelectorSpreadPriority, Score: (10)                                                                                                        
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node03: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: TaintTolerationPriority, Score: (10)                                                                                   
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node02: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: NodeAffinityPriority, Score: (0)                                                                                       
generic_scheduler.go:726] cronjob-1574211360-bzfkr_project-stage -> Node01: SelectorSpreadPriority, Score: (10)                                                                                    
generic_scheduler.go:781] Host Node03 => Score 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node02 => Score 100041                                                                                                                                                                        
generic_scheduler.go:781] Host Node01 => Score 100038

์ด๋ฅผ ํ†ตํ•ด ํ•˜๋‚˜์˜ ๋…ธ๋“œ๊ฐ€ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ณด๋‹ค ์ด ์ ์ˆ˜๊ฐ€ ๋‚ฎ์Œ์„ ์•Œ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ตœ๋Œ€ ์ ์ˆ˜๋ฅผ ์–ป์€ ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๊ณ„ํš์„ ์„ธ์› ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ๊ฐ€ ์ •ํ™•ํžˆ ํฌ๋“œ ๊ณ„ํš์— ์žˆ๋‹ค๊ณ  ํ™•์‹ ํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ถ”๊ฐ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋ถ„๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋กœ๊ทธ๋ฅผ ๋ถ„์„ํ•˜๊ณ  ๋…ธ๋“œ๊ฐ€ ํฌ์ธํŠธ๋ฅผ ์–ป์ง€ ๋ชปํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ดํ•ดํ•˜๊ณ  ํ•„์š”ํ•œ ๊ฒฝ์šฐ ๊ธฐ๋ณธ kube-scheduler์˜ ์ •์ฑ…์„ ์กฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๋Š” ๋‘ ๊ฐ€์ง€ ์ค‘์š”ํ•œ ์–ด๋ ค์›€์— ์ง๋ฉดํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

  1. ์ตœ๋Œ€ ๋กœ๊น… ์ˆ˜์ค€(10)์€ ์ผ๋ถ€ ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด์„œ๋งŒ ํฌ์ธํŠธ ์ง‘ํ•ฉ์„ ๋ฐ˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์œ„์˜ ๋กœ๊ทธ ๋ฐœ์ทŒ์—์„œ ๋กœ๊ทธ์— ๋ฐ˜์˜๋œ ๋ชจ๋“  ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด ๋…ธ๋“œ๊ฐ€ ์ •์ƒ ๋ฐ ๋ฌธ์ œ ์ผ์ •์—์„œ ๋™์ผํ•œ ์ ์ˆ˜๋ฅผ ์–ป์—ˆ์ง€๋งŒ ๋ฌธ์ œ ์ผ์ •์˜ ๊ฒฝ์šฐ ์ตœ์ข… ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ์ผ๋ถ€ ์šฐ์„  ์ˆœ์œ„์— ๋Œ€ํ•ด ์ ์ˆ˜ ๋งค๊ธฐ๊ธฐ๊ฐ€ "๋’ค์—์„œ" ๋ฐœ์ƒํ•˜๋ฉฐ ๋…ธ๋“œ๊ฐ€ ์ ์ˆ˜๋ฅผ ์–ป์ง€ ๋ชปํ•œ ์šฐ์„  ์ˆœ์œ„๋ฅผ ์ดํ•ดํ•  ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ๊ฒฐ๋ก ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐœํ–‰๋ฌผ Github์˜ Kubernetes ๋ฆฌํฌ์ง€ํ† ๋ฆฌ. ์ž‘์„ฑ ์‹œ์ ์— Kubernetes v1.15,1.16, 1.17 ๋ฐ XNUMX ์—…๋ฐ์ดํŠธ์— ๋กœ๊น… ์ง€์›์ด ์ถ”๊ฐ€๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฐœ๋ฐœ์ž์˜ ์‘๋‹ต์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค.
  2. kube-scheduler๊ฐ€ ํ˜„์žฌ ์ž‘์—… ์ค‘์ธ ํŠน์ • ์ •์ฑ… ์„ธํŠธ๋ฅผ ์‰ฝ๊ฒŒ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์€ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ, ์•ˆ์œผ๋กœ ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜ ์ด ๋ชฉ๋ก์ด ๋‚˜์—ด๋˜์ง€๋งŒ ๊ฐ ์šฐ์„  ์ˆœ์œ„ ์ •์ฑ…์— ๋Œ€ํ•ด ์„ค์ •๋œ ํŠน์ • ๊ฐ€์ค‘์น˜์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ kube-scheduler์˜ ๊ฐ€์ค‘์น˜๋ฅผ ๋ณด๊ฑฐ๋‚˜ ์ •์ฑ…์„ ํŽธ์ง‘ํ•˜๋Š” ๊ฒƒ๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ถœ์ฒ˜.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์ด๋ฏธ์ง€๊ฐ€ ์ด๋ฏธ ์žˆ๋Š” ๊ฒฝ์šฐ ๋…ธ๋“œ์— ํฌ์ธํŠธ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ImageLocalityPriority ์ •์ฑ…์— ๋”ฐ๋ผ ๋…ธ๋“œ๊ฐ€ ํฌ์ธํŠธ๋ฅผ ์–ป์ง€ ๋ชปํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ํ›„์—๋Š” ์ฃผ๋ชฉํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒˆ ๋ฒ„์ „์„ ๋กค์•„์›ƒํ•  ๋•Œ cron ์ž‘์—…์ด ๋‘ ๊ฐœ์˜ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋˜๊ณ  ๋„์ปค ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ ์ƒˆ ์ด๋ฏธ์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ๋‘ ๋…ธ๋“œ๊ฐ€ ์ƒ๋Œ€์ ์œผ๋กœ ๋” ๋†’์€ ์ตœ์ข… ์ ์ˆ˜๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์„ธ๋ฒˆ์งธ ๊ฒƒ.

์œ„์—์„œ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ๋กœ๊ทธ์—๋Š” ImageLocalityPriority ์ •์ฑ… ํ‰๊ฐ€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ฐ€์ •์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ ๋ฒ„์ „์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์œผ๋กœ ์ด๋ฏธ์ง€๋ฅผ ์„ธ ๋ฒˆ์งธ ๋…ธ๋“œ๋กœ ์Šคํ’€๋งํ•œ ํ›„ ๊ณ„ํš ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ImageLocalityPriority ์ •์ฑ… ๋•Œ๋ฌธ์— ์ผ์ • ๋ฌธ์ œ๊ฐ€ ๊ฑฐ์˜ ๊ด€์ฐฐ๋˜์ง€ ์•Š๊ณ  ๋” ์ž์ฃผ ๋‹ค๋ฅธ ๋ฌธ์ œ์™€ ์—ฐ๊ด€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ kube-scheduler์˜ ์šฐ์„  ์ˆœ์œ„ ๋ชฉ๋ก์— ์žˆ๋Š” ๊ฐ ์ •์ฑ…์„ ์™„์ „ํžˆ ๋””๋ฒ„๊น…ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ํฌ๋“œ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์„ ์œ ์—ฐํ•˜๊ฒŒ ๊ด€๋ฆฌํ•  ํ•„์š”๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ฑ๋ช…

์šฐ๋ฆฌ๋Š” ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ด ๊ฐ€๋Šฅํ•œ ํ•œ ๋Œ€์ƒํ™”๋˜๊ธฐ๋ฅผ ์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, Kubernetes์˜ ์ฃผ์š” ์—”ํ‹ฐํ‹ฐ(์—ฌ๊ธฐ์„œ๋Š” ๊ธฐ๋ณธ kube-scheduler๋ฅผ ์˜๋ฏธํ•จ)๊ฐ€ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์€ ์ƒํƒœ๋กœ ์œ ์ง€๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•œ ๊ณณ์—์„œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ์‚ฌ ์†Œ๊ฐœ์—์„œ ๋ฐœํ‘œ๋œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ์˜ต์…˜, ์ฆ‰ ์ถ”๊ฐ€ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜ ์ง์ ‘ ์ž‘์„ฑํ•˜๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋ก  ์ž‘์—…์„ ์˜ˆ์•ฝํ•˜๊ธฐ ์œ„ํ•œ ์ฃผ์š” ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋กœ๋“œ๋ฅผ ์„ธ ๋…ธ๋“œ์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์š”๊ตฌ ์‚ฌํ•ญ์€ ๊ธฐ์กด kube-scheduler ์ •์ฑ…์œผ๋กœ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์ž‘์—…์— ๋Œ€ํ•œ ์ž์ฒด ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ถ”๊ฐ€ kube-scheduler ์ƒ์„ฑ ๋ฐ ๋ฐฐํฌ ์ง€์นจ์€ ๋‹ค์Œ ํ•ญ๋ชฉ์— ์„ค๋ช…๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜. ๊ทธ๋Ÿฌ๋‚˜ ๋ฐฐํฌ ์—”ํ„ฐํ‹ฐ๋Š” kube-scheduler์™€ ๊ฐ™์€ ์ค‘์š”ํ•œ ์„œ๋น„์Šค์˜ ์ž‘๋™์—์„œ ๋‚ด๊ฒฐํ•จ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ๊ฒƒ์œผ๋กœ ๋ณด์˜€๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด kube-scheduler๋ฅผ ์ •์  ํฌ๋“œ๋กœ ๋ฐฐํฌํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ํฌ๋“œ๋Š” Kubelet์ด ์ง์ ‘ ๋ชจ๋‹ˆํ„ฐ๋งํ•ฉ๋‹ˆ๋‹ค. . ๋”ฐ๋ผ์„œ ์ƒˆ๋กœ์šด kube-scheduler์— ๋Œ€ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์„œ๋น„์Šค๋Š” ๋ชจ๋“  ํด๋Ÿฌ์Šคํ„ฐ ๋งˆ์Šคํ„ฐ์—์„œ ์ •์  ํฌ๋“œ๋กœ ๋ฐฐํฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  2. kube-scheduler๊ฐ€ ํฌํ•จ๋œ ํ™œ์„ฑ ํฌ๋“œ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ ์žฅ์•  ์กฐ์น˜๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  3. ๊ณ„ํš ์‹œ ์ฃผ์š” ์šฐ์„  ์ˆœ์œ„๋Š” ๋…ธ๋“œ์—์„œ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฆฌ์†Œ์Šค์˜ ์–‘(LeastRequestedPriority)์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ์†”๋ฃจ์…˜

Kubernetes v1.14.7์—์„œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ด๋ผ๋Š” ์ ์„ ๋ฐ”๋กœ ์ฃผ๋ชฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฒ„์ „์€ ํ”„๋กœ์ ํŠธ์—์„œ ์‚ฌ์šฉ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด kube-scheduler์— ๋Œ€ํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ(/etc/kubernetes/manifests/kube-scheduler.yaml)๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค.

kind: Pod
metadata:
  labels:
    component: scheduler
    tier: control-plane
  name: kube-scheduler-cron
  namespace: kube-system
spec:
      containers:
      - command:
        - /usr/local/bin/kube-scheduler
        - --address=0.0.0.0
        - --port=10151
        - --secure-port=10159
        - --config=/etc/kubernetes/scheduler-custom.conf
        - --authentication-kubeconfig=/etc/kubernetes/scheduler.conf
        - --authorization-kubeconfig=/etc/kubernetes/scheduler.conf
        - --v=2
        image: gcr.io/google-containers/kube-scheduler:v1.14.7
        imagePullPolicy: IfNotPresent
        livenessProbe:
          failureThreshold: 8
          httpGet:
            host: 127.0.0.1
            path: /healthz
            port: 10151
            scheme: HTTP
          initialDelaySeconds: 15
          timeoutSeconds: 15
        name: kube-scheduler-cron-container
        resources:
          requests:
            cpu: '0.1'
        volumeMounts:
        - mountPath: /etc/kubernetes/scheduler.conf
          name: kube-config
          readOnly: true
        - mountPath: /etc/localtime
          name: localtime
          readOnly: true
        - mountPath: /etc/kubernetes/scheduler-custom.conf
          name: scheduler-config
          readOnly: true
        - mountPath: /etc/kubernetes/scheduler-custom-policy-config.json
          name: policy-config
          readOnly: true
      hostNetwork: true
      priorityClassName: system-cluster-critical
      volumes:
      - hostPath:
          path: /etc/kubernetes/scheduler.conf
          type: FileOrCreate
        name: kube-config
      - hostPath:
          path: /etc/localtime
        name: localtime
      - hostPath:
          path: /etc/kubernetes/scheduler-custom.conf
          type: FileOrCreate
        name: scheduler-config
      - hostPath:
          path: /etc/kubernetes/scheduler-custom-policy-config.json
          type: FileOrCreate
        name: policy-config

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. ํฌ๋“œ ๋ฐ ์ปจํ…Œ์ด๋„ˆ ์ด๋ฆ„์ด kube-scheduler-cron์œผ๋กœ ๋ณ€๊ฒฝ๋จ
  2. ์˜ต์…˜ ์ •์˜์— ๋”ฐ๋ผ ํฌํŠธ 10151 ๋ฐ 10159๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก ์ง€์ •๋จ hostNetwork: true ๊ธฐ๋ณธ kube-scheduler(10251 ๋ฐ 10259)์™€ ๋™์ผํ•œ ํฌํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
  3. --config ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์‹œ์ž‘ํ•  ๊ตฌ์„ฑ ํŒŒ์ผ์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค.
  4. ํ˜ธ์ŠคํŠธ์—์„œ ๊ตฌ์„ฑ ํŒŒ์ผ(scheduler-custom.conf) ๋ฐ ์Šค์ผ€์ค„๋ง ์ •์ฑ… ํŒŒ์ผ(scheduler-custom-policy-config.json)์„ ๋งˆ์šดํŠธํ•˜๋„๋ก ๊ตฌ์„ฑ

kube-scheduler์—๋Š” ๊ธฐ๋ณธ ๊ถŒํ•œ๊ณผ ์œ ์‚ฌํ•œ ๊ถŒํ•œ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ์ ์„ ์žŠ์ง€ ๋งˆ์‹ญ์‹œ์˜ค. ํด๋Ÿฌ์Šคํ„ฐ ์—ญํ• ์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

kubectl edit clusterrole system:kube-scheduler

...
   resourceNames:
    - kube-scheduler
    - kube-scheduler-cron
...

์ด์ œ ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ์ผ์ • ์ •์ฑ… ํŒŒ์ผ์— ํฌํ•จ๋˜์–ด์•ผ ํ•˜๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ๊ตฌ์„ฑ ํŒŒ์ผ(scheduler-custom.conf)
    ๊ธฐ๋ณธ kube-scheduler์˜ ๊ตฌ์„ฑ์„ ๊ฐ€์ ธ์˜ค๋ ค๋ฉด ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. --write-config-to ์œผ๋กœ ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜. ๊ฒฐ๊ณผ ๊ตฌ์„ฑ์„ /etc/kubernetes/scheduler-custom.conf ํŒŒ์ผ์— ๋ฐฐ์น˜ํ•˜๊ณ  ๋‹ค์Œ ํ˜•์‹์œผ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1alpha1
kind: KubeSchedulerConfiguration
schedulerName: kube-scheduler-cron
bindTimeoutSeconds: 600
clientConnection:
  acceptContentTypes: ""
  burst: 100
  contentType: application/vnd.kubernetes.protobuf
  kubeconfig: /etc/kubernetes/scheduler.conf
  qps: 50
disablePreemption: false
enableContentionProfiling: false
enableProfiling: false
failureDomains: kubernetes.io/hostname,failure-domain.beta.kubernetes.io/zone,failure-domain.beta.kubernetes.io/region
hardPodAffinitySymmetricWeight: 1
healthzBindAddress: 0.0.0.0:10151
leaderElection:
  leaderElect: true
  leaseDuration: 15s
  lockObjectName: kube-scheduler-cron
  lockObjectNamespace: kube-system
  renewDeadline: 10s
  resourceLock: endpoints
  retryPeriod: 2s
metricsBindAddress: 0.0.0.0:10151
percentageOfNodesToScore: 0
algorithmSource:
   policy:
     file:
       path: "/etc/kubernetes/scheduler-custom-policy-config.json"

์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

  1. schedulerName์„ ์„œ๋น„์Šค kube-scheduler-cron์˜ ์ด๋ฆ„์œผ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋งค๊ฐœ๋ณ€์ˆ˜์—์„œ lockObjectName ๋˜ํ•œ ์„œ๋น„์Šค ์ด๋ฆ„์„ ์„ค์ •ํ•˜๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ leaderElect true๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค(๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๊ฐ€ ํ•˜๋‚˜์ธ ๊ฒฝ์šฐ ๊ฐ’์„ false๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Œ).
  3. ํŒŒ๋ผ๋ฏธํ„ฐ์— ์Šค์ผ€์ค„๋ง ์ •์ฑ…์˜ ์„ค๋ช…์œผ๋กœ ํŒŒ์ผ ๊ฒฝ๋กœ ์ง€์ • algorithmSource.

ํ‚ค์— ๋Œ€ํ•œ ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ํŽธ์ง‘ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ๋‹จ๋ฝ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. leaderElection. ๋‚ด๊ฒฐํ•จ์„ฑ์„ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” (leaderElect) ๋‹จ์ผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ kube-scheduler์˜ ํฌ๋“œ ๊ฐ„์— ๋ฆฌ๋”(๋งˆ์Šคํ„ฐ)๋ฅผ ์„ ํƒํ•˜๋Š” ํ”„๋กœ์„ธ์Šค(resourceLock) ์ด๋ฆ„์ด kube-scheduler-cron(lockObjectName) kube-system ๋„ค์ž„์ŠคํŽ˜์ด์Šค(lockObjectNamespace). Kubernetes๊ฐ€ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ(kube-scheduler ํฌํ•จ)์˜ ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ์‚ฌ.

  • ์Šค์ผ€์ค„๋ง ์ •์ฑ… ํŒŒ์ผ(scheduler-custom-policy-config.json)
    ์•ž์„œ ์“ด ๊ฒƒ์ฒ˜๋Ÿผ ๊ธฐ๋ณธ kube-scheduler๊ฐ€ ์ž‘๋™ํ•˜๋Š” ํŠน์ • ์ •์ฑ…์€ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ๋ถ„์„ํ•ด์•ผ๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๊ตฌ์„ฑ ํŒŒ์ผ๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๊ธฐ๋ณธ kube-scheduler์˜ ์Šค์ผ€์ค„๋ง ์ •์ฑ…์œผ๋กœ ํŒŒ์ผ์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ๊ณผ ๊ฐ™์ด /etc/kubernetes/scheduler-custom-policy-config.json ํŒŒ์ผ์—์„œ ๊ด€์‹ฌ ์žˆ๋Š” ์Šค์ผ€์ค„๋ง ์ •์ฑ…์„ ์„ค๋ช…ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

{
  "kind": "Policy",
  "apiVersion": "v1",
  "predicates": [
    {
      "name": "GeneralPredicates"
    }
  ],
  "priorities": [
    {
      "name": "ServiceSpreadingPriority",
      "weight": 1
    },
    {
      "name": "EqualPriority",
      "weight": 1
    },
    {
      "name": "LeastRequestedPriority",
      "weight": 1
    },
    {
      "name": "NodePreferAvoidPodsPriority",
      "weight": 10000
    },
    {
      "name": "NodeAffinityPriority",
      "weight": 1
    }
  ],
  "hardPodAffinitySymmetricWeight" : 10,
  "alwaysCheckAllPredicates" : false
}

๋”ฐ๋ผ์„œ kube-scheduler๋Š” ๋จผ์ € GeneralPredicates ์ •์ฑ…(PodFitsResources, PodFitsHostPorts, HostName ๋ฐ MatchNodeSelector ์ •์ฑ… ์„ธํŠธ ํฌํ•จ)์— ๋”ฐ๋ผ Pod๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๊ฐ ๋…ธ๋“œ๋Š” ์šฐ์„  ์ˆœ์œ„ ๋ฐฐ์—ด์˜ ์ •์ฑ… ์ง‘ํ•ฉ์— ๋”ฐ๋ผ ํ‰๊ฐ€๋ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์ž„๋ฌด์˜ ์กฐ๊ฑด์„ ์ถฉ์กฑ์‹œํ‚ค๊ธฐ ์œ„ํ•ด ์šฐ๋ฆฌ๋Š” ๊ทธ๋Ÿฌํ•œ ์ผ๋ จ์˜ ์ •์ฑ…์ด ์ตœ์„ ์˜ ํ•ด๊ฒฐ์ฑ…์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ์„ค๋ช…๊ณผ ํ•จ๊ป˜ ์ผ๋ จ์˜ ์ •์ฑ…์ด ์ œ๊ณต๋จ์„ ์•Œ๋ ค๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์„ ์  ์„œ๋ฅ˜ ๋น„์น˜. ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ๋œ ์ •์ฑ… ์ง‘ํ•ฉ์„ ๋ณ€๊ฒฝํ•˜๊ณ  ์ ์ ˆํ•œ ๊ฐ€์ค‘์น˜๋ฅผ ํ• ๋‹นํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ด ์žฅ์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์—์„œ ์ƒ์„ฑํ•œ ์ƒˆ๋กœ์šด kube-scheduler ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” kube-scheduler-custom.yaml์ด๋ผ๊ณ  ํ•˜๋ฉฐ ์„ธ ๊ฐœ์˜ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ /etc/kubernetes/manifests์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์™„๋ฃŒ๋˜๋ฉด Kubelet์€ ๊ฐ ๋…ธ๋“œ์—์„œ ํฌ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ณ  ์ƒˆ๋กœ์šด kube-scheduler์˜ ๋กœ๊ทธ์—์„œ ์ •์ฑ… ํŒŒ์ผ์ด ์„ฑ๊ณต์ ์œผ๋กœ ์ ์šฉ๋˜์—ˆ๋‹ค๋Š” ์ •๋ณด๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Creating scheduler from configuration: {{ } [{GeneralPredicates <nil>}] [{ServiceSpreadingPriority 1 <nil>} {EqualPriority 1 <nil>} {LeastRequestedPriority 1 <nil>} {NodePreferAvoidPodsPriority 10000 <nil>} {NodeAffinityPriority 1 <nil>}] [] 10 false}
Registering predicate: GeneralPredicates
Predicate type GeneralPredicates already registered, reusing.
Registering priority: ServiceSpreadingPriority
Priority type ServiceSpreadingPriority already registered, reusing.
Registering priority: EqualPriority
Priority type EqualPriority already registered, reusing.
Registering priority: LeastRequestedPriority
Priority type LeastRequestedPriority already registered, reusing.
Registering priority: NodePreferAvoidPodsPriority
Priority type NodePreferAvoidPodsPriority already registered, reusing.
Registering priority: NodeAffinityPriority
Priority type NodeAffinityPriority already registered, reusing.
Creating scheduler with fit predicates 'map[GeneralPredicates:{}]' and priority functions 'map[EqualPriority:{} LeastRequestedPriority:{} NodeAffinityPriority:{} NodePreferAvoidPodsPriority:{} ServiceSpreadingPriority:{}]'

์ด์ œ ํŒŒ๋“œ ์Šค์ผ€์ค„๋ง์— ๋Œ€ํ•œ ๋ชจ๋“  ์š”์ฒญ์ด ์ƒˆ๋กœ์šด kube-scheduler์— ์˜ํ•ด ์ฒ˜๋ฆฌ๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ CronJob์˜ ์‚ฌ์–‘์— ์ง€์ •ํ•˜๋Š” ์ผ๋งŒ ๋‚จ์•˜์Šต๋‹ˆ๋‹ค.

...
 jobTemplate:
    spec:
      template:
        spec:
          schedulerName: kube-scheduler-cron
...

๊ฒฐ๋ก 

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” kubelet์— ์˜ํ•ด ์ง์ ‘ ๋ชจ๋‹ˆํ„ฐ๋ง๋˜๋Š” ๊ณ ์œ ํ•œ ์Šค์ผ€์ค„๋ง ์ •์ฑ… ์„ธํŠธ๊ฐ€ ์žˆ๋Š” ์ถ”๊ฐ€ kube-scheduler๋ฅผ ์–ป์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์–ด๋–ค ์ด์œ ๋กœ ์ด์ „ ๋ฆฌ๋”๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ kube-scheduler์˜ ํฌ๋“œ ๊ฐ„์— ์ƒˆ ๋ฆฌ๋” ์„ ์ถœ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋ฐ ์„œ๋น„์Šค๋Š” ๊ธฐ๋ณธ kube-scheduler๋ฅผ ํ†ตํ•ด ๊ณ„์† ์˜ˆ์•ฝ๋˜๋ฉฐ ๋ชจ๋“  cron ์ž‘์—…์€ ์ƒˆ ์ž‘์—…์œผ๋กœ ์™„์ „ํžˆ ์ด์ „๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฌ๋ก  ์ž‘์—…์œผ๋กœ ์ƒ์„ฑ๋œ ๋ถ€ํ•˜๋Š” ์ด์ œ ๋ชจ๋“  ๋…ธ๋“œ์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ๋ฉ๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ํฌ๋ก  ์ž‘์—…์ด ํ”„๋กœ์ ํŠธ์˜ ์ฃผ์š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰๋œ๋‹ค๋Š” ์ ์„ ๊ณ ๋ คํ•˜๋ฉด ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ Pod ์ด๋™ ์œ„ํ—˜์ด ํฌ๊ฒŒ ์ค„์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ kube-scheduler๋ฅผ ๋„์ž…ํ•œ ํ›„ cron ์ž‘์—…์˜ ์ผ์ •ํ•˜์ง€ ์•Š์€ ์ผ์ • ๋ฌธ์ œ๊ฐ€ ๋” ์ด์ƒ ๋ฐœ์ƒํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๋ธ”๋กœ๊ทธ์—์„œ ๋‹ค๋ฅธ ๊ธฐ์‚ฌ๋„ ์ฝ์–ด๋ณด์„ธ์š”.

์ถœ์ฒ˜ : habr.com

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€