๐ŸŽฏ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šค์ผ€์ค„๋ง ์›๋ฆฌ: Pod๋Š” ์–ด๋–ป๊ฒŒ ๋ฐฐ์น˜๋ ๊นŒ?

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์—ฌ๋Ÿฌ ์ปดํ“จํ„ฐ(Node)๋กœ ๊ตฌ์„ฑ๋œ ํฐ ์‹œ์Šคํ…œ์ด์—์š”.
๊ทธ๋Ÿผ ์ด๋Ÿฐ ์งˆ๋ฌธ์ด ์ƒ๊ธฐ๊ฒ ์ฃ ?

โ€œ์ƒˆ๋กœ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(Pod)์€ ์–ด๋–ค ์ปดํ“จํ„ฐ์— ์„ค์น˜๋˜์ง€?โ€

๋ฐ”๋กœ ์ด๊ฑธ ๊ฒฐ์ •ํ•ด์ฃผ๋Š” ๊ฒŒ ์Šค์ผ€์ค„๋ง(Scheduling) ์ž…๋‹ˆ๋‹ค!


๐Ÿ“ฆ ์Šค์ผ€์ค„๋ง์ด๋ž€?

Pod๊ฐ€ ๋งŒ๋“ค์–ด์ง€๋ฉด, ๊ทธ๊ฒƒ์„ ์–ด๋А ์ปดํ“จํ„ฐ(Node)์— ์‹คํ–‰์‹œํ‚ฌ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •์ด์—์š”.
์ด ์—ญํ• ์„ ํ•˜๋Š” ๊ฒƒ์ด ๋ฐ”๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šค์ผ€์ค„๋Ÿฌ(kube-scheduler)์ž…๋‹ˆ๋‹ค.

์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋‹ค์Œ 3๋‹จ๊ณ„๋ฅผ ๊ฑฐ์ณ Pod์˜ ๋ฐฐ์น˜๋ฅผ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค:

[1๋‹จ๊ณ„] ํ•„ํ„ฐ๋ง: ๊ฐ€๋Šฅํ•œ Node ๊ณ ๋ฅด๊ธฐ  
[2๋‹จ๊ณ„] ์ ์ˆ˜ ๋งค๊ธฐ๊ธฐ: ์–ด๋–ค Node๊ฐ€ ๋” ์ข‹์€์ง€ ํŒ๋‹จ  
[3๋‹จ๊ณ„] ์„ ํƒํ•˜๊ธฐ: ๊ฐ€์žฅ ์ข‹์€ Node์— ๋ฐฐ์น˜

๐Ÿงฎ 1๋‹จ๊ณ„: ํ•„ํ„ฐ๋ง (Filtering)

๋จผ์ € โ€œ์ด Pod๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ์ปดํ“จํ„ฐ๊ฐ€ ๋ˆ„๊ตฌ์•ผ?โ€๋ผ๊ณ  ๋ฌผ์–ด์š”.

โœ… ํ•„ํ„ฐ๋ง ์กฐ๊ฑด ์˜ˆ์‹œ:


๐Ÿ… 2๋‹จ๊ณ„: ์ ์ˆ˜ ๋งค๊ธฐ๊ธฐ (Scoring)

โ€œ์–ด๋–ค Node๊ฐ€ ๊ฐ€์žฅ ์ ํ•ฉํ•œ๊ฐ€?โ€๋ฅผ ํŒ๋‹จํ•˜๋Š” ๋‹จ๊ณ„์ž…๋‹ˆ๋‹ค.

๊ธฐ์ค€ ์„ค๋ช…
์‚ฌ์šฉ๋Ÿ‰ ์ ์€ Node ์—ฌ์œ ๊ฐ€ ๋งŽ์€ Node ์šฐ์„ 
์ž์›์ด ๊ณ ๋ฅด๊ฒŒ ์‚ฌ์šฉ๋œ Node CPU/๋ฉ”๋ชจ๋ฆฌ ๊ท ํ˜• ์žกํžŒ Node ์„ ํ˜ธ
์ด๋ฏธ์ง€๊ฐ€ ์ด๋ฏธ ์žˆ๋Š” Node ์ด๋ฏธ์ง€ ๋‹ค์šด๋กœ๋“œ ์‹œ๊ฐ„ ์ ˆ์•ฝ

์ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ Node๊ฐ€ ์ตœ์ข… ์„ ํƒ๋ฉ๋‹ˆ๋‹ค.


๐Ÿ– 3๋‹จ๊ณ„: ๋ฐฐ์น˜ (Binding)

์ ์ˆ˜๊ฐ€ ์ œ์ผ ๋†’์€ Node์— Pod๊ฐ€ ์‹ค์ œ๋กœ ๋ฐฐ์น˜(Binding) ๋ฉ๋‹ˆ๋‹ค.


๐Ÿšซ Taint & Toleration

ํŠน์ • Node๋Š” โ€œํŠน์ˆ˜ ์šฉ๋„โ€๋กœ๋งŒ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ์ˆ˜ ์žˆ์–ด์š”.
์˜ˆ: GPU ์ „์šฉ, ๊ด€๋ฆฌ์ž ์ „์šฉ ์„œ๋ฒ„ ๋“ฑ

์„œ๋กœ ์กฐ๊ฑด์ด ๋งž์•„์•ผ๋งŒ ๋ฐฐ์น˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.


๐Ÿงฒ Affinity (์นœํ™”์„ฑ ์„ค์ •)

Pod๋Š” ์–ด๋–ค Node์— ๋ฐฐ์น˜๋˜๊ธธ ์›ํ•˜๋Š”์ง€๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์–ด์š”.

๐Ÿ”น Node Affinity

Node ๋ผ๋ฒจ ๊ธฐ์ค€์œผ๋กœ โ€œ์ด๋Ÿฐ Node์— ๋ฐฐ์น˜ํ•ด์ฃผ์„ธ์š”!โ€

๐Ÿ”น Pod Affinity

โ€œ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋‹ค๋ฅธ Pod ๊ทผ์ฒ˜์—์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์–ด์š”.โ€

๐Ÿ”น Pod Anti-Affinity

โ€œ๊ฐ™์€ ์ข…๋ฅ˜์˜ Pod์™€๋Š” ๋–จ์–ด์ ธ์„œ ์‹คํ–‰ํ•˜๊ณ  ์‹ถ์–ด์š”.โ€

์นœํ™”์„ฑ ์„ค์ •์„ ํ†ตํ•ด Pod ๋ฐฐ์น˜๋ฅผ ๋” ์Šค๋งˆํŠธํ•˜๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์–ด์š”.


๐Ÿงช ์‹ค์Šต ์˜ˆ์‹œ

๐Ÿท๏ธ 1. ํŠน์ • Node์— ๋ผ๋ฒจ ๋ถ™์ด๊ธฐ

kubectl label nodes node1 disktype=ssd

๐Ÿ“ฆ 2. ํ•ด๋‹น ๋ผ๋ฒจ์ด ์žˆ๋Š” Node์—๋งŒ ๋ฐฐ์น˜๋˜๋Š” Pod ๋งŒ๋“ค๊ธฐ

spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: disktype
            operator: In
            values:
              - ssd

๐Ÿ“ Topology Spread (๋ถ„์‚ฐ ๋ฐฐ์น˜)

โ€œ๊ฐ™์€ ์ข…๋ฅ˜์˜ Pod๊ฐ€ ํ•œ ๊ณณ์— ๋ชฐ๋ฆฌ๋ฉด ์žฅ์•  ๋ฐœ์ƒ ์‹œ ์œ„ํ—˜ํ•ด์š”.โ€
โ‡’ ๊ทธ๋ž˜์„œ Pod๋“ค์„ ๊ณจ๊ณ ๋ฃจ ๋ถ„์‚ฐ์‹œํ‚ค๋Š” ๊ธฐ๋Šฅ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

topologySpreadConstraints:
  - maxSkew: 1
    topologyKey: kubernetes.io/hostname
    whenUnsatisfiable: ScheduleAnyway

์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์—ฌ๋Ÿฌ ์„œ๋ฒ„์— Pod๊ฐ€ ํผ์ ธ์„œ ์žฅ์• ์— ๋” ๊ฐ•ํ•ด์ ธ์š”! ๐Ÿ‘


๐Ÿง  ๋งˆ๋ฌด๋ฆฌ ์š”์•ฝ

๊ฐœ๋… ์„ค๋ช…
์Šค์ผ€์ค„๋ง Pod๋ฅผ Node์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ณผ์ •
ํ•„ํ„ฐ๋ง ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Node๋ฅผ ๊ณจ๋ผ๋‚ด๊ธฐ
์ ์ˆ˜ํ™” ์–ด๋–ค Node๊ฐ€ ๋” ์ข‹์€์ง€ ํŒ๋‹จ
Taint & Toleration ๊ธˆ์ง€/ํ—ˆ์šฉ ์กฐ๊ฑด์œผ๋กœ ๋…ธ๋“œ ์ œ์–ด
Affinity ๋ฐฐ์น˜ ํฌ๋ง ์กฐ๊ฑด ์„ค์ •
Spread ๊ณ ๋ฅด๊ฒŒ ๋ถ„์‚ฐ ๋ฐฐ์น˜

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋‹จ์ˆœํ•œ ๋ฐฐ์น˜๊ฐ€ ์•„๋‹Œ, ๋˜‘๋˜‘ํ•˜๊ฒŒ Pod๋ฅผ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค.
์ดํ•ดํ•˜๋ฉด ํด๋Ÿฌ์Šคํ„ฐ ์šด์˜์ด ํ›จ์”ฌ ์•ˆ์ •์ ์ด๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋ฐ”๋€” ์ˆ˜ ์žˆ์–ด์š”!

๐Ÿ“Ž ์ฐธ๊ณ ์ž๋ฃŒ