[k8s] Taint์™€ Toleration

์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ๋ฉ€ํ‹ฐ ๋…ธ๋“œ ๋ถ„์‚ฐ ํ™˜๊ฒฝ์—์„œ์˜ ์ปจํ…Œ์ด๋„ˆ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ ์‹œ์Šคํ…œ์ด๋‹ค.
๋ฉ€ํ‹ฐ๋…ธ๋“œ์— ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์•Œ๋œฐํ•˜๊ฒŒ ์ฑ„์šฐ๋Š”๊ฑด ์ข‹์€๋ฐ, ๊ทธ๋ ‡๋‹ค๊ณ  ํ•ด์„œ ํ•ญ์ƒ ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ๋žœ๋ค ๋…ธ๋“œ์— ํ• ๋‹น๋˜์–ด์„œ๋Š” ๋ชฉํ‘œ๋ฅผ ์ด๋ฃฐ ์ˆ˜ ์—†์„ ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์„ ๊ฒƒ์ด๋‹ค.

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

์ด๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋…ธ๋“œ-Pod ํ• ๋‹น ๊ฑฐ๋ถ€ ๋งค์ปค๋‹ˆ์ฆ˜์ด Taint์™€ Tolerations๋‹ค.

ํ—ˆ์šฉ ๊ธฐ๋ฐ˜์˜ ๋งค์ปค๋‹ˆ์ฆ˜์„ ์•Œ๊ณ  ์‹ถ๋‹ค๋ฉด ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ์กฐํ•œ๋‹ค.
https://blog.naver.com/sssang97/223647137454




Taint

Taint๋Š” node ๋‹จ์œ„์— ๊ธฐ๋ก๋˜๊ณ  ๊ด€๋ฆฌ๋˜๋Š” ์ผ์ข…์˜ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋‹ค.

taint๋Š” "์˜ค์—ผ๋จ"์„ ๋œปํ•˜๋Š” ๋ถ€์ •์ ์ธ ๋‹จ์–ด์ธ๋ฐ, ๋ง ๊ทธ๋Œ€๋กœ ๋…ธ๋“œ์— ์ด์ƒ์ด ์ƒ๊ฒผ๊ฑฐ๋‚˜, ๊ธฐํƒ€ ์ด์œ ๋กœ pod๋ฅผ ๋„์›Œ์„œ๋Š” ์•ˆ๋œ๋‹ค๋Š” ๊ฒƒ์„ ํ‘œํ˜„ํ•œ๋‹ค. ์‰ฝ๊ฒŒ ๋งํ•ด ๋…ธ๋“œ๊ฐ€ ์ƒˆ๋กœ์šด Pod๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” ๊ฐœ๋…์ด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, kubeadm ๋“ฑ์œผ๋กœ ํด๋Ÿฌ์Šคํ„ฐ๋ฅผ ๊ตฌ์„ฑํ–ˆ๋‹ค๋ฉด ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ ๋…ธ๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ NoSchedule taint๊ฐ€ ๊ตฌ์„ฑ๋˜์–ด์žˆ์„ ๊ฒƒ์ด๋‹ค.

์ด๊ฒƒ์€ ํ•ด๋‹น ๋…ธ๋“œ์— Pod๋ฅผ ๋„์šฐ์ง€ ์•Š๊ธฐ๋ฅผ ์›ํ•˜๋Š” taint๋‹ค.
๊ธฐ๋ณธ ์„ค์ •์ด ์ด๋Ÿฐ ์ด์œ ๋Š”, control plain์€ ๊ด€๋ฆฌ๋งŒ์„ ์ „๋‹ดํ•˜๊ณ  ์‹ค์ œ pod๋ฅผ ๋„์šฐ๋Š”๊ฑด worker๋“ค๋กœ ํ•œ์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ด€๋ฆฌ์ƒ ๊ถŒ์žฅํ•˜๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.




Taint์˜ ๋“ฑ๋ก๊ณผ ์ œ๊ฑฐ

๋งŒ์•ฝ ๋ฉ€์ฉกํ•œ ๋…ธ๋“œ์— NoSchedule Taint๋ฅผ ๊ฑธ์–ด์„œ pod ์ƒ์„ฑ์„ ๋ง‰๊ณ  ์‹ถ๋‹ค๋ฉด, ์ด๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค.

kubectl taint nodes ๋…ธ๋“œ์ด๋ฆ„ taint๊ฐ’

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ๋ถ€ํ„ฐ๋Š” Pod ์ƒ์„ฑ์ด ๋ง‰ํžˆ๋Š” ๊ฒƒ์ด๋‹ค.


๋งŒ์•ฝ ์ „๋ถ€ taint๋‚˜ ๊ธฐํƒ€ ์กฐ๊ฑด์— ๊ฑธ๋ ค์„œ pod๊ฐ€ ๋“ค์–ด๊ฐˆ ๊ณณ์ด ์—†์œผ๋ฉด, ์Šค์ผ€์ค„๋˜์ง€ ์•Š์•„์„œ ๊ฑฐ์˜ ๋ฌดํ•œ pending ์ƒํƒœ๊ฐ€ ๋œ๋‹ค.


๋ฐ˜๋Œ€๋กœ, Taint๋ฅผ ์ œ๊ฑฐํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋’ค์— - ๋ถ€ํ˜ธ๋งŒ ๋ถ™์ด๋ฉด ๋œ๋‹ค.

kubectl taint nodes ๋…ธ๋“œ์ด๋ฆ„ taint๊ฐ’-

๊ทธ๋Ÿฌ๋ฉด ์‚ญ์ œ๊ฐ€ ๋˜๊ณ 

์ƒ์„ฑ๋„ ๋  ๊ฒƒ์ด๋‹ค.




Taint์˜ ๊ตฌ์„ฑ๊ณผ ์†์„ฑ

๋ฐฉ๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ œ์—์„œ ์‚ฌ์šฉํ•œ Taint๋Š” node-role.kubernetes.io/control-plane:NoSchedule์ด์—ˆ๋‹ค.

์ด๊ฑด ์‚ฌ์‹ค node-role.kubernetes.io/control-plane์™€ NoSchedule 2๊ฐ€์ง€๋กœ ๋ถ„๋ฆฌ๋œ๋‹ค.
node-role.kubernetes.io/control-plane๊ฐ€ Key๊ณ , NoSchedule๊ฐ€ Effect๋ผ๊ณ  ํ•œ๋‹ค.

์‚ฌ์‹ค ์ „์ฒด ํ˜•ํƒœ๋Š” "Key=Value:Effect"์ธ๋ฐ, Value๊ฐ€ ์ƒ๋žต ๊ฐ€๋Šฅํ•œ ๊ฒƒ์ด๋‹ค.
์•„๋ž˜๋Š” value๊นŒ์ง€ ํฌํ•จํ•ด์„œ taint๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ๋‹ค.

Key์™€ Value๋Š” ์ผ์ข…์˜ ๋„ค์ž„์ŠคํŽ˜์ด์Šค๋‚˜ ํƒœ๊ทธ์— ๋ถˆ๊ณผํ•ด์„œ ์–ด๋–ค ๊ฐ’์ด๋“  ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค. ์ด๊ฑธ ๊ธฐ๋ฐ˜์œผ๋กœ Pod๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ํ—ˆ์šฉํ•ด์ค„์ง€ ๋ง์ง€๋ฅผ ์„ ํƒํ•˜๋Š”๋ฐ, ๋ฐ”๋กœ ์•„๋ž˜์—์„œ ์„ค๋ช…ํ•  Toleration๊ณผ ์—ฐ๊ด€์ด ๊นŠ๋‹ค.

Effect๋Š” ํฌ๊ฒŒ 3๊ฐ€์ง€๊ฐ€ ์ง€์›๋œ๋‹ค.

  1. NoSchedule - "NoSchedule"๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” Pod๋ฅผ ๊ฑฐ๋ถ€ํ•จ. ๊ธฐ์กด ์‹คํ–‰์€ ๋ณด์กดํ•จ.
  2. PreferNoSchedule - "PreferNoSchedule"๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” Pod๋ฅผ "์„ ํ˜ธํ•˜์ง€ ์•Š์Œ" (๊ฐ€๋Šฅ์€ ํ•จ)
  3. NoExecute - "NoExecute"๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” Pod๋ฅผ ๊ฑฐ๋ถ€ํ•˜๊ณ , ๊ธฐ์กด์˜ ์‹คํ–‰๋„ ๊ฐ•์ œ๋กœ ์ข…๋ฃŒํ•จ



Toleration

Taint๊ฐ€ Pod๋ฅผ ๊ฑฐ๋ถ€ํ•˜๋Š” Node์˜ ์†์„ฑ์ด๋ผ๋ฉด, Toleration๋Š” ๋‹ค์‹œ ๊ทธ ๊ฑฐ๋ถ€ ๋ชฉ๋ก์— ๋Œ€ํ•ด์„œ ์˜ˆ์™ธ์ ์ธ ํ—ˆ์šฉ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ธฐ๋Šฅ์ด๋‹ค.

๋‹จ์–ด์˜ ๋œป๊ณผ ๋™์ผํ•˜๋‹ค.

๋‹ค์‹œ ๊ธฐ๋ณธ taint๋ฅผ ๊ฑด ๋‹ค์Œ์— toleration์„ ์ ์šฉํ•ด์„œ ์•ˆ๋˜๋˜๊ฑธ ๋˜๊ฒŒ ํ•ด๋ณด๊ฒ ๋‹ค.

๋‹ค์‹œ ์ œ๋Œ€๋กœ ๋จนํ˜”๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋„์šฐ๊ณ ์ž ํ•˜๋Š” pod spec์—, ๋‹ค์Œ๊ณผ ๊ฐ™์ด tolerations์„ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.

  tolerations:
  - key: "node-role.kubernetes.io/control-plane"
    operator: "Equal"
    effect: "NoSchedule"

์ด๊ฑด key๊ฐ€ "node-role.kubernetes.io/control-plane"๊ณ  effect๊ฐ€ "NoSchedule"์ธ taint๋Š” ๋ฌด์‹œํ•˜๊ณ  ๋“ค์–ด๊ฐ€๊ฒ ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
์—ฌ๊ธฐ์„œ value๋Š” ์ƒ๋žต๋˜์—ˆ์ง€๋งŒ ํ•„์š”ํ•˜๋‹ค๋ฉด ๋„ฃ์„ ์ˆ˜ ์žˆ๋‹ค.
operator๋Š” Equal/Exists 2๊ฐ€์ง€๊ฐ€ ์ง€์›๋˜๋ฉฐ, ์ƒ๋žต์‹œ ๊ธฐ๋ณธ๊ฐ’์€ Equal์ด๋‹ค. Equal์€ key:value์™„์ „ ์ผ์น˜์—๋งŒ ๋งค์นญ๋˜๋ฉฐ, Exists๋Š” key๋งŒ ์ผ์น˜ํ•ด๋„ ๋งค์นญ๋œ๋‹ค.


์•„๋ฌดํŠผ ์ ๋‹นํžˆ ์ง€์ •ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด


taint๊ฐ€ ๊ฑธ๋ ค์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์ž˜ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.




Taint&Toleration๋ฅผ ์ด์šฉํ•œ ๋ฆฌ์†Œ์Šค ๊ด€๋ฆฌ

Taint๋Š” ๋‹จ์ˆœํžˆ ์ปจํŠธ๋กค ํ”Œ๋ ˆ์ธ์— Pod ํ• ๋‹น ๋ง‰๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉ๋˜๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ, ๋ฆฌ์†Œ์Šค ๋ถ€์กฑ์œผ๋กœ ์ธํ•œ ๋ฌธ์ œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ๊ฒƒ์—๋„ ์‚ฌ์šฉ๋œ๋‹ค.

์˜ˆ๋ฅผ ๋“ค๋ฉด, ๋…ธ๋“œ์— ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ถ€์กฑํ•ด์ง€๋ฉด k8s์˜ node controller๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— node.kubernetes.io/memory-pressure:NoSchedule ๋ผ๋Š” taint๋ฅผ ๊ฑด๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋ฆฌ์†Œ์Šค๊ฐ€ ๋ถ€์กฑํ•œ ๋…ธ๋“œ์— Pod๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๋„๋ก ํ•œ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๊ฐ€ ํ•ด์†Œ๋˜๋ฉด node.kubernetes.io/memory-pressure:NoSchedule๋ฅผ ํ’€์–ด์„œ ๋‹ค์‹œ Pod ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•ด์ง€๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ ์ˆ˜์ค€ taint ๋ชฉ๋ก์—๋Š” ๋Œ€๋žต ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒƒ๋“ค์ด ์žˆ๋‹ค.

  1. node.kubernetes.io/not-ready: ๋…ธ๋“œ๊ฐ€ ์•„์ง ์ค€๋น„๋˜์ง€ ์•Š์Œ
  2. node.kubernetes.io/unreachable: ๋…ธ๋“œ ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ๋…ธ๋“œ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†์Œ. ์ด๋Š” NodeCondition์ด Ready" Unknown"์ธ ๊ฒƒ๊ณผ ์ผ์น˜ํ•จ.
  3. node.kubernetes.io/memory-pressure: ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ
    4, node.kubernetes.io/disk-pressure: ๋””์Šคํฌ ์••๋ ฅ
  4. node.kubernetes.io/pid-pressure: PID ์••๋ ฅ
  5. node.kubernetes.io/network-unavailable: ๋…ธ๋“œ์˜ ๋„คํŠธ์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ
  6. node.kubernetes.io/unschedulable: ๋…ธ๋“œ์— ์Šค์ผ€์ค„๋ง ํ•  ์ˆ˜ ์—†์Œ
  7. node.cloudprovider.kubernetes.io/uninitialized: ํด๋ผ์šฐ๋“œ ๋‚ด๋ถ€ ๊ด€๋ฆฌ์šฉ. ๊ฑฐ์˜ ๋ชฐ๋ผ๋„๋จ.


์ฐธ์กฐ
https://kubernetes.io/ko/docs/concepts/scheduling-eviction/taint-and-toleration/
https://stackoverflow.com/questions/50966318/difference-between-noexecute-noschedule-prefernoschedule