Kube-scheduler๋ ์ง์ ๋ ์ ์ฑ ์ ๋ฐ๋ผ ๋ ธ๋ ์ ์ฒด์์ Pod๋ฅผ ์์ฝํ๋ Kubernetes์ ํ์ ๊ตฌ์ฑ ์์์ ๋๋ค. ์ข ์ข Kubernetes ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๋ ๋์ ๊ธฐ๋ณธ kube-scheduler์ ์ ์ฑ ์ธํธ๊ฐ ๋๋ถ๋ถ์ ์ผ์ ์์ ์ ์ ํฉํ๊ธฐ ๋๋ฌธ์ ํฌ๋๋ฅผ ์์ฝํ๋ ๋ฐ ์ ํํ ์ด๋ค ์ ์ฑ ์ด ์ฌ์ฉ๋๋์ง ์๊ฐํ ํ์๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ํฌ๋ ๋ฐฐํฌ๋ฅผ ๋ฏธ์ธ ์กฐ์ ํ๋ ๊ฒ์ด ์ค์ํ ์ํฉ์ด ์์ผ๋ฉฐ ์ด ์์ ์ ์ํํ๋ ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
- ์ปค์คํ ๊ท์น ์ธํธ๋ก kube-scheduler ์์ฑ
- ์์ ์ ์ค์ผ์ค๋ฌ๋ฅผ ์์ฑํ๊ณ 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%๋ฅผ ์์ฑํฉ๋๋ค.
๋ฌธ์ ์์ฒด๋ ๋๋๋ก cron ์์ ํฌ๋๊ฐ ์ธ ๋ ธ๋ ์ค ํ๋์ ๋ํ ์์ฝ์ ์ค์งํ๋ค๋ ๊ฒ์ ๋๋ค. ์ฆ, ์ด๋ค ์์ ์์ ๋ ธ๋ ์ค ํ๋์ ๋ํด ๋จ์ผ ํฌ๋๊ฐ ๊ณํ๋์ง ์์ ๋ฐ๋ฉด 6-8๊ฐ์ ์์ ์ธ์คํด์ค๊ฐ ๋ค๋ฅธ ๋ ๋ ธ๋์์ ์คํ๋์ด CPU ๋ถํ์ ~40-60%๋ฅผ ์์ฑํ์ต๋๋ค.
๋ฌธ์ ๋ ์ ๋์ ์ผ๋ก ์์์ ๋น๋๋ก ๋ฐ๋ณต๋์์ผ๋ฉฐ ๋๋๋ก ์ ๋ฒ์ ์ ์ฝ๋๋ฅผ ๋กค์์ํ๋ ์๊ฐ๊ณผ ๊ด๋ จ์ด ์์ต๋๋ค.
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์ ์ ์ฑ ์ ์กฐ์ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๊ธฐ์ ์ฐ๋ฆฌ๋ ๋ ๊ฐ์ง ์ค์ํ ์ด๋ ค์์ ์ง๋ฉดํ๊ฒ ๋ฉ๋๋ค.
- ์ต๋ ๋ก๊น
์์ค(10)์ ์ผ๋ถ ์ฐ์ ์์์ ๋ํด์๋ง ํฌ์ธํธ ์งํฉ์ ๋ฐ์ํฉ๋๋ค. ์์ ๋ก๊ทธ ๋ฐ์ท์์ ๋ก๊ทธ์ ๋ฐ์๋ ๋ชจ๋ ์ฐ์ ์์์ ๋ํด ๋
ธ๋๊ฐ ์ ์ ๋ฐ ๋ฌธ์ ์ผ์ ์์ ๋์ผํ ์ ์๋ฅผ ์ป์์ง๋ง ๋ฌธ์ ์ผ์ ์ ๊ฒฝ์ฐ ์ต์ข
๊ฒฐ๊ณผ๊ฐ ๋ค๋ฅธ ๊ฒ์ ๋ณผ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๋ ์ผ๋ถ ์ฐ์ ์์์ ๋ํด ์ ์ ๋งค๊ธฐ๊ธฐ๊ฐ "๋ค์์" ๋ฐ์ํ๋ฉฐ ๋
ธ๋๊ฐ ์ ์๋ฅผ ์ป์ง ๋ชปํ ์ฐ์ ์์๋ฅผ ์ดํดํ ๋ฐฉ๋ฒ์ด ์๋ค๊ณ ๊ฒฐ๋ก ์ ๋ด๋ฆด ์ ์์ต๋๋ค. ์ด ๋ฌธ์ ์ ๋ํด ์์ธํ ์ค๋ช
ํ์ต๋๋ค.
๋ฐํ๋ฌผ Github์ Kubernetes ๋ฆฌํฌ์งํ ๋ฆฌ. ์์ฑ ์์ ์ Kubernetes v1.15,1.16, 1.17 ๋ฐ XNUMX ์ ๋ฐ์ดํธ์ ๋ก๊น ์ง์์ด ์ถ๊ฐ๋ ๊ฒ์ด๋ผ๋ ๊ฐ๋ฐ์์ ์๋ต์ ๋ฐ์์ต๋๋ค. - kube-scheduler๊ฐ ํ์ฌ ์์
์ค์ธ ํน์ ์ ์ฑ
์ธํธ๋ฅผ ์ฝ๊ฒ ์ดํดํ ์ ์๋ ๋ฐฉ๋ฒ์ ์์ต๋๋ค. ์, ์์ผ๋ก
์ ์ ์๋ฅ ๋น์น ์ด ๋ชฉ๋ก์ด ๋์ด๋์ง๋ง ๊ฐ ์ฐ์ ์์ ์ ์ฑ ์ ๋ํด ์ค์ ๋ ํน์ ๊ฐ์ค์น์ ๋ํ ์ ๋ณด๋ ํฌํจ๋์ด ์์ง ์์ต๋๋ค. ๊ธฐ๋ณธ kube-scheduler์ ๊ฐ์ค์น๋ฅผ ๋ณด๊ฑฐ๋ ์ ์ฑ ์ ํธ์งํ๋ ๊ฒ๋ง ๊ฐ๋ฅํฉ๋๋ค.์ถ์ฒ .
์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํ๋ ๋ฐ ํ์ํ ์ด๋ฏธ์ง๊ฐ ์ด๋ฏธ ์๋ ๊ฒฝ์ฐ ๋ ธ๋์ ํฌ์ธํธ๋ฅผ ๋ถ์ฌํ๋ ImageLocalityPriority ์ ์ฑ ์ ๋ฐ๋ผ ๋ ธ๋๊ฐ ํฌ์ธํธ๋ฅผ ์ป์ง ๋ชปํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ํ์๋ ์ฃผ๋ชฉํ ๊ฐ์น๊ฐ ์์ต๋๋ค. ์ฆ, ์์ฉ ํ๋ก๊ทธ๋จ์ ์ ๋ฒ์ ์ ๋กค์์ํ ๋ cron ์์ ์ด ๋ ๊ฐ์ ๋ ธ๋์์ ์คํ๋๊ณ ๋์ปค ๋ ์ง์คํธ๋ฆฌ์์ ์ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ์ฌ ๋ ๋ ธ๋๊ฐ ์๋์ ์ผ๋ก ๋ ๋์ ์ต์ข ์ ์๋ฅผ ๋ฐ์์ต๋๋ค. ์ธ๋ฒ์งธ ๊ฒ.
์์์ ์ด ๊ฒ์ฒ๋ผ ๋ก๊ทธ์๋ ImageLocalityPriority ์ ์ฑ ํ๊ฐ์ ๋ํ ์ ๋ณด๊ฐ ํ์๋์ง ์์ผ๋ฏ๋ก ๊ฐ์ ์ ํ์ธํ๊ธฐ ์ํด ์ ๋ฒ์ ์ ์ ํ๋ฆฌ์ผ์ด์ ์ผ๋ก ์ด๋ฏธ์ง๋ฅผ ์ธ ๋ฒ์งธ ๋ ธ๋๋ก ์คํ๋งํ ํ ๊ณํ ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ์ต๋๋ค. ImageLocalityPriority ์ ์ฑ ๋๋ฌธ์ ์ผ์ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ๊ด์ฐฐ๋์ง ์๊ณ ๋ ์์ฃผ ๋ค๋ฅธ ๋ฌธ์ ์ ์ฐ๊ด๋์์ต๋๋ค. ๊ธฐ๋ณธ kube-scheduler์ ์ฐ์ ์์ ๋ชฉ๋ก์ ์๋ ๊ฐ ์ ์ฑ ์ ์์ ํ ๋๋ฒ๊น ํ ์ ์๊ธฐ ๋๋ฌธ์ ํฌ๋ ์ค์ผ์ค๋ง ์ ์ฑ ์ ์ ์ฐํ๊ฒ ๊ด๋ฆฌํ ํ์๊ฐ ์์์ต๋๋ค.
๋ฌธ์ ์ฑ๋ช
์ฐ๋ฆฌ๋ ๋ฌธ์ ์ ๋ํ ์๋ฃจ์ ์ด ๊ฐ๋ฅํ ํ ๋์ํ๋๊ธฐ๋ฅผ ์ํ์ต๋๋ค. ์ฆ, Kubernetes์ ์ฃผ์ ์ํฐํฐ(์ฌ๊ธฐ์๋ ๊ธฐ๋ณธ kube-scheduler๋ฅผ ์๋ฏธํจ)๊ฐ ๋ณ๊ฒฝ๋์ง ์์ ์ํ๋ก ์ ์ง๋์ด์ผ ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ํ ๊ณณ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ ๋ค๋ฅธ ๊ณณ์์ ๋ง๋ค๊ณ ์ถ์ง ์์์ต๋๋ค. ๋ฐ๋ผ์ ๊ธฐ์ฌ ์๊ฐ์์ ๋ฐํ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํ ๋ ๊ฐ์ง ์ต์ , ์ฆ ์ถ๊ฐ ์ค์ผ์ค๋ฌ๋ฅผ ์์ฑํ๊ฑฐ๋ ์ง์ ์์ฑํ๋ ๋ ๊ฐ์ง ์ต์ ์ ๋๋ฌํ์ต๋๋ค. ํฌ๋ก ์์ ์ ์์ฝํ๊ธฐ ์ํ ์ฃผ์ ์๊ตฌ ์ฌํญ์ ๋ก๋๋ฅผ ์ธ ๋ ธ๋์ ๊ณ ๋ฅด๊ฒ ๋ถ์ฐ์ํค๋ ๊ฒ์ ๋๋ค. ์ด ์๊ตฌ ์ฌํญ์ ๊ธฐ์กด kube-scheduler ์ ์ฑ ์ผ๋ก ์ถฉ์กฑํ ์ ์์ผ๋ฏ๋ก ์์ ์ ๋ํ ์์ฒด ์ค์ผ์ค๋ฌ๋ฅผ ์์ฑํ๋ ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค.
์ถ๊ฐ kube-scheduler ์์ฑ ๋ฐ ๋ฐฐํฌ ์ง์นจ์ ๋ค์ ํญ๋ชฉ์ ์ค๋ช
๋์ด ์์ต๋๋ค.
- ์๋น์ค๋ ๋ชจ๋ ํด๋ฌ์คํฐ ๋ง์คํฐ์์ ์ ์ ํฌ๋๋ก ๋ฐฐํฌ๋์ด์ผ ํฉ๋๋ค.
- kube-scheduler๊ฐ ํฌํจ๋ ํ์ฑ ํฌ๋๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ฅ์ ์กฐ์น๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
- ๊ณํ ์ ์ฃผ์ ์ฐ์ ์์๋ ๋ ธ๋์์ ์ฌ์ฉ ๊ฐ๋ฅํ ๋ฆฌ์์ค์ ์(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
์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๊ฐ๋ตํ ์ค๋ช ํฉ๋๋ค.
- ํฌ๋ ๋ฐ ์ปจํ ์ด๋ ์ด๋ฆ์ด kube-scheduler-cron์ผ๋ก ๋ณ๊ฒฝ๋จ
- ์ต์
์ ์์ ๋ฐ๋ผ ํฌํธ 10151 ๋ฐ 10159๋ฅผ ์ฌ์ฉํ๋๋ก ์ง์ ๋จ
hostNetwork: true
๊ธฐ๋ณธ kube-scheduler(10251 ๋ฐ 10259)์ ๋์ผํ ํฌํธ๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. - --config ๋งค๊ฐ๋ณ์๋ฅผ ์ฌ์ฉํ์ฌ ์๋น์ค๋ฅผ ์์ํ ๊ตฌ์ฑ ํ์ผ์ ์ง์ ํฉ๋๋ค.
- ํธ์คํธ์์ ๊ตฌ์ฑ ํ์ผ(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"
์ฃผ์ ๋ณ๊ฒฝ ์ฌํญ์ ๋ํด ๊ฐ๋ตํ ์ค๋ช ํฉ๋๋ค.
- schedulerName์ ์๋น์ค kube-scheduler-cron์ ์ด๋ฆ์ผ๋ก ์ค์ ํฉ๋๋ค.
- ๋งค๊ฐ๋ณ์์์
lockObjectName
๋ํ ์๋น์ค ์ด๋ฆ์ ์ค์ ํ๊ณ ๋งค๊ฐ๋ณ์๊ฐleaderElect
true๋ก ์ค์ ํฉ๋๋ค(๋ง์คํฐ ๋ ธ๋๊ฐ ํ๋์ธ ๊ฒฝ์ฐ ๊ฐ์ false๋ก ์ค์ ํ ์ ์์). - ํ๋ผ๋ฏธํฐ์ ์ค์ผ์ค๋ง ์ ์ฑ
์ ์ค๋ช
์ผ๋ก ํ์ผ ๊ฒฝ๋ก ์ง์
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 ์์ ์ ์ผ์ ํ์ง ์์ ์ผ์ ๋ฌธ์ ๊ฐ ๋ ์ด์ ๋ฐ์ํ์ง ์์์ต๋๋ค.
๋ธ๋ก๊ทธ์์ ๋ค๋ฅธ ๊ธฐ์ฌ๋ ์ฝ์ด๋ณด์ธ์.
Calico๋ฅผ ์ฌ์ฉํ Kubernetes ํด๋ฌ์คํฐ์ ํธ๋ํฝ ๊ด๋ฆฌ Calico๋ฅผ ์ฌ์ฉํ ๋คํธ์ํฌ ์ ์ฑ ์ํ ์ต์ ์ดํด Linux conntrack์ด ๋ ์ด์ ์น๊ตฌ๊ฐ ์๋ ๊ฒฝ์ฐ iota ์ด๊ฑฐํ์ 4๊ฐ์ง ์ ๋ค์ดํ์ ์์ด Kubernetes ํด๋ฌ์คํฐ ์ ๊ทธ๋ ์ด๋ ๊ฐ๋ ์ค์ง ์๊ฐ์ด ์๋ ๋ฐฐํฌ ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค Kubernetes: ์์คํ ๋ฆฌ์์ค ๊ด๋ฆฌ๋ฅผ ์ค์ ํ๋ ๊ฒ์ด ์ ๊ทธ๋ ๊ฒ ์ค์ํ๊ฐ์?
์ถ์ฒ : habr.com