Search
๐Ÿ—“๏ธ

[CKA] 24. Scheduler Profile

Date
2024/12/05
Category
Devops
Tag
Kubernetes
CKA
Scheduling
๋ชฉ์ฐจ

ย Scheduling

ย Scheduling Queue

Pod๋“ค์ด ์ƒ์„ฑ๋˜๋ฉด Scheduling Queue์— ๋“ค์–ด๊ฐ€ ์Šค์ผ€์ค„๋ง๋˜๊ธธ ๊ธฐ๋‹ค๋ฆฐ๋‹ค. Scheduling Queue์—์„œ๋„ ์šฐ์„ ์ˆœ์œ„์— ๋”ฐ๋ผ Pod์˜ ์Šค์ผ€์ค„๋ง ์ˆœ์„œ๊ฐ€ ์ •ํ•ด์ง„๋‹ค. ์šฐ์„ ์ˆœ์œ„๋Š” PriorityClass๋ฅผ ํ†ตํ•ด ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, Pod์˜ spec์— ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.
apiVersion: scheduling.k8s.io/v1 kind: PriorityClass metadata: name: high-priority value: 1000000 # value ๊ฐ’์„ ๋น„๊ตํ•ด ์šฐ์„  ์ˆœ์œ„ ํŒ๋‹จ globalDefault: false description: "This priority class should be used for XYZ service pods only"
YAML
๋ณต์‚ฌ

ย Filtering

Scheduling Queue์—์„œ ์šฐ์„  ์ˆœ์œ„๊ฐ€ ๋†’์•„ ๋จผ์ € ์Šค์ผ€์ค„๋ง๋  Pod๋Š” Filtering ๋‹จ๊ณ„์— ๋Œ์ž…ํ•œ๋‹ค.
Pod๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์—†๋Š” Node๊ฐ€ ๊ฑธ๋Ÿฌ์ง„๋‹ค. ์˜ˆ๋กœ, Pod์˜ CPU request ๊ฐ€ 10์ด๋ผ๋ฉด 10 ๋ฏธ๋งŒ์˜ CPU๋ฅผ ๊ฐ€์ง„ Node๋Š” ๊ฑธ๋Ÿฌ์ง„๋‹ค.

ย Scoring

Filtering์„ ํ†ตํ•ด ๊ฑธ๋Ÿฌ์ง„ Node๋“ค์€ Pod์˜ ์š”๊ตฌ์‚ฌํ•ญ์— ๊ทผ๊ฑฐํ•˜์—ฌ ์ ์ˆ˜๊ฐ€ ๋งค๊ฒจ์ง„๋‹ค
๋†’์€ ์ ์ˆ˜๊ฐ€ ๋งค๊ฒจ์ง„ Pod๊ฐ€ ์„ ํƒ๋˜์–ด ๋‹ค์Œ ๋‹จ๊ณ„์ธ Binding์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค

ย Binding

Pod๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ์ ์ˆ˜๋ฅผ ๊ฐ€์ง„ Node์— ๋ฐ”์ธ๋”ฉ๋˜์–ด ๋ฐฐํฌ๋œ๋‹ค

Scheduling Plugins

Scheduling Queue โ†’ Filtering โ†’ Scoring โ†’ Binding
์ด ๋ชจ๋“  ์ž‘์—…์€ ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค

ย Scheduling Queue

โ€ข
PrioritySort
โ—ฆ
Scheduling Queue์—์„œ ์šฐ์„ ์ˆœ์œ„ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ Pod์—์„œ ์šฐ์„ ์ˆœ์œ„๋กœ ์„ค์ •ํ•œ ๊ธฐ์ค€์— ๋”ฐ๋ผ ์ˆœ์„œ๋Œ€๋กœ ์ •๋ ฌํ•œ๋‹ค

ย Filtering

โ€ข
NodeResourcesFit
โ—ฆ
Pod์— ํ•„์š”ํ•œ ์ถฉ๋ถ„ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง„ ๋…ธ๋“œ๋ฅผ ์‹๋ณ„ํ•˜๊ณ , ๋ถ€์กฑํ•œ ๋…ธ๋“œ๋Š” ๊ฑธ๋Ÿฌ๋‚ธ๋‹ค.
โ€ข
NodeName
โ—ฆ
Pod.spec์—์„œ ์–ธ๊ธ‰๋œ ๋…ธ๋“œ ์ด๋ฆ„์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“  ๋…ธ๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•œ๋‹ค
โ€ข
NodeUnschedulable
โ—ฆ
Unshedulable Flag๊ฐ€ true๋กœ ์„ค์ •๋œ ๋…ธ๋“œ๋ฅผ ํ•„ํ„ฐ๋งํ•œ๋‹ค
โ–ช
์ด๋Š” ๋…ธ๋“œ๋ฅผ drain (cordon command)ํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค
โ—ฆ
์ด ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ํ•ด๋‹น ๋…ธ๋“œ์— ์„ค์ •๋œ Pod๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ํ™•์‹คํ•˜๊ฒŒ ํ•œ๋‹ค.

ย Scoring

์ ์ˆ˜๋ฅผ ๋งค๊ธธ ๋ฟ ํŠน์ • Node๊ฐ€ Pod ๋ฐฐ์น˜๋ฅผ ๊ฑฐ๋ถ€(reject)ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ImageLocality์— ๋”ฐ๋ผ Pod์˜ ์ด๋ฏธ์ง€๋ฅผ ์ด๋ฏธ ์‚ฌ์šฉํ•˜๋Š” Node๋ผ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ๋ฉด, ์ด๋ฏธ์ง€๊ฐ€ ์—†๋Š” Node์— ๋ฐฐ์น˜๋œ๋‹ค
โ€ข
NodeResourcesFit
โ—ฆ
๊ฐ ๋…ธ๋“œ์˜ ๊ฐ€์šฉ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ ์ˆ˜๋ฅผ ํ• ๋‹นํ•˜์—ฌ Pod๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์— ํ• ๋‹นํ•œ๋‹ค
โ€ข
ImageLocality
โ—ฆ
๋‹ค์–‘ํ•œ ๋…ธ๋“œ ์ค‘์—์„œ Pod๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ ์ด๋ฏธ์ง€๋ฅผ ์ด๋ฏธ ๋ณด์œ ํ•œ ๋…ธ๋“œ์— ๋†’์€ ์ ์ˆ˜๋ฅผ ํ• ๋‹นํ•œ๋‹ค

ย Binding

โ€ข
DefaultBinder
โ—ฆ
๋ฐ”์ธ๋”ฉ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ œ๊ณตํ•œ๋‹ค

ย Extension Points

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋›ฐ์–ด๋‚œ ํ™•์žฅ์„ฑ์œผ๋กœ ์ธํ•ด ์–ด๋–ค ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์–ด๋””์— ๋‘˜ ๊ฒƒ์ธ์ง€ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ณ , ์ปค์Šคํ…€ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์ž‘์„ฑํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ์€ ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ์—ฐ๊ฒฐ๋  ์ˆ˜ ์žˆ๋Š” ํ™•์žฅ ์ง€์ (Extension Points)์ด ์žˆ์œผ๋ฉฐ ์—ฌ๋Ÿฌ ํ™•์žฅ ์ง€์ ์— ๊ฑธ์ณ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค.

ย Scheduler Profiles

๋‹ค์ค‘ ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋ฐฐํฌํ•  ๋•Œ ๊ฐ๊ฐ์˜ ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋ณ„๋„์˜ ํ”„๋กœ์„ธ์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— scheduling decision์„ ๋‚ด๋ฆฌ๋Š” ๊ณผ์ •์—์„œ ๊ฒฝ์Ÿ ์กฐ๊ฑด(race conditions)์— ์ง๋ฉดํ•  ์ˆ˜ ์žˆ๋‹ค. ์˜ˆ๋ฅผ๋“ค์–ด, ํ•œ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋…ธ๋“œ์— ์ž‘์—…์„ ์Šค์ผ€์ค„๋งํ•  ๋•Œ, ๋‹ค๋ฅธ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋™์ผํ•œ ๋…ธ๋“œ์— ์ž‘์—…์„ ์Šค์ผ€์ค„๋งํ•˜๊ณ  ์žˆ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ์ง€ ๋ชปํ•  ์ˆ˜ ์žˆ๋‹ค.

Multiple Profiles in a Single Scheduler

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค 1.18 ๋ฒ„์ „๋ถ€ํ„ฐ ๋‹จ์ผ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋‹ค์ค‘ profile์„ ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. config ํŒŒ์ผ์—์„œ profile ๋ชฉ๋ก์— ๊ฐ scheduler์ด๋ฆ„์„ ๋ช…์‹œํ•˜์—ฌ ๊ฐ ์Šค์ผ€์ค„๋Ÿฌ์— ๋Œ€ํ•ด ๋ถ„๋ฆฌ๋œ ํ”„๋กœํŒŒ์ผ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
# my-scheduler-2-config.yaml apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - schedulerName: my-scheduler-2 - schedulerName: my-scheduler-3 - schedulerName: my-scheduler-4
YAML
๋ณต์‚ฌ
โ€ข
์—ฌ๋Ÿฌ ๊ฐœ์˜ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํ•˜๋‚˜์˜ ๋ฐ”์ด๋„ˆ๋ฆฌ๋กœ ์‹คํ–‰๋  ๋ฟ ๊ฐœ๋ณ„ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ์ž‘๋™ํ•œ๋‹ค

How to work differently

๊ฐ profile๋“ค์„ ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์ถ”๊ฐ€ ์„ค์ •์ด ํ•„์š”ํ•˜๋‹ค. ์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋Š” ํ”„๋กœํŒŒ์ผ์„ ์ถ”๊ฐ€๋งŒ ํ–ˆ์„ ๋ฟ ๊ธฐ๋ณธ ์Šค์ผ€์ค„๋Ÿฌ์ฒ˜๋Ÿผ ๋™์ž‘ํ•œ๋‹ค.
# my-scheduler-2-config.yaml apiVersion: kubescheduler.config.k8s.io/v1 kind: KubeSchedulerConfiguration profiles: - schedulerName: my-scheduler-2 plugins: score: disabled: - name: TaintToleration enabled: - name: MyCustomPluginA - name: MyCustomPluginB - schedulerName: my-scheduler-3 plugins: preScore: disabled: - name: '*' score: disabled: - name: '*' - schedulerName: my-scheduler-4
YAML
๋ณต์‚ฌ
โ€ข
ํŠน์ • ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•ด ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”๋ฅผ ํ†ตํ•ด profile๋“ค์ด ๋‹ค๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค.
โ—ฆ
my-scheduler-2
โ–ช
TaintToleration ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋น„ํ™œ์„ฑํ™”
โ–ช
์‚ฌ์šฉ์ž ์ •์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ MyCustomPluginA์™€ MyCustomPluginB๋ฅผ ํ™œ์„ฑํ™”
โ—ฆ
my-scheduler-3
โ–ช
๋ชจ๋“  preScore ํ”Œ๋Ÿฌ๊ทธ์ธ ๋น„ํ™œ์„ฑํ™”
โ–ช
๋ชจ๋“  score ํ”Œ๋Ÿฌ๊ทธ์ธ ๋น„ํ™œ์„ฑํ™”