[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๊ฐ์ง๊ฐ ์ง์๋๋ค.
- NoSchedule - "NoSchedule"๋ฅผ ํ์ฉํ์ง ์๋ Pod๋ฅผ ๊ฑฐ๋ถํจ. ๊ธฐ์กด ์คํ์ ๋ณด์กดํจ.
- PreferNoSchedule - "PreferNoSchedule"๋ฅผ ํ์ฉํ์ง ์๋ Pod๋ฅผ "์ ํธํ์ง ์์" (๊ฐ๋ฅ์ ํจ)
- 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 ๋ชฉ๋ก์๋ ๋๋ต ์๋์ ๊ฐ์ ๊ฒ๋ค์ด ์๋ค.
- node.kubernetes.io/not-ready: ๋ ธ๋๊ฐ ์์ง ์ค๋น๋์ง ์์
- node.kubernetes.io/unreachable: ๋ ธ๋ ์ปจํธ๋กค๋ฌ์์ ๋ ธ๋์ ๋๋ฌํ ์ ์์. ์ด๋ NodeCondition์ด Ready" Unknown"์ธ ๊ฒ๊ณผ ์ผ์นํจ.
- node.kubernetes.io/memory-pressure: ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ
4, node.kubernetes.io/disk-pressure: ๋์คํฌ ์๋ ฅ - node.kubernetes.io/pid-pressure: PID ์๋ ฅ
- node.kubernetes.io/network-unavailable: ๋ ธ๋์ ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์์
- node.kubernetes.io/unschedulable: ๋ ธ๋์ ์ค์ผ์ค๋ง ํ ์ ์์
- 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