Information in this document may be out of date

This document has an older update date than the original, so the information it contains may be out of date. If you're able to read English, see the English version for the most up-to-date information: Assigning Pods to Nodes

๋…ธ๋“œ์— ํŒŒ๋“œ ํ• ๋‹นํ•˜๊ธฐ

ํŠน์ •ํ•œ ๋…ธ๋“œ(๋“ค) ์ง‘ํ•ฉ์—์„œ๋งŒ ๋™์ž‘ํ•˜๊ฑฐ๋‚˜ ํŠน์ •ํ•œ ๋…ธ๋“œ ์ง‘ํ•ฉ์—์„œ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•˜๋„๋ก ํŒŒ๋“œ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•์—๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ถŒ์žฅ๋˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋ชจ๋‘ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„ ํƒ์„ ์šฉ์ดํ•˜๊ฒŒ ํ•œ๋‹ค. ๋ณดํ†ต์€ ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ž๋™์œผ๋กœ ํ•ฉ๋ฆฌ์ ์ธ ๋ฐฐ์น˜(์˜ˆ: ์ž์›์ด ๋ถ€์กฑํ•œ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๋„๋ก ๋…ธ๋“œ ๊ฐ„์— ํŒŒ๋“œ๋ฅผ ๋ถ„๋ฐฐ)๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ์— ์ด๋Ÿฌํ•œ ์ œ์•ฝ ์กฐ๊ฑด์„ ์„ค์ •ํ•  ํ•„์š”๋Š” ์—†๋‹ค. ๊ทธ๋Ÿฌ๋‚˜, ์˜ˆ๋ฅผ ๋“ค์–ด SSD๊ฐ€ ์žฅ์ฐฉ๋œ ๋จธ์‹ ์— ํŒŒ๋“œ๊ฐ€ ๋ฐฐํฌ๋˜๋„๋ก ํ•˜๊ฑฐ๋‚˜ ๋˜๋Š” ๋งŽ์€ ํ†ต์‹ ์„ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์„œ๋กœ ๋‹ค๋ฅธ ์„œ๋น„์Šค์˜ ํŒŒ๋“œ๋ฅผ ๋™์ผํ•œ ๊ฐ€์šฉ์„ฑ ์˜์—ญ(availability zone)์— ๋ฐฐ์น˜ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๊ฐ™์ด, ํŒŒ๋“œ๊ฐ€ ์–ด๋А ๋…ธ๋“œ์— ๋ฐฐํฌ๋ ์ง€๋ฅผ ์ œ์–ดํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๋„ ์žˆ๋‹ค.

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํŠน์ • ํŒŒ๋“œ๋ฅผ ์–ด๋А ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋งํ• ์ง€ ๊ณ ๋ฅด๋Š” ๋‹ค์Œ์˜ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋ฅผ ๊ณจ๋ผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋…ธ๋“œ ๋ ˆ์ด๋ธ”

๋‹ค๋ฅธ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์˜ค๋ธŒ์ ํŠธ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ, ๋…ธ๋“œ๋„ ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„๋‹ค. ๋ ˆ์ด๋ธ”์„ ์ˆ˜๋™์œผ๋กœ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜ํ•œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋„ ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ํ‘œ์ค€ํ™”๋œ ๋ ˆ์ด๋ธ” ์ง‘ํ•ฉ์„ ์ ์šฉํ•œ๋‹ค. ์ž˜ ์•Œ๋ ค์ง„ ๋ ˆ์ด๋ธ”, ์–ด๋…ธํ…Œ์ด์…˜, ํ…Œ์ธํŠธ์—์„œ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ๋…ธ๋“œ ๋ ˆ์ด๋ธ”์˜ ๋ชฉ๋ก์„ ํ™•์ธํ•œ๋‹ค.

๋…ธ๋“œ ๊ฒฉ๋ฆฌ/์ œํ•œ

๋…ธ๋“œ์— ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜์—ฌ ํŒŒ๋“œ๋ฅผ ํŠน์ • ๋…ธ๋“œ ๋˜๋Š” ๋…ธ๋“œ ๊ทธ๋ฃน์— ์Šค์ผ€์ค„๋ง๋˜๋„๋ก ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ํŠน์ • ํŒŒ๋“œ๊ฐ€ ํŠน์ • ๊ฒฉ๋ฆฌ/๋ณด์•ˆ/๊ทœ์ œ ์†์„ฑ์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ์—์„œ๋งŒ ์‹คํ–‰๋˜๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋…ธ๋“œ ๊ฒฉ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•  ๋•Œ, kubelet์ด ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ๋ ˆ์ด๋ธ” ํ‚ค๋ฅผ ์„ ํƒํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด kubelet์ด ํ•ด๋‹น ๋ ˆ์ด๋ธ”์„ ๋ณ€๊ฒฝํ•˜์—ฌ ๋…ธ๋“œ๊ฐ€ ์‚ฌ์šฉ ๋ถˆ๊ฐ€๋Šฅ(compromised) ์ƒํƒœ๋กœ ๋น ์ง€๊ณ  ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ์ด ๋…ธ๋“œ์— ์›Œํฌ๋กœ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋Š” ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค.

NodeRestriction ์–ด๋“œ๋ฏธ์…˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ kubelet์ด node-restriction.kubernetes.io/ ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ–๋Š” ๋ ˆ์ด๋ธ”์„ ์„ค์ •ํ•˜๊ฑฐ๋‚˜ ๋ณ€๊ฒฝํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.

๋…ธ๋“œ ๊ฒฉ๋ฆฌ๋ฅผ ์œ„ํ•ด ๋ ˆ์ด๋ธ” ์ ‘๋‘์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด,

  1. ๋…ธ๋“œ ์ธ๊ฐ€์ž(authorizer)๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  NodeRestriction ์–ด๋“œ๋ฏธ์…˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ํ™œ์„ฑํ™” ํ–ˆ๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
  2. ๋…ธ๋“œ์— node-restriction.kubernetes.io/ ์ ‘๋‘์‚ฌ๋ฅผ ๊ฐ–๋Š” ๋ ˆ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ณ , ๋…ธ๋“œ ์…€๋ ‰ํ„ฐ์—์„œ ํ•ด๋‹น ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค. ์˜ˆ: example.com.node-restriction.kubernetes.io/fips=true ๋˜๋Š” example.com.node-restriction.kubernetes.io/pci-dss=true

๋…ธ๋“œ์…€๋ ‰ํ„ฐ(nodeSelector)

nodeSelector๋Š” ๋…ธ๋“œ ์„ ํƒ ์ œ์•ฝ์‚ฌํ•ญ์˜ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•˜๋ฉด์„œ๋„ ์ถ”์ฒœํ•˜๋Š” ํ˜•ํƒœ์ด๋‹ค. ํŒŒ๋“œ ์ŠคํŽ™์— nodeSelector ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ , ํƒ€๊ฒŸ์œผ๋กœ ์‚ผ๊ณ  ์‹ถ์€ ๋…ธ๋“œ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ๋…ธ๋“œ ๋ ˆ์ด๋ธ”์„ ๋ช…์‹œํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋ช…์‹œํ•œ ๋ ˆ์ด๋ธ”์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•œ๋‹ค.

๋…ธ๋“œ์— ํŒŒ๋“œ ํ• ๋‹น์—์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ํ™•์ธํ•œ๋‹ค.

์–ดํ”ผ๋‹ˆํ‹ฐ(affinity)์™€ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ(anti-affinity)

nodeSelector ๋Š” ํŒŒ๋“œ๋ฅผ ํŠน์ • ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋…ธ๋“œ๋กœ ์ œํ•œํ•˜๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ๋ฐฉ๋ฒ•์ด๋‹ค. ์–ดํ”ผ๋‹ˆํ‹ฐ/์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ์€ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์•ฝ ์ข…๋ฅ˜๋ฅผ ํฌ๊ฒŒ ํ™•์žฅํ•œ๋‹ค. ์ฃผ์š” ๊ฐœ์„  ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ์–ดํ”ผ๋‹ˆํ‹ฐ/์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ์–ธ์–ด๊ฐ€ ๋” ํ‘œํ˜„์ ์ด๋‹ค. nodeSelector๋กœ๋Š” ๋ช…์‹œํ•œ ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋…ธ๋“œ๋งŒ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋‹ค. ์–ดํ”ผ๋‹ˆํ‹ฐ/์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋Š” ์„ ํƒ ๋กœ์ง์— ๋Œ€ํ•œ ์ข€ ๋” ๋งŽ์€ ์ œ์–ด๊ถŒ์„ ์ œ๊ณตํ•œ๋‹ค.
  • ๊ทœ์น™์ด "์†Œํ”„ํŠธ(soft)" ๋˜๋Š” "์„ ํ˜ธ์‚ฌํ•ญ(preference)" ์ž„์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด ๋•๋ถ„์— ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋งค์น˜๋˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์ง€ ๋ชปํ•œ ๊ฒฝ์šฐ์—๋„ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋‹ค๋ฅธ ๋…ธ๋“œ (๋˜๋Š” ๋‹ค๋ฅธ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ)์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋‹ค๋ฅธ ํŒŒ๋“œ์˜ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ๋“œ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ํŒŒ๋“œ๋“ค์ด ๋…ธ๋“œ์— ํ•จ๊ป˜ ์œ„์น˜ํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•œ ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค.

์–ดํ”ผ๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ์€ ๋‹ค์Œ์˜ ๋‘ ๊ฐ€์ง€ ์ข…๋ฅ˜๋กœ ๊ตฌ์„ฑ๋œ๋‹ค.

  • ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ธฐ๋Šฅ์€ nodeSelector ํ•„๋“œ์™€ ๋น„์Šทํ•˜์ง€๋งŒ ๋” ํ‘œํ˜„์ ์ด๊ณ  ์†Œํ”„ํŠธ(soft) ๊ทœ์น™์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.
  • ํŒŒ๋“œ ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ/์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๋Š” ๋‹ค๋ฅธ ํŒŒ๋“œ์˜ ๋ ˆ์ด๋ธ”์„ ์ด์šฉํ•˜์—ฌ ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด ์ค€๋‹ค.

๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ

๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋Š” ๊ฐœ๋…์ ์œผ๋กœ nodeSelector ์™€ ๋น„์Šทํ•˜๋ฉฐ, ๋…ธ๋“œ์˜ ๋ ˆ์ด๋ธ”์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง๋  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ์—๋Š” ๋‹ค์Œ์˜ ๋‘ ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  • requiredDuringSchedulingIgnoredDuringExecution: ๊ทœ์น™์ด ๋งŒ์กฑ๋˜์ง€ ์•Š์œผ๋ฉด ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•  ์ˆ˜ ์—†๋‹ค. ์ด ๊ธฐ๋Šฅ์€ nodeSelector์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ, ์ข€ ๋” ํ‘œํ˜„์ ์ธ ๋ฌธ๋ฒ•์„ ์ œ๊ณตํ•œ๋‹ค.
  • preferredDuringSchedulingIgnoredDuringExecution: ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ•œ๋‹ค. ํ•ด๋‹น๋˜๋Š” ๋…ธ๋“œ๊ฐ€ ์—†๋”๋ผ๋„, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ์—ฌ์ „ํžˆ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•œ๋‹ค.

ํŒŒ๋“œ ์ŠคํŽ™์˜ .spec.affinity.nodeAffinity ํ•„๋“œ์— ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ๋“œ ์ŠคํŽ™์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

apiVersion: v1
kind: Pod
metadata:
  name: with-node-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: topology.kubernetes.io/zone
            operator: In
            values:
            - antarctica-east1
            - antarctica-west1
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: another-node-label-key
            operator: In
            values:
            - another-node-label-value
  containers:
  - name: with-node-affinity
    image: registry.k8s.io/pause:2.0

์ด ์˜ˆ์‹œ์—์„œ๋Š” ๋‹ค์Œ์˜ ๊ทœ์น™์ด ์ ์šฉ๋œ๋‹ค.

  • ๋…ธ๋“œ๋Š” ํ‚ค๊ฐ€ topology.kubernetes.io/zone์ธ ๋ ˆ์ด๋ธ”์„ ๊ฐ–๊ณ  ์žˆ์–ด์•ผ ํ•˜๋ฉฐ, ๋ ˆ์ด๋ธ”์˜ ๊ฐ’์ด antarctica-east1 ํ˜น์€ antarctica-west1์—ฌ์•ผ ํ•œ๋‹ค.
  • ํ‚ค๊ฐ€ another-node-label-key์ด๊ณ  ๊ฐ’์ด another-node-label-value์ธ ๋ ˆ์ด๋ธ”์„ ๊ฐ–๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๋ฅผ ์„ ํ˜ธํ•œ๋‹ค .

operator ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๊ทœ์น™์„ ํ•ด์„ํ•  ๋•Œ ์‚ฌ์šฉํ•  ๋…ผ๋ฆฌ ์—ฐ์‚ฐ์ž๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค. In, NotIn, Exists, DoesNotExist, Gt ๋ฐ Lt ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

NotIn ๋ฐ DoesNotExist ์—ฐ์‚ฐ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋…ธ๋“œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์„ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ๋˜๋Š”, ํŠน์ • ๋…ธ๋“œ์—์„œ ํŒŒ๋“œ๋ฅผ ์ซ“์•„๋‚ด๋Š” ๋…ธ๋“œ ํ…Œ์ธํŠธ(taint)๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด ๋…ธ๋“œ์— ํŒŒ๋“œ ํ• ๋‹น์—์„œ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ํ™•์ธํ•œ๋‹ค.

๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ฐ€์ค‘์น˜(weight)

๊ฐ preferredDuringSchedulingIgnoredDuringExecution ์–ดํ”ผ๋‹ˆํ‹ฐ ํƒ€์ž… ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•ด 1-100 ๋ฒ”์œ„์˜ weight๋ฅผ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ๋‹ค๋ฅธ ๋ชจ๋“  ํŒŒ๋“œ ์Šค์ผ€์ค„๋ง ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๋ฅผ ์ฐพ์œผ๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๋…ธ๋“œ๊ฐ€ ๋งŒ์กฑํ•œ ๋ชจ๋“  ์„ ํ˜ธํ•˜๋Š”(preferred) ๊ทœ์น™์— ๋Œ€ํ•ด ํ•ฉ๊ณ„ ๊ณ„์‚ฐ์„ ์œ„ํ•œ weight ๊ฐ’์„ ๊ฐ๊ฐ ์ถ”๊ฐ€ํ•œ๋‹ค.

์ตœ์ข… ํ•ฉ๊ณ„๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์šฐ์„  ์ˆœ์œ„ ํ•จ์ˆ˜ ์ ์ˆ˜์— ๋”ํ•ด์ง„๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ๊ฐ€ ํŒŒ๋“œ์— ๋Œ€ํ•œ ์Šค์ผ€์ค„๋ง ํŒ๋‹จ์„ ํ•  ๋•Œ, ์ด ์ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋…ธ๋“œ๊ฐ€ ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ฐ–๋Š”๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ๋“œ ์ŠคํŽ™์ด ์žˆ๋‹ค๊ณ  ํ•˜์ž.

apiVersion: v1
kind: Pod
metadata:
  name: with-affinity-anti-affinity
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchExpressions:
          - key: kubernetes.io/os
            operator: In
            values:
            - linux
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 1
        preference:
          matchExpressions:
          - key: label-1
            operator: In
            values:
            - key-1
      - weight: 50
        preference:
          matchExpressions:
          - key: label-2
            operator: In
            values:
            - key-2
  containers:
  - name: with-node-affinity
    image: registry.k8s.io/pause:2.0

preferredDuringSchedulingIgnoredDuringExecution ๊ทœ์น™์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ์žˆ๊ณ , ํ•˜๋‚˜์—๋Š” label-1:key-1 ๋ ˆ์ด๋ธ”์ด ์žˆ๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜์—๋Š” label-2:key-2 ๋ ˆ์ด๋ธ”์ด ์žˆ์œผ๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ๊ฐ ๋…ธ๋“œ์˜ weight๋ฅผ ํ™•์ธํ•œ ๋’ค ํ•ด๋‹น ๋…ธ๋“œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ ์ˆ˜์— ๊ฐ€์ค‘์น˜๋ฅผ ๋”ํ•˜๊ณ , ์ตœ์ข… ์ ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋†’์€ ๋…ธ๋“œ์— ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•œ๋‹ค.

์Šค์ผ€์ค„๋ง ํ”„๋กœํŒŒ์ผ๋‹น ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.20 [beta]

์—ฌ๋Ÿฌ ์Šค์ผ€์ค„๋ง ํ”„๋กœํŒŒ์ผ์„ ๊ตฌ์„ฑํ•  ๋•Œ ๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ๊ฐ€ ์žˆ๋Š” ํ”„๋กœํŒŒ์ผ์„ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํ”„๋กœํŒŒ์ผ์ด ํŠน์ • ๋…ธ๋“œ ์ง‘ํ•ฉ์—๋งŒ ์ ์šฉ๋˜๋Š” ๊ฒฝ์šฐ ์œ ์šฉํ•˜๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์Šค์ผ€์ค„๋Ÿฌ ๊ตฌ์„ฑ์— ์žˆ๋Š” NodeAffinity ํ”Œ๋Ÿฌ๊ทธ์ธ์˜ args ํ•„๋“œ์— addedAffinity๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค.

apiVersion: kubescheduler.config.k8s.io/v1
kind: KubeSchedulerConfiguration

profiles:
  - schedulerName: default-scheduler
  - schedulerName: foo-scheduler
    pluginConfig:
      - name: NodeAffinity
        args:
          addedAffinity:
            requiredDuringSchedulingIgnoredDuringExecution:
              nodeSelectorTerms:
              - matchExpressions:
                - key: scheduler-profile
                  operator: In
                  values:
                  - foo

addedAffinity๋Š” .spec.schedulerName์„ foo-scheduler๋กœ ์„ค์ •ํ•˜๋Š” ๋ชจ๋“  ํŒŒ๋“œ์— ์ ์šฉ๋˜๋ฉฐ PodSpec์— ์ง€์ •๋œ NodeAffinity๋„ ์ ์šฉ๋œ๋‹ค. ์ฆ‰, ํŒŒ๋“œ๋ฅผ ๋งค์นญ์‹œํ‚ค๋ ค๋ฉด, ๋…ธ๋“œ๊ฐ€ addedAffinity์™€ ํŒŒ๋“œ์˜ .spec.NodeAffinity๋ฅผ ์ถฉ์กฑํ•ด์•ผ ํ•œ๋‹ค.

addedAffinity๋Š” ์—”๋“œ ์œ ์ €์—๊ฒŒ ํ‘œ์‹œ๋˜์ง€ ์•Š์œผ๋ฏ€๋กœ, ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋™์ž‘์ด ์ผ์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค. ์Šค์ผ€์ค„๋Ÿฌ ํ”„๋กœํŒŒ์ผ ์ด๋ฆ„๊ณผ ๋ช…ํ™•ํ•œ ์ƒ๊ด€ ๊ด€๊ณ„๊ฐ€ ์žˆ๋Š” ๋…ธ๋“œ ๋ ˆ์ด๋ธ”์„ ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ๋“œ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ

ํŒŒ๋“œ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ, ๋…ธ๋“œ ๋ ˆ์ด๋ธ” ๋Œ€์‹ , ๊ฐ ๋…ธ๋“œ์— ์ด๋ฏธ ์‹คํ–‰ ์ค‘์ธ ๋‹ค๋ฅธ ํŒŒ๋“œ ์˜ ๋ ˆ์ด๋ธ”์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ค„๋ง๋  ๋…ธ๋“œ๋ฅผ ์ œํ•œํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ๋“œ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์€ "X๊ฐ€ ๊ทœ์น™ Y๋ฅผ ์ถฉ์กฑํ•˜๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ํŒŒ๋“œ๋ฅผ ์ด๋ฏธ ์‹คํ–‰์ค‘์ธ ๊ฒฝ์šฐ ์ด ํŒŒ๋“œ๋Š” X์—์„œ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค(๋˜๋Š” ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ์˜ ๊ฒฝ์šฐ์—๋Š” "์‹คํ–‰ํ•˜๋ฉด ์•ˆ ๋œ๋‹ค")"์˜ ํ˜•ํƒœ์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ X๋Š” ๋…ธ๋“œ, ๋ž™, ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž ์กด ๋˜๋Š” ๋ฆฌ์ „ ๋“ฑ์ด๋ฉฐ Y๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ์ถฉ์กฑํ•  ๊ทœ์น™์ด๋‹ค.

์ด๋Ÿฌํ•œ ๊ทœ์น™(Y)์€ ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•˜๋ฉฐ, ์—ฐ๊ด€๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ชฉ๋ก์„ ์„ ํƒ์ ์œผ๋กœ ๋ช…์‹œํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ํŒŒ๋“œ๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๋Š”(namespaced) ์˜ค๋ธŒ์ ํŠธ์ด๋ฏ€๋กœ, ํŒŒ๋“œ ๋ ˆ์ด๋ธ”๋„ ์•”๋ฌต์ ์œผ๋กœ ํŠน์ • ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ์†ํ•˜๊ฒŒ ๋œ๋‹ค. ํŒŒ๋“œ ๋ ˆ์ด๋ธ”์— ๋Œ€ํ•œ ๋ชจ๋“  ๋ ˆ์ด๋ธ” ์…€๋ ‰ํ„ฐ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํ•ด๋‹น ๋ ˆ์ด๋ธ”์„ ์–ด๋–ค ๋„ค์ž„์ŠคํŽ˜์ด์Šค์—์„œ ํƒ์ƒ‰ํ• ์ง€๋ฅผ ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

topologyKey๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ(X)๋ฅผ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฉฐ, ์ด๋Š” ์‹œ์Šคํ…œ์ด ๋„๋ฉ”์ธ์„ ํ‘œ์‹œํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•˜๋Š” ๋…ธ๋“œ ๋ ˆ์ด๋ธ”์˜ ํ‚ค์ด๋‹ค. ์ด์— ๋Œ€ํ•œ ์˜ˆ์‹œ๋Š” ์ž˜ ์•Œ๋ ค์ง„ ๋ ˆ์ด๋ธ”, ์–ด๋…ธํ…Œ์ด์…˜, ํ…Œ์ธํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.

ํŒŒ๋“œ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ ๋ฐ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ์ข…๋ฅ˜

๋…ธ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๋ฐ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ์—๋Š” ๋‹ค์Œ์˜ 2 ์ข…๋ฅ˜๊ฐ€ ์žˆ๋‹ค.

  • requiredDuringSchedulingIgnoredDuringExecution
  • preferredDuringSchedulingIgnoredDuringExecution

์˜ˆ๋ฅผ ๋“ค์–ด, requiredDuringSchedulingIgnoredDuringExecution ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ํ†ต์‹ ์„ ๋งŽ์ด ํ•˜๋Š” ๋‘ ์„œ๋น„์Šค์˜ ํŒŒ๋“œ๋ฅผ ๋™์ผ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž ์กด์— ๋ฐฐ์น˜ํ•˜๋„๋ก ์Šค์ผ€์ค„๋Ÿฌ์—๊ฒŒ ์ง€์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋น„์Šทํ•˜๊ฒŒ, preferredDuringSchedulingIgnoredDuringExecution ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋น„์Šค์˜ ํŒŒ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ํด๋ผ์šฐ๋“œ ์ œ๊ณต์ž ์กด์— ํผ๋œจ๋ฆด ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ๋“œ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ํŒŒ๋“œ ์ŠคํŽ™์— affinity.podAffinity ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. ํŒŒ๋“œ๊ฐ„ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋ฉด, ํŒŒ๋“œ ์ŠคํŽ™์— affinity.podAntiAffinity ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.

ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ์˜ˆ์‹œ

๋‹ค์Œ๊ณผ ๊ฐ™์€ ํŒŒ๋“œ ์ŠคํŽ™์„ ๊ฐ€์ •ํ•œ๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: with-pod-affinity
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
      - labelSelector:
          matchExpressions:
          - key: security
            operator: In
            values:
            - S1
        topologyKey: topology.kubernetes.io/zone
    podAntiAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
      - weight: 100
        podAffinityTerm:
          labelSelector:
            matchExpressions:
            - key: security
              operator: In
              values:
              - S2
          topologyKey: topology.kubernetes.io/zone
  containers:
  - name: with-pod-affinity
    image: registry.k8s.io/pause:2.0

์ด ์˜ˆ์‹œ๋Š” ํ•˜๋‚˜์˜ ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™๊ณผ ํ•˜๋‚˜์˜ ํŒŒ๋“œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์„ ์ •์˜ํ•œ๋‹ค. ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์€ "ํ•˜๋“œ" requiredDuringSchedulingIgnoredDuringExecution์„, ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์€ "์†Œํ”„ํŠธ" preferredDuringSchedulingIgnoredDuringExecution์„ ์‚ฌ์šฉํ•œ๋‹ค.

์œ„์˜ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์€ security=S1 ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ธฐ์กด ํŒŒ๋“œ์˜ ์กด์™€ ๋™์ผํ•œ ์กด์— ์žˆ๋Š” ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•˜๋„๋ก ์Šค์ผ€์ค„๋Ÿฌ์— ์ง€์‹œํ•œ๋‹ค. ๋” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, ๋งŒ์•ฝ security=S1 ํŒŒ๋“œ ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ธฐ์กด ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์žˆ๋Š” ๋…ธ๋“œ๊ฐ€ zone=V์— ํ•˜๋‚˜ ์ด์ƒ ์กด์žฌํ•œ๋‹ค๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํŒŒ๋“œ๋ฅผ topology.kubernetes.io/zone=V ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•ด์•ผ ํ•œ๋‹ค.

์œ„์˜ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์€ security=S2 ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํ•˜๋‚˜ ์ด์ƒ์˜ ๊ธฐ์กด ํŒŒ๋“œ์˜ ์กด์™€ ๋™์ผํ•œ ์กด์— ์žˆ๋Š” ๋…ธ๋“œ์—๋Š” ๊ฐ€๊ธ‰์  ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•˜์ง€ ์•Š๋„๋ก ์Šค์ผ€์ค„๋Ÿฌ์— ์ง€์‹œํ•œ๋‹ค. ๋” ์ •ํ™•ํžˆ ๋งํ•˜๋ฉด, ๋งŒ์•ฝ security=S2 ํŒŒ๋“œ ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” zone=R์— ๋‹ค๋ฅธ ๋…ธ๋“œ๋„ ์กด์žฌํ•œ๋‹ค๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ๋Š” topology.kubernetes.io/zone=R ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ๋…ธ๋“œ์—๋Š” ๊ฐ€๊ธ‰์  ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ค„๋งํ•˜์ง€ ์•Š์•ผ์•„ ํ•œ๋‹ค.

ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ์˜ ์˜ˆ์‹œ์— ๋Œ€ํ•ด ์ต์ˆ™ํ•ด์ง€๊ณ  ์‹ถ๋‹ค๋ฉด, ๋””์ž์ธ ์ œ์•ˆ์„ ์ฐธ์กฐํ•œ๋‹ค.

ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ์™€ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ์˜ operator ํ•„๋“œ์— In, NotIn, Exists ๋ฐ DoesNotExist ๊ฐ’์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

์›์น™์ ์œผ๋กœ, topologyKey ์—๋Š” ์„ฑ๋Šฅ๊ณผ ๋ณด์•ˆ์ƒ์˜ ์ด์œ ๋กœ ๋‹ค์Œ์˜ ์˜ˆ์™ธ๋ฅผ ์ œ์™ธํ•˜๋ฉด ์–ด๋А ๋ ˆ์ด๋ธ” ํ‚ค๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๋ฐ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ์— ๋Œ€ํ•ด, ๋นˆ topologyKey ํ•„๋“œ๋Š” requiredDuringSchedulingIgnoredDuringExecution ๋ฐ preferredDuringSchedulingIgnoredDuringExecution ๋‚ด์— ํ—ˆ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค.
  • requiredDuringSchedulingIgnoredDuringExecution ํŒŒ๋“œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์— ๋Œ€ํ•ด, LimitPodHardAntiAffinityTopology ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋Š” topologyKey๋ฅผ kubernetes.io/hostname์œผ๋กœ ์ œํ•œํ•œ๋‹ค. ์ปค์Šคํ…€ ํ† ํด๋กœ์ง€๋ฅผ ํ—ˆ์šฉํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ๋น„ํ™œ์„ฑํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค.

labelSelector์™€ topologyKey์— ๋”ํ•˜์—ฌ ์„ ํƒ์ ์œผ๋กœ, labelSelector๊ฐ€ ๋น„๊ตํ•ด์•ผ ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค์˜ ๋ชฉ๋ก์„ labelSelector ๋ฐ topologyKey ํ•„๋“œ์™€ ๋™์ผํ•œ ๊ณ„์œ„์˜ namespaces ํ•„๋“œ์— ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ƒ๋žตํ•˜๊ฑฐ๋‚˜ ๋น„์›Œ ๋‘๋ฉด, ํ•ด๋‹น ์–ดํ”ผ๋‹ˆํ‹ฐ/์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ์ •์˜๊ฐ€ ์žˆ๋Š” ํŒŒ๋“œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์…€๋ ‰ํ„ฐ

๊ธฐ๋Šฅ ์ƒํƒœ: Kubernetes v1.24 [stable]

๋„ค์ž„์ŠคํŽ˜์ด์Šค ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ๋ ˆ์ด๋ธ” ์ฟผ๋ฆฌ์ธ namespaceSelector ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ผ์น˜ํ•˜๋Š” ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋ฅผ ์„ ํƒํ•  ์ˆ˜๋„ ์žˆ๋‹ค. namespaceSelector ๋˜๋Š” namespaces ํ•„๋“œ์— ์˜ํ•ด ์„ ํƒ๋œ ๋„ค์ž„์ŠคํŽ˜์ด์Šค ๋ชจ๋‘์— ์ ์šฉ๋œ๋‹ค. ๋นˆ namespaceSelector ({})๋Š” ๋ชจ๋“  ๋„ค์ž„์ŠคํŽ˜์ด์Šค์™€ ์ผ์น˜ํ•˜๋Š” ๋ฐ˜๋ฉด, null ๋˜๋Š” ๋นˆ namespaces ๋ชฉ๋ก๊ณผ null namespaceSelector ๋Š” ๊ทœ์น™์ด ์ ์šฉ๋œ ํŒŒ๋“œ์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค์— ๋งค์น˜๋œ๋‹ค.

๋” ์‹ค์ œ์ ์ธ ์œ ์Šค์ผ€์ด์Šค

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

์„ธ ๊ฐœ์˜ ๋…ธ๋“œ๋กœ ๊ตฌ์„ฑ๋œ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ์ƒ์ƒํ•ด ๋ณด์ž. ์ด ํด๋Ÿฌ์Šคํ„ฐ์—์„œ redis์™€ ๊ฐ™์€ ์ธ-๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ๋ฅผ ์ด์šฉํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•œ๋‹ค. ๋˜ํ•œ ์ด ์˜ˆ์—์„œ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋ฉ”๋ชจ๋ฆฌ ์บ์‹œ ์‚ฌ์ด์˜ ๋Œ€๊ธฐ ์‹œ๊ฐ„์€ ๋  ์ˆ˜ ์žˆ๋Š” ๋Œ€๋กœ ์งง์•„์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์ž. ์ด ๋•Œ ์›น ์„œ๋ฒ„๋ฅผ ๊ฐ€๋Šฅํ•œ ํ•œ ์บ์‹œ์™€ ๊ฐ™์€ ์œ„์น˜์—์„œ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ๋“œ๊ฐ„ ์–ดํ”ผ๋‹ˆํ‹ฐ/์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ์˜ redis ์บ์‹œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ์˜ˆ์‹œ์—์„œ, ๋ ˆํ”Œ๋ฆฌ์นด๋Š” app=store ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š”๋‹ค. podAntiAffinity ๊ทœ์น™์€ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ํ•˜์—ฌ๊ธˆ app=store ๋ ˆ์ด๋ธ”์„ ๊ฐ€์ง„ ๋ณต์ˆ˜ ๊ฐœ์˜ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ ๋‹จ์ผ ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•˜์ง€ ์•Š๊ฒŒ ํ•œ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜์—ฌ ์บ์‹œ ํŒŒ๋“œ๋ฅผ ๊ฐ ๋…ธ๋“œ์— ๋ถ„์‚ฐํ•˜์—ฌ ์ƒ์„ฑํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: redis-cache
spec:
  selector:
    matchLabels:
      app: store
  replicas: 3
  template:
    metadata:
      labels:
        app: store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: redis-server
        image: redis:3.2-alpine

์›น ์„œ๋ฒ„๋ฅผ ์œ„ํ•œ ๋‹ค์Œ์˜ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” app=web-store ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ ์ƒ์„ฑํ•œ๋‹ค. ํŒŒ๋“œ ์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์€ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ํ•˜์—ฌ๊ธˆ app=store ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ํŒŒ๋“œ๋ฅผ ์‹คํ–‰ ์ค‘์ธ ๋…ธ๋“œ์— ๊ฐ ๋ ˆํ”Œ๋ฆฌ์นด๋ฅผ ๋ฐฐ์น˜ํ•˜๋„๋ก ํ•œ๋‹ค. ํŒŒ๋“œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™์€ ์Šค์ผ€์ค„๋Ÿฌ๋กœ ํ•˜์—ฌ๊ธˆ app=web-store ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” ์„œ๋ฒ„ ํŒŒ๋“œ๋ฅผ ํ•œ ๋…ธ๋“œ์— ์—ฌ๋Ÿฌ ๊ฐœ ๋ฐฐ์น˜ํ•˜์ง€ ๋ชปํ•˜๋„๋ก ํ•œ๋‹ค.

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-server
spec:
  selector:
    matchLabels:
      app: web-store
  replicas: 3
  template:
    metadata:
      labels:
        app: web-store
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - web-store
            topologyKey: "kubernetes.io/hostname"
        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - store
            topologyKey: "kubernetes.io/hostname"
      containers:
      - name: web-app
        image: nginx:1.16-alpine

์œ„์˜ ๋‘ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ํด๋Ÿฌ์Šคํ„ฐ ํ˜•์ƒ์ด ๋‚˜ํƒ€๋‚˜๋Š”๋ฐ, ์„ธ ๋…ธ๋“œ์— ๊ฐ ์›น ์„œ๋ฒ„๊ฐ€ ์บ์‹œ์™€ ํ•จ๊ป˜ ์žˆ๋Š” ํ˜•์ƒ์ด๋‹ค.

node-1node-2node-3
webserver-1webserver-2webserver-3
cache-1cache-2cache-3

์ „์ฒด์ ์ธ ํšจ๊ณผ๋Š” ๊ฐ ์บ์‹œ ์ธ์Šคํ„ด์Šค๋ฅผ ๋™์ผํ•œ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ธ ๋‹จ์ผ ํด๋ผ์ด์–ธํŠธ๊ฐ€ ์•ก์„ธ์Šคํ•˜๊ฒŒ ๋  ๊ฒƒ ๊ฐ™๋‹ค๋Š” ๊ฒƒ์ด๋‹ค. ์ด ์ ‘๊ทผ ๋ฐฉ์‹์€ ์ฐจ์ด(๋ถˆ๊ท ํ˜• ๋กœ๋“œ)์™€ ๋Œ€๊ธฐ โ€‹โ€‹์‹œ๊ฐ„์„ ๋ชจ๋‘ ์ตœ์†Œํ™”ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•œ๋‹ค.

ํŒŒ๋“œ๊ฐ„ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š” ๋‹ค๋ฅธ ์ด์œ ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ZooKeeper ํŠœํ† ๋ฆฌ์–ผ์—์„œ ์œ„ ์˜ˆ์‹œ์™€ ๋™์ผํ•œ ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•ด ๊ณ  ๊ฐ€์šฉ์„ฑ์„ ์œ„ํ•œ ์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ๋กœ ๊ตฌ์„ฑ๋œ ์Šคํ…Œ์ดํŠธํ’€์…‹์˜ ์˜ˆ์‹œ๋ฅผ ํ™•์ธํ•œ๋‹ค.

nodeName

nodeName์€ ์–ดํ”ผ๋‹ˆํ‹ฐ ๋˜๋Š” nodeSelector๋ณด๋‹ค ๋” ์ง์ ‘์ ์ธ ํ˜•ํƒœ์˜ ๋…ธ๋“œ ์„ ํƒ ๋ฐฉ๋ฒ•์ด๋‹ค. nodeName์€ ํŒŒ๋“œ ์ŠคํŽ™์˜ ํ•„๋“œ ์ค‘ ํ•˜๋‚˜์ด๋‹ค. nodeName ํ•„๋“œ๊ฐ€ ๋น„์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด, ์Šค์ผ€์ค„๋Ÿฌ๋Š” ํŒŒ๋“œ๋ฅผ ๋ฌด์‹œํ•˜๊ณ , ๋ช…๋ช…๋œ ๋…ธ๋“œ์˜ kubelet์ด ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์ž๊ธฐ ๋…ธ๋“œ์— ๋ฐฐ์น˜ํ•˜๋ ค๊ณ  ์‹œ๋„ํ•œ๋‹ค. nodeName์€ nodeSelector ๋˜๋Š” ์–ดํ”ผ๋‹ˆํ‹ฐ/์•ˆํ‹ฐ-์–ดํ”ผ๋‹ˆํ‹ฐ ๊ทœ์น™๋ณด๋‹ค ์šฐ์„ ์ ์œผ๋กœ ์ ์šฉ(overrule)๋œ๋‹ค.

nodeName ์„ ์‚ฌ์šฉํ•ด์„œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•  ๋•Œ์˜ ๋ช‡ ๊ฐ€์ง€ ์ œํ•œ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.

  • ๋งŒ์•ฝ ๋ช…๋ช…๋œ ๋…ธ๋“œ๊ฐ€ ์—†์œผ๋ฉด, ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋˜์ง€ ์•Š๊ณ  ๋”ฐ๋ผ์„œ ์ž๋™์œผ๋กœ ์‚ญ์ œ๋  ์ˆ˜ ์žˆ๋‹ค.
  • ๋งŒ์•ฝ ๋ช…๋ช…๋œ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์ˆ˜์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฆฌ์†Œ์Šค๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ํŒŒ๋“œ๊ฐ€ ์‹คํŒจํ•˜๊ณ , ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํ‘œ์‹œ๋œ๋‹ค. ์˜ˆ: OutOfmemory ๋˜๋Š” OutOfcpu.
  • ํด๋ผ์šฐ๋“œ ํ™˜๊ฒฝ์˜ ๋…ธ๋“œ ์ด๋ฆ„์€ ํ•ญ์ƒ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•˜๊ฑฐ๋‚˜ ์•ˆ์ •์ ์ธ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.

๋‹ค์Œ์€ nodeName ํ•„๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒŒ๋“œ ์ŠคํŽ™ ์˜ˆ์‹œ์ด๋‹ค.

apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: nginx
  nodeName: kube-01

์œ„ ํŒŒ๋“œ๋Š” kube-01 ๋…ธ๋“œ์—์„œ๋งŒ ์‹คํ–‰๋  ๊ฒƒ์ด๋‹ค.

ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด

_ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด_์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์—ญ(regions), ์˜์—ญ(zones), ๋…ธ๋“œ ๋˜๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ •์˜ํ•œ ๋‹ค๋ฅธ ํ† ํด๋กœ์ง€ ๋„๋ฉ”์ธ๊ณผ ๊ฐ™์€ ์žฅ์•  ๋„๋ฉ”์ธ ์‚ฌ์ด์—์„œ ํŒŒ๋“œ๊ฐ€ ํด๋Ÿฌ์Šคํ„ฐ ์ „์ฒด์— ๋ถ„์‚ฐ๋˜๋Š” ๋ฐฉ์‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค. ์„ฑ๋Šฅ, ์˜ˆ์ƒ ๊ฐ€์šฉ์„ฑ ๋˜๋Š” ์ „์ฒด ํ™œ์šฉ๋„๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค.

ํŒŒ๋“œ ํ† ํด๋กœ์ง€ ๋ถ„๋ฐฐ ์ œ์•ฝ ์กฐ๊ฑด์—์„œ ์ž‘๋™ ๋ฐฉ์‹์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์•Œ์•„๋ณผ ์ˆ˜ ์žˆ๋‹ค.

๋‹ค์Œ ๋‚ด์šฉ

์ตœ์ข… ์ˆ˜์ • April 25, 2025 at 12:37 AM PST: [ko] Update API version (e8170b0949)