Container/Kubernetes

[Kubernetes] ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ํŒŒ๋“œ ์Šค์ผ€์ฅด๋ง

YounghunJo 2024. 11. 9. 13:46
๋ฐ˜์‘ํ˜•

๐Ÿ”Š ํ•ด๋‹น ํฌ์ŠคํŒ…์€ ์‹œ์ž‘ํ•˜์„ธ์š”! ๋„์ปค/์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์„œ์ ์„ ์ฝ๊ณ  ๊ฐœ์ธ์ ์ธ ๋ชฉ์  ํ•˜์— ์ž‘์„ฑ๋˜๋Š” ๊ธ€์ž…๋‹ˆ๋‹ค. ํฌ์ŠคํŒ…์— ์‚ฌ์šฉ๋˜๋Š” ๋ชจ๋“  ์ž๋ฃŒ๋Š” ์ œ๊ฐ€ ์ง์ ‘ ์žฌ๊ตฌ์„ฑํ•˜์˜€์Œ์„ ์•Œ๋ฆฝ๋‹ˆ๋‹ค.
 

Kubernetes


์ €๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ํŒŒ๋“œ๋‚˜ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค ์ž์ฒด๋ฅผ ์–ผ๋งˆ๋‚˜ ์•Œ์ฐจ๊ฒŒ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด์„œ ๋ฐฐ์› ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ํŒŒ๋“œ๋‚˜ ์ปจํ…Œ์ด๋„ˆ์™€ ๊ฐ™์€ ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ทธ ์ธ์Šคํ„ด์Šค๋ฅผ ์–ด๋–ค ์„œ๋ฒ„ ์ฆ‰, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์–ด๋–ค ๋…ธ๋“œ์— ์ƒ์„ฑํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ์Šค์ผ€์ฅด๋ง์— ๋Œ€ํ•ด์„œ ๋ฐฐ์›Œ๋ณด๋ ค๊ณ  ํ•œ๋‹ค.
 
๊ฐ„๋‹จํ•œ ์˜ˆ์‹œ๋กœ, ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์— ๋ฐฐํฌํ•˜๋ ค๊ณ  ํ•˜๋Š”๋ฐ, ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๊ธฐ๋ฐ˜์ด ๋˜๋Š” (๋„์ปค)์ด๋ฏธ์ง€๊ฐ€ amd64 OS ํ”Œ๋žซํผ๋งŒ ์ง€์›์ด ๋œ๋‹ค๋ฉด ํ•ด๋‹น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ amd64 OS ํ”Œ๋žซํผ์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ์ƒ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค. ๋˜ํ•œ ๊ณ ๊ฐ€์šฉ์„ฑ(HA, High Availability) ์ฆ‰, ์„œ๋น„์Šค ๋ฌด์ค‘๋‹จ์„ ์œ„ํ•ด ์–ด๋–ค ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํŒŒ๋“œ๋‚˜ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ชจ๋“  ๋…ธ๋“œ์— ๊ณ ๋ฅด๊ฒŒ ๋ถ„ํฌ์‹œ์ผœ์•ผํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํŠน์ • ๋ชฉ์ ์— ๋”ฐ๋ผ ์–ด๋–ค ์„ฑ๊ฒฉ์˜ ํŒŒ๋“œ ๋˜๋Š” ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ํŠน์ • ์›Œ์ปค ๋…ธ๋“œ์— ์ƒ์„ฑ๋˜๋„๋ก ํ•˜๋Š” ๊ฒƒ์„ ๋ฐ”๋กœ ์Šค์ผ€์ฅด๋ง์ด๋ผ๊ณ  ํ•œ๋‹ค.
 
์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ๋‹ค์–‘ํ•œ ์Šค์ผ€์ฅด๋ง ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, ์‹ฌ์ง€์–ด ๋” ๋ณต์žกํ•œ ์Šค์ผ€์ฅด๋ง ๋ฐฉ๋ฒ•์„ ์ปค์Šคํ…€ํ•˜๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜๋„ ์žˆ๋‹ค. ์ด๋ฒˆ ํฌ์ŠคํŒ…์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ์Šค์ผ€์ฅด๋ง ๊ณผ์ •์— ๋Œ€ํ•ด ๊ฐ„๋žตํžˆ ์•Œ์•„๋ณด๊ณ , ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์Šค์ผ€์ฅด๋ง ์ „๋žต์ด ๋ฌด์—‡์ด ์žˆ๋Š”์ง€์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

1. ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ฅด๋งํ•˜๋Š” ์ฃผ์ฒด: kube-scheduler

์ €๋ฒˆ ํฌ์ŠคํŒ…์˜ ๋งˆ์ง€๋ง‰ ๋ชฉ์ฐจ์—์„œ ResourceQuota ์™€ LimitRange ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๋ฉด์„œ ํ•ด๋‹น ์˜ค๋ธŒ์ ํŠธ๋“ค์ด ์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ์˜ ์ข…๋ฅ˜๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๋ฐฐ์› ์—ˆ๋‹ค. ๊ทธ ๋•Œ ์†Œ๊ฐœํ•œ ๊ทธ๋ฆผ์„ ๋‹ค์‹œ ๋ณด์ž. ๋งŒ์•ฝ ๊ฐœ๋ฐœ์ž๊ฐ€ kubectl ์ด๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ๋กœ ์š”์ฒญ์„ ๋ณด๋‚ด๋ฉด ํฌ๊ฒŒ ์•„๋ž˜์˜ ์ˆœ์„œ๋กœ ์ง„ํ–‰๋œ๋‹ค๊ณ  ํ–ˆ๋‹ค.
 

์–ด๋“œ๋ฏธ์…˜ ์ปจํŠธ๋กค๋Ÿฌ ์†Œ๊ฐœ ์‹œ ์‚ฌ์šฉํ•œ ์ž๋ฃŒ

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

์šฐ๋ฆฌ๊ฐ€ ์•Œ์•„๋ณผ ๊ฒƒ์€ kube-scheduler !

 
kube-scheduler๋ฅผ ์•Œ์•„๋ณด๊ธฐ์— ์•ž์„œ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์‚ฌ์šฉ์ž์˜ ๋ชจ๋“  ์š”์ฒญ ์ฆ‰, kubectl ๋ช…๋ น์–ด๋กœ ์ž…๋ ฅํ•ด์˜จ ์š”์ฒญ๋“ค, ์‹ฌ์ง€์–ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋‚ด๋ถ€ ์ปดํฌ๋„ŒํŠธ๋“ค ๊ฐ„์˜ ์š”์ฒญ๋“ค๋„ kube-apiserver ๋ผ๋Š” ์ปดํฌ๋„ŒํŠธ๋ฅผ ํ†ตํ•ด์„œ ์†Œํ†ต์„ ์ง„ํ–‰ํ•œ๋‹ค๋Š” ์ ์ด๋‹ค. ์•ž์œผ๋กœ ์„ค๋ช…ํ•  ๋•Œ, ์ด ์ ์„ ๊ผญ ์—ผ๋‘์— ๋‘๋„๋ก ํ•˜์ž.
 
๊ทธ๋ฆฌ๊ณ  kube-scheduler๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ํ•˜๊ฒŒ ํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ์Šค์ผ€์ฅด๋Ÿฌ์— ํ•ด๋‹นํ•˜๋ฉฐ, ์œ„ ๊ทธ๋ฆผ์—์„œ๋„ ๋“ฑ์žฅํ•˜๋Š” etcd๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ์ „๋ฐ˜์ ์ธ ์ƒํƒœ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ์ผ์ข…์˜ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์—ญํ• ์„ ๋‹ด๋‹นํ•˜๋Š” ์ปดํฌ๋„ŒํŠธ์ด๋‹ค. ์‹ค์ œ๋กœ ์ƒ์„ฑ๋˜์–ด ์žˆ๋Š” ํŒŒ๋“œ๋ฅผ ๋ณด๊ธฐ ์œ„ํ•ด kubectl get pods ๋ผ๋Š” ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด kube-api server๋ฅผ ํ†ตํ•ด์„œ etcd์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์™€ ๋ณด์—ฌ์ค€๋‹ค.
 
etcd์— ๋Œ€ํ•ด์„œ ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋ฉด, etcd๋Š” ์ฃผํ‚คํผ, Consul ๊ณผ ๊ฐ™์€ ๋ถ„์‚ฐ ์ฝ”๋””๋„ค์ดํ„ฐ ๋„๊ตฌ์˜ ์ผ์ข…์œผ๋กœ, ํด๋ผ์šฐ๋“œ ํ”Œ๋žซํผ ํ™˜๊ฒฝ์—์„œ ์—ฌ๋Ÿฌ ์ปดํฌ๋„ŒํŠธ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฐ์ดํ„ฐ๋ฅผ ์กฐ์ •ํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•œ๋‹ค. ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ์ƒ์„ฑ๋œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋‚˜ ํŒŒ๋“œ์˜ ๋ชฉ๋ก, ์ •๋ณด, ํด๋Ÿฌ์Šคํ„ฐ ์ž์ฒด์˜ ์ •๋ณด ๋“ฑ๊ณผ ๊ฐ™์€ ๋Œ€๋ถ€๋ถ„์˜ ๋ฐ์ดํ„ฐ๊ฐ€ etcd์— ์ €์žฅ์ด ๋œ๋‹ค. ๋ฌผ๋ก  ์ด kube-apiserver, kube-scheduler, etcd ๋ชจ๋‘ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๋™์ผํ•˜๊ฒŒ ํŒŒ๋“œ์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋œ๋‹ค. 
 
์ด์ œ kube-scheduler๊ฐ€ ๊ตฌ์ฒด์ ์œผ๋กœ ์–ด๋–ค ๊ณผ์ •์„ ํ†ตํ•ด ์ƒ์„ฑํ•  ํŒŒ๋“œ๋ฅผ ์–ด๋–ค ์›Œ์ปค ๋…ธ๋“œ๋กœ ์„ ์ •ํ•˜๋Š”์ง€ ์‚ดํŽด๋ณด๋„๋ก ํ•˜์ž. ์šฐ์„  ์•„๋ž˜ ๊ทธ๋ฆผ์„ ๋ณด์ž.
 

 
์œ„ ๊ทธ๋ฆผ์˜ ๋‹จ๊ณ„๋ฅผ ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.
 

  1. ๊ฐœ๋ฐœ์ž๋Š” ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด kubectl CLI๋ฅผ ์ด์šฉํ•ด ๋ช…๋ น์–ด๋ฅผ ์ž…๋ ฅํ•˜๊ณ , ์ด ๋ช…๋ น์–ด๋Š” ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์—์„œ ํŒŒ๋“œ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋˜๊ณ  ์žˆ๋Š” kube-api server๋กœ ์š”์ฒญ์ด ์ „์†ก๋œ๋‹ค.
  2. ์š”์ฒญ์— ๋‹ด๊ฒจ์žˆ๋Š” ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์š”์ฒญ์ด๋ผ๋Š” ๊ฒƒ์„ ์ธ์ง€ํ•œ ํ›„, ์ƒ์„ฑํ•  ํŒŒ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด ๋ฐ์ดํ„ฐ๋ฅผ etcd์— ์ €์žฅํ•œ๋‹ค. ๋‹จ, ์ด ๋•Œ๋Š” ํŒŒ๋“œ ์ •๋ณด์— nodeName ์ฆ‰, ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ์–ด๋–ค ๋…ธ๋“œ์—์„œ ์ƒ์„ฑ๋ ์ง€์— ๋Œ€ํ•œ ๊ฐ’์ด ๋ช…์‹œ๋˜์ง€ ์•Š์€ ์ฑ„ etcd์— ์ €์žฅ๋œ๋‹ค. 
  3. ์ƒ์‹œ์ ์œผ๋กœ kube-api server๊ฐ€ ๊ณ„์† Watch API๋ฅผ ์ด์šฉํ•ด ๋ชจ๋‹ˆํ„ฐ๋ง์„ ํ•˜๊ณ  ์žˆ๋‹ค๊ฐ€ etcd์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ ์ค‘ nodeName ๋ฐ์ดํ„ฐ๊ฐ€ ์—†๋Š” ํŒŒ๋“œ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ฐ์ง€
  4. kube-scheduler๋Š” 3๋ฒˆ์—์„œ kube-api server๊ฐ€ ๊ฐ์ง€ํ•œ ์ •๋ณด๋ฅผ ์ „๋‹ฌ๋ฐ›์Œ
  5. kube-scheduler๊ฐ€ ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์–ด๋–ค ๋…ธ๋“œ์— ์ƒ์„ฑํ• ์ง€ ๊ฒฐ์ •(์ด ๋•Œ, worker node 1์œผ๋กœ ์„ ์ •ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •)
  6. ์„ ์ •ํ•œ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑ(๋ฐ”์ธ๋”ฉ)ํ•  ๊ฒƒ์„ kube-api server์— ์š”์ฒญ
  7. ๊ฐ ์›Œ์ปค ๋…ธ๋“œ์— ๋ถ™์–ด์žˆ๋Š” kubelet ์—์ด์ „ํŠธ๋“ค์ด kube-api server์˜ Watch API๋ฅผ ์ด์šฉํ•ด์„œ ๊ณ„์† ๊ฐ์ง€ ์ค‘์ด๋‹ค๊ฐ€ nodeName์— ๋ช…์‹œ๋œ worker node 1 ๊ฐ’์„ ๋ณด๊ณ  worker node 1์— ๋ถ™์–ด์žˆ๋Š” kubelet์ด ์‹ค์งˆ์ ์œผ๋กœ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์‹œ์ž‘
  8. ํŒŒ๋“œ ์ƒ์„ฑ ์™„๋ฃŒ ํ›„ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํŒŒ๋“œ ์ •์ƒ ์ƒ์„ฑ๋˜์—ˆ๋‹ค๊ณ  ์‘๋‹ต

ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ณผ์ •์€ ํฌ๊ฒŒ ์œ„์™€ ๊ฐ™๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์ œ ์œ„ ๋‹จ๊ณ„์—์„œ 5๋ฒˆ ๋‹จ๊ณ„์ธ kube-scheduler๊ฐ€ ์ƒ์„ฑํ•  ํŒŒ๋“œ๋ฅผ ์–ด๋–ค ๋…ธ๋“œ์— ํ• ๋‹นํ• ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ณผ์ •๊ณผ ๊ธฐ์ค€์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณผ ๊ฒƒ์ด๋‹ค.

2. ์›Œ์ปค ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ์Šค์ผ€์ฅด๋ง ๊ณผ์ • 2๋‹จ๊ณ„: ๋…ธ๋“œ ํ•„ํ„ฐ๋ง๊ณผ ์Šค์ฝ”์–ด๋ง

kube-scheduler๊ฐ€ ์ ์ ˆํ•œ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๋Š” ๊ณผ์ •์€ ํฌ๊ฒŒ 2๊ฐ€์ง€ ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์นœ๋‹ค. ๋จผ์ € ๋…ธ๋“œ ํ•„ํ„ฐ๋ง์„ ๊ฑฐ์น˜๋Š”๋ฐ, ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ํŒ๋‹จํ•ด์„œ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ๋‹จ๊ณ„์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์„ค์ •๋œ ์ตœ์†Œ ์š”๊ฑด(์ €๋ฒˆ ์‹œ๊ฐ„์— ๋ฐฐ์šด requests)์˜ CPU, ๋ฉ”๋ชจ๋ฆฌ ๋งŒํผ์˜ ๊ฐ€์šฉ ์ž์›์ด ์—†๋Š” ๋…ธ๋“œ๋Š” ๋‹น์—ฐํžˆ ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋Š” ๋…ธ๋“œ๋กœ ์„ ์ •๋  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค. ๋˜, ์œ„ ๊ทธ๋ฆผ์—์„œ ๋ณด์•˜๋˜ kube-api server, etcd, kube-scheduler ์™€ ๊ฐ™์€ ํ•ต์‹ฌ์ ์ธ ์ปดํฌ๋„ŒํŠธ ์—ญํ• ์„ ํ•˜๋Š” ํŒŒ๋“œ๋“ค์ด ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์—†๋Š” ๋…ธ๋“œ์ด๋ฏ€๋กœ, ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ๋„ ์„ ์ •๋  ์ˆ˜ ์—†์„ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ์กฐ๊ฑด๋“ค์— ์˜ํ•ด ํ•„ํ„ฐ๋ง๋˜์–ด ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์„ ์ •๋œ ๋…ธ๋Š๋“ค์€ ๊ทธ ๋‹ค์Œ ๋‹จ๊ณ„์ธ ๋…ธ๋“œ ์Šค์ฝ”์–ด๋ง ๋‹จ๊ณ„๋กœ ๋„˜๊ฒจ์ง€๊ฒŒ ๋œ๋‹ค.
 
์ด์ œ ๋…ธ๋“œ ์Šค์ฝ”์–ด๋ง ๋‹จ๊ณ„์—์„œ๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ๊ตฌํ˜„ํ•œ Go ์–ธ์–ด ์†Œ์Šค์ฝ”๋“œ์— ๋ฏธ๋ฆฌ ์ •์˜๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์˜ ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ์„œ ๊ฐ ๋…ธ๋“œ์˜ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•˜๊ฒŒ ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด์„œ ํŒŒ๋“œ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ด์ „์— pull ํ–ˆ๋˜ ์ด๋ฏธ์ง€์™€ ๋™์ผํ•˜์—ฌ ์–ด๋–ค ๋…ธ๋“œ์˜ ํŒŒ์ผ ์‹œ์Šคํ…œ์— ํ•ด๋‹น ๋„์ปค ์ด๋ฏธ์ง€๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜์—ฌ ๋น ๋ฅด๊ฒŒ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜๋ฉด ์ ์ˆ˜๊ฐ€ ๋†’์•„์ง„๋‹ค(์ด ์ ์ˆ˜๋ฅผ Image Locality๋ผ๊ณ  ํ•จ). ๋˜ ๋‹ค๋ฅธ ์˜ˆ๋กœ ๋…ธ๋“œ์˜ ๊ฐ€์šฉ ์ž์›์ด ๋งŽ์œผ๋ฉด ๋งŽ์„์ˆ˜๋ก ๋‹น์—ฐํžˆ ๋…ธ๋“œ์˜ ์ ์ˆ˜๊ฐ€ ๋†’๊ฒŒ ํ‰๊ฐ€๋œ๋‹ค(์ด๋Ÿฌํ•œ ์ ์ˆ˜๋ฅผ Least Requested๋ผ๊ณ  ํ•จ) ์ด๋ ‡๊ฒŒ ๋‹ค์–‘ํ•œ ๋กœ์ง์˜ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๊ฑฐ์ณ ํ•ฉ์‚ฐ๋œ ์ ์ˆ˜ ์ค‘ ๊ฐ€์žฅ ์ ์ˆ˜๊ฐ€ ๋†’์€ ๋…ธ๋“œ ํ•˜๋‚˜๋ฅผ ์„ ์ •ํ•ด ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.
 
์ผ๋ฐ˜์ ์œผ๋กœ, ์œ„ 2๊ฐ€์ง€ ๋‹จ๊ณ„ ์ค‘ ์šฐ๋ฆฌ๊ฐ€ ์ง์ ‘์ ์œผ๋กœ ์ œ์–ดํ•˜๊ธฐ ์‰ฌ์šด ์˜์—ญ์€ ๋…ธ๋“œ ํ•„ํ„ฐ๋ง ๋‹จ๊ณ„์ด๋‹ค. ๋…ธ๋“œ ์Šค์ฝ”์–ด๋ง ๋‹จ๊ณ„๋ฅผ ๋ฌผ๋ก  ์ปค์Šคํ…€ํ•˜๊ฒŒ ์กฐ์ ˆํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ์€ ์•„๋‹ˆ์ง€๋งŒ, ์†Œ์Šค์ฝ”๋“œ ๋ ˆ๋ฒจ์—์„œ ์กฐ์ž‘์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ๋‹จ์ˆœํ•œ YAML ํŒŒ์ผ ํ˜•ํƒœ๋กœ ์กฐ์ž‘์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๊ฐ€ ์•ž์œผ๋กœ ์‚ดํŽด๋ณผ ๊ฒƒ๋“ค์€ ์œ„ 2๊ฐ€์ง€ ๋‹จ๊ณ„ ์ค‘ ๋…ธ๋“œ ํ•„ํ„ฐ๋ง๋ฅผ ์ •์˜ํ•˜๋Š” ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์กฐ๊ฑด ๋˜๋Š” ๊ธฐ์ค€์— ๋Œ€ํ•ด ๋ฐฐ์›Œ๋ณผ ๊ฒƒ์ด๊ณ , ์ด๋Ÿฐ ๊ฒƒ๋“ค์€ ๋ชจ๋‘ YAML ํ˜•์‹์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ํŒŒ์ผ์— ์ง์ ‘ ๋ช…์‹œ๋ฅผ ํ•˜์—ฌ ์ ์šฉํ•ด์ค€๋‹ค.

2-1. ๋…ธ๋“œ์˜ ์ด๋ฆ„์„ ์ง์ ‘ ๋ช…์‹œํ•˜๊ฑฐ๋‚˜ ๋…ธ๋“œ์— ๋ถ™ํ˜€์ง„ ๋ ˆ์ด๋ธ”์„ ์ด์šฉํ•˜์ž : nodeName, nodeSelector

๊ฐ€์žฅ ๋จผ์ € ์•Œ์•„๋ณผ ํ‚ค์›Œ๋“œ๋Š” nodeName๊ณผ nodeSelector์ด๋‹ค. nodeName์€ ๊ฐ€์žฅ ์ง๊ด€์ ์œผ๋กœ, ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ํ•ด๋‹น ํŒŒ๋“œ๊ฐ€ ํ• ๋‹น๋  ๋…ธ๋“œ ์ด๋ฆ„์„ ์ง์ ‘์ ์œผ๋กœ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๋‹ค. nodeName์„ ์ด์šฉํ•œ ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-node-name
spec:
  nodeName: ip-10-43-0-30.ap-northeast-2.compute.internal
  containers:
    - name: nginx
      image: nginx:latest

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

kubectl get nodes --show-labels

 
์œ„ ๋ช…๋ น์–ด ๊ฒฐ๊ณผ์˜ ์˜ˆ์‹œ ์ž๋ฃŒ๋ฅผ ๊ฐ€์ ธ์™€๋ดค๋‹ค.
 

 
์œ„ ์‚ฌ์ง„ ์† LABELS ํ•ญ๋ชฉ์„ ๋ณด๋ฉด ์ด ๋ ˆ์ด๋ธ”๋„ <key>=<value> ํ˜•ํƒœ๋กœ ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์œ„ ์‚ฌ์ง„ ์†์—์„œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์˜ ์•„ํ‚คํ…์ฒ˜๊ฐ€ amd64 ๋ผ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” beta.kubernetes.io/arch=amd64 ๋ผ๋Š” ๋ ˆ์ด๋ธ”์ด ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. key ๊ฐ’์—์„œ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ๋“ฏ์ด kubernetes.io ๋ผ๋Š” ํ‚ค์›Œ๋“œ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งŒ๋“  ๋ ˆ์ด๋ธ”์ž„์„ ์˜๋ฏธํ•œ๋‹ค.
 
๋งŒ์•ฝ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ๋…ธ๋“œ์˜ ๋ ˆ์ด๋ธ”์„ ๋งŒ๋“ค๊ณ  ์‹ถ๋‹ค๋ฉด ์•„๋ž˜ ํ˜•์‹์œผ๋กœ ๋ ˆ์ด๋ธ”์„ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค.
 

kubectl label nodes $NODE_NAME <key>=<value>

 
๋งŒ์•ฝ ๋…ธ๋“œ์— ์„ค์ •๋œ ๋ ˆ์ด๋ธ”์„ ์‚ญ์ œํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๋ ˆ์ด๋ธ”์˜ <key> ๊ฐ’์— ๋Œ€์‰ฌ(-)๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์ด ๋ง์ด๋‹ค.
 

kubectl label nodes $NODE_NAME <key>-

 
nodeSelector๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-node-name
spec:
  nodeSelector:
    appName/label: appTest
  containers:
    - name: nginx
      image: nginx:latest

 
๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ ์ •์˜ํ•œ ๋ ˆ์ด๋ธ” ์ฆ‰, appName/label=appTest ๋ผ๋Š” ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ๋…ธ๋“œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ผ๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ๋‹น์—ฐํžˆ ์—ฌ๋Ÿฌ ๋…ธ๋“œ ์ค‘ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋งŒ ์„ ํƒ๋˜์–ด ํ•ด๋‹น ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ์ด ๋œ๋‹ค. ๋ฌผ๋ก  ์ด ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ ์ค‘ ์ตœ์ข…์ ์œผ๋กœ ํ•˜๋‚˜์˜ ๋…ธ๋“œ๋กœ ๋ฌด์—‡์„ ์„ ํƒํ• ์ง€๋Š” ๋…ธ๋“œ ํ•„ํ„ฐ๋ง ์ดํ›„์˜ ๋…ธ๋“œ ์Šค์ฝ”์–ด๋ง ๋‹จ๊ณ„์—์„œ ๊ฒฐ์ •์ด ๋  ๊ฒƒ์ด๋‹ค.
 
ํ•˜์ง€๋งŒ ์ฃผ์˜ํ•  ์ ์€ ํŒŒ๋“œ๊ฐ€ 1๊ฐœ๊ฐ€ ์•„๋‹Œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋  ๋•Œ์ด๋‹ค. ๋‹ค์‹œ ๋งํ•ด, ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ผ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ์ƒ์„ฑํ•  ๋•Œ๋Š” ๋ณดํ†ต ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ํ•œ๊บผ๋ฒˆ์— ์ƒ์„ฑ๋œ๋‹ค. ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋‚˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ํ™œ์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ๋ฅผ ํ•œ๊บผ๋ฒˆ์— ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•ด๋„ ํŒŒ๋“œ๋“ค์˜ ์Šค์ผ€์ฅด๋ง์€ ๊ฐ ํŒŒ๋“œ๋งˆ๋‹ค ๋…๋ฆฝ์ ์œผ๋กœ ์Šค์ผ€์ฅด๋ง๋œ๋‹ค. ๊ทธ๋ž˜์„œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋‚˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹์„ ์ƒ์„ฑํ•˜๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— nodeSelector๋ฅผ ์ด์šฉํ•œ๋‹ค๋ฉด ๋ชจ๋“  ํŒŒ๋“œ๋“ค์ด ํ•˜๋‚˜์˜ ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹˜์— ์ฃผ์˜ํ•˜์ž.(๋ฌผ๋ก  ๋ช…์‹œํ•œ ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ๋…ธ๋“œ๊ฐ€ 1๊ฐœ ๋ฐ–์— ์—†๋‹ค๋ฉด ๋‹น์—ฐํžˆ ๊ทธ ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๊ฐ€ ํ• ๋‹น๋œ๋‹ค)

2-2. ์ข€ ๋” ํ™•์žฅ๋œ ๋…ธ๋“œ ์„ ํƒ ๋ฐฉ๋ฒ• : nodeAffinity, podAffinity, podAntiAffinity

์œ„์—์„œ ์•Œ์•„๋ณธ nodeSelector๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ช…์‹œํ•œ ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ๋…ธ๋“œ์—๋งŒ ํ• ๋‹น์ด ๊ฐ€๋Šฅํ•˜๋‹ค. ์ด๋ณด๋‹ค ์ข€ ๋” ๋‹ค์–‘ํ•œ ์Šค์ผ€์ฅด๋ง ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•ด nodeSelector์— ์•ฝ๊ฐ„ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•œ nodeAffinity๊ฐ€ ๋“ฑ์žฅํ•œ๋‹ค. nodeAffinity๋Š” ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” Hard ์กฐ๊ฑด์ด๋ผ๋Š” ๊ฒƒ๊ณผ ๊ผญ ์ถฉ์กฑ์€ ํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š” ์ด๋ฅธ๋ฐ” ์„ ํ˜ธ๋˜๋Š” ์กฐ๊ฑด์ธ Soft ์กฐ๊ฑด์ด๋ผ๋Š” ๊ฒƒ์„ ๋ณ„๋„๋กœ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด Hard ์กฐ๊ฑด๊ณผ Soft ์กฐ๊ฑด์€ ์•„๋ž˜์˜ 2๊ฐ€์ง€ ํ‚ค์›Œ๋“œ๋กœ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค.
 

  • Hard ์กฐ๊ฑด : requiredDuringScheduingIgnoredDuringExecution
  • Soft ์กฐ๊ฑด : preferredDuringScheduingIgnoredDuringExecution

์ด๋ฆ„์ด ๊ธธ์–ด์„œ ํ—ท๊ฐˆ๋ฆด ์ˆ˜ ์žˆ์œผ๋‚˜, ์šฐ๋ฆฐ ์ผ๋‹จ ๊ฐ€์žฅ ๋งจ์•ž์˜ ๋‹จ์–ด๋“ค์ธ required ์™€ preferred์—๋งŒ ์ฃผ๋ชฉํ•˜์ž. ์ด ํ‚ค์›Œ๋“œ๋งŒ ๋ณด๋ฉด ์–ด๋–ค๊ฒŒ ํ•„์ˆ˜ ์กฐ๊ฑด์ธ Hard ์กฐ๊ฑด์— ํ•ด๋‹นํ•˜๋Š”์ง€ ๋ˆˆ์น˜์ฑŒ ์ˆ˜ ์žˆ๋‹ค. ์ผ๋‹จ, Hard ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜๋Š” requiredDuringScheduingIgnoredDuringExecution์„ ์‚ฌ์šฉํ•œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ์‚ดํŽด๋ณด์ž.
 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-hard-condition
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
          - matchExpressions:
              - key: appName/label
                operator: In
                values:
                  - appTest
                  - appTest2
  containers:
    - name: nginx
      image: nginx:latest

 
 
์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ affinity ํ‚ค์›Œ๋“œ ์˜์—ญ์„ ๋ณด์ž. ์‚ฌ์‹ค ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ์ด์ œ ์ ์  ์ต์ˆ™ํ•ด์กŒ์œผ๋ฉด ์–ด๋Š ์ •๋„ ์˜๋ฏธ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์ดํ•ด๊ฐ€ ๊ฐˆ ๊ฒƒ์ด๋‹ค. ๋ฐ˜๋“œ์‹œ ์ถฉ์กฑํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์„ ๋ช…์‹œํ–ˆ๋Š”๋ฐ, ๊ทธ ์กฐ๊ฑด์€ ๋…ธ๋“œ๊ฐ€ ๊ฐ–๋Š” ๋ ˆ์ด๋ธ” ์ค‘ appName/label ์ด๋ผ๋Š” ๊ฒƒ์„ key ๊ฐ’์œผ๋กœ ํ•˜๋Š” ๊ฒƒ์˜ value์— ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ๋“ค์ด appTest ๋˜๋Š” appTest2 ์ธ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ผ๋Š” ๋œป์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” Operator์˜ ์ข…๋ฅ˜๋กœ In์„ ์‚ฌ์šฉํ–ˆ์ง€๋งŒ ๊ทธ์™ธ NotIn, Exists, Gt, Lt ๋“ฑ์ด ์กด์žฌํ•œ๋‹ค.
 
์ด๋ฒˆ์—” Soft ์กฐ๊ฑด์ธ preferredDuringScheduingIgnoredDuringExecution์— ๋Œ€ํ•ด์„œ ์‚ดํŽด๋ณด์ž. preferredDuringScheduingIgnoredDuringExecution๋Š” ๋ฐ˜๋“œ์‹œ ๋งŒ์กฑํ•ด์•ผ ํ•˜๋Š” ์กฐ๊ฑด์€ ์•„๋‹ˆ๋ฉฐ ํ•ด๋‹น ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ๋…ธ๋“œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๊ทธ ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ชฝ์œผ๋กœ ํ•  ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ "ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•˜๋Š” ์ชฝ์œผ๋กœ ํ•  ๊ฒƒ"์ด ์ฐธ ์• ๋งคํ•˜์ง€ ์•Š์€๊ฐ€? ์ด๋ฅผ ์ •๋Ÿ‰์ ์œผ๋กœ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด์„œ weight ๋ผ๋Š” ํ‚ค์›Œ๋“œ๋กœ 0๊ณผ 100 ์‚ฌ์ด์˜ ๊ฐ’์„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ 100์ผ์ˆ˜๋ก ํ•ด๋‹น ๋…ธ๋“œ์— ํ• ๋‹นํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง€๋„๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค. preferredDuringScheduingIgnoredDuringExecution๋ฅผ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-hard-condition
spec:
  affinity:
    nodeAffinity:
      preferredDuringSchedulingIgnoredDuringExecution:
        - preference:
            matchExpressions:
              - key: appName/label
                operator: In
                values:
                  - appTest
                  - appTest2
          weight: 80
  containers:
    - name: nginx
      image: nginx:latest

 
 
๋ช…์‹œํ•œ ์ด weight ๊ฐ’์€ ๋…ธ๋“œ ํ•„ํ„ฐ๋ง ๋‹จ๊ณ„ ์ดํ›„์ธ ๋…ธ๋“œ ์Šค์ฝ”์–ด๋ง ๋‹จ๊ณ„์—์„œ ์ ์ˆ˜๋ฅผ ๊ณ„์‚ฐํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ฒŒ ๋œ๋‹ค. 
 
๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ Hard ์กฐ๊ฑด๊ณผ Soft ์กฐ๊ฑด ๋ชจ๋‘ ์ฃผ์˜ํ•ด์•ผํ•  ๋ถ€๋ถ„์ด ์žˆ๋‹ค. ๋ฐ”๋กœ ์ด ์กฐ๊ฑด๋“ค์€ ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ๋•Œ๋งŒ ์œ ํšจํ•œ ์กฐ๊ฑด์ด๋‹ค. ๋‹ค์‹œ Hard ์กฐ๊ฑด๊ณผ Soft ์กฐ๊ฑด์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์‚ดํŽด๋ณด์ž. ์ด๋ฒˆ์—” ๋’ท๋ถ€๋ถ„์˜ ๋‹จ์–ด์— ์ฃผ๋ชฉํ•ด๋ณด์ž.
 

  • Hard ์กฐ๊ฑด : requiredDuringScheduingIgnoredDuringExecution
  • Soft ์กฐ๊ฑด : preferredDuringScheduingIgnoredDuringExecution

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

apiVersion: v1
kind: Pod
metadata:
  name: nginx-hard-condition
spec:
  affinity:
    podAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        - topologyKey: kubernetes.io/zone
          labelSelector:
            matchExpressions:
              - key: appName/label
                operator: In
                values:
                  - appTest
  containers:
    - name: nginx
      image: nginx:latest

 
topologyKey ๋ผ๋Š” ํ‚ค์›Œ๋“œ์™€ labelSelector ํ‚ค์›Œ๋“œ๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ๋‹ค. labelSelector๋Š” ์‚ฌ์‹ค ์šฐ๋ฆฌ๊ฐ€ ์ด์ „์— ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๊ธฐ์ดˆ ํฌ์ŠคํŒ… ์ค‘ ๋ ˆํ”Œ๋ฆฌ์นด์…‹๊ณผ ํŒŒ๋“œ์˜ ๋Š์Šจํ•  ์—ฐ๊ฒฐ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ๋ผ๋Š” ๊ฐœ๋…์„ ๋ฐฐ์› ์—ˆ๋Š”๋ฐ, ๊ทธ๋•Œ์˜ ๊ทธ๊ฒƒ์ด ๋ฐ”๋กœ ์—ฌ๊ธฐ ๋‹ค์‹œ ๋“ฑ์žฅํ•œ๋‹ค. ์ด๊ฒŒ ๋“ฑ์žฅํ•˜๋Š” ์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ๋ฐฉ๊ธˆ ์ด์•ผ๊ธฐํ–ˆ๋“ฏ์ด podAffinity๋Š” "ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŒŒ๋“œ์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋„๋ก ํ•˜๊ธฐ ์œ„ํ•จ"์ด๊ธฐ ๋•Œ๋ฌธ์ด๋ฏ€๋กœ ์ด 'ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑ' ํ•˜๋Š” ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜๊ธฐ ์œ„ํ•ด ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ(labelSelector)๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
 
๋˜ ๋“ฑ์žฅํ•œ ๋‹ค๋ฅธ ํ‚ค์›Œ๋“œ๋กœ๋Š” topologyKey๊ฐ€ ์žˆ๋‹ค. topolgy๋Š” ์‚ฌ์ „์ ์ธ ๋‹จ์–ด๋กœ '์œ„์ƒ'์ด๋ผ๋Š” ๋œป์ธ๋ฐ, ์‰ฝ๊ฒŒ ์ด์•ผ๊ธฐํ•˜๋ฉด '์–ด๋–ค ๊ธฐ์ค€์˜ ๋˜ ๋‹ค๋ฅธ ๊ทธ๋ฃน' ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. topologyKey๋Š” ์œ„ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์˜ˆ์‹œ๋กœ ์ดํ•ดํ•ด๋ณด์ž. ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—์„œ topologyKey ๊ฐ’์—๋Š” kubernetes.io/zone ์„ ๋ช…์‹œํ–ˆ๋Š”๋ฐ, ์ด๋Š” AWS๋‚˜ GCP์—์„œ์˜ ๊ฐ€์šฉ ์˜์—ญ(AZ, Availability Zone) ๋˜๋Š” ๋ฉ€ํ‹ฐ ๋ฆฌ์ ผ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, topologyKey์— kubernetes.io/zone์„ ๋ช…์‹œํ–ˆ๋‹ค๋Š” ๊ฒƒ์€ ๊ณง "๊ฐ€์šฉ ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ๋˜ ๋‹ค๋ฅธ ๊ทธ๋ฃน"์„ ํ˜•์„ฑํ–ˆ๋‹ค๊ณ  ๋ณด๋ฉด ๋œ๋‹ค. ๊ฐ€์šฉ ์˜์—ญ์„ ๊ธฐ์ค€์œผ๋กœ ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ์˜ ๋…ธ๋“œ๋ฅผ ๊ทธ๋ฃนํ•‘ํ•œ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

 
๋จผ์ € ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ํด๋Ÿฌ์Šคํ„ฐ ๋‚ด์—์„œ topologyKey์— ๋ช…์‹œ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ํ† ํด๋กœ์ง€๊ฐ€ ๊ฐ€์šฉ ์˜์—ญ ๊ธฐ์ค€์œผ๋กœ 2๊ฐœ ๊ทธ๋ฃน์œผ๋กœ ๋‚˜๋‰˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž. ๊ทธ๋ฆฌ๊ณ  ์ƒ์„ฑํ•  ํŒŒ๋“œ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—๋Š” appName/label=appTest ๋ผ๋Š” ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ํŒŒ๋“œ์™€ ํ•จ๊ป˜ ์‹คํ–‰๋˜๋„๋ก ๋ช…์‹œํ–ˆ๋‹ค. ํ˜„์žฌ ํ•ด๋‹น ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ํŒŒ๋“œ๋Š” ap-northeast-2a ๋ผ๋Š” ๊ฐ€์šฉ์˜์—ญ์ธ toplogy 1 ๋‚ด์˜ worker node 1์—์„œ ์‹คํ–‰๋˜๊ณ  ์žˆ๋‹ค. ์ด๋Ÿด ๊ฒฝ์šฐ ์ƒˆ๋กญ๊ฒŒ ์ƒ์„ฑํ•  ํŒŒ๋“œ๋Š” ์–ด๋””์— ์ƒ์„ฑ๋ ๊นŒ? ๋‹น์—ฐํžˆ topology 1์ด๋‹ค. ๋ฌผ๋ก  topology 1 ์ด๋‚ด์— worker node 1๊ณผ 3 ์ค‘์— 1์— ํ• ๋‹น๋  ์ˆ˜๋„, 3์— ํ• ๋‹น๋  ์ˆ˜๋„ ์žˆ๋‹ค. ๊ทธ ์ตœ์ข…์ ์ธ ์„ ํƒ ๊ณผ์ •์€ ๊ทธ ์ดํ›„์˜ ๋…ธ๋“œ ์Šค์ฝ”์–ด๋ง ๋‹จ๊ณ„์—์„œ ์ •ํ•ด์งˆ ๊ฒƒ์ด๋‹ค.
 
์ด๋Ÿฌํ•œ podAffinity๋Š” ์ฃผ๋กœ ๋‘ ๊ฐœ ๋˜๋Š” ๊ทธ ์ด์ƒ์˜ ํŒŒ๋“œ๋“ค ๊ฐ„์˜ ํ†ต์‹  ์‘๋‹ต ์‹œ๊ฐ„์„ ์ตœ๋Œ€ํ•œ ์ค„์ด๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ๊ฐ€์šฉ์˜์—ญ์˜ ๋…ธ๋“œ์— ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ์— ์ž์ฃผ ํ™œ์šฉ๋  ์ˆ˜ ์žˆ๋‹ค. 
 
๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ํ‚ค์›Œ๋“œ๋Š” podAntiAffinity์ด๋‹ค. podAntiAffinity๋ฅผ ์†Œ๊ฐœํ•˜๊ธฐ ์ „์— ๋ฐฉ๊ธˆ ์œ„์—์„œ ์•Œ์•„๋ณธ topologyKey์— ๋ช…์‹œํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ์ข…๋ฅ˜์˜ ๊ฐ’์— ๋Œ€ํ•ด์„œ ์ž ์‹œ ์‚ดํŽด๋ณด์ž. ์œ„์—์„œ๋Š” kubernetes.io/zone ์ด๋ผ๋Š” ๊ฐ’์œผ๋กœ ๊ฐ€์šฉ์˜์—ญ์„ ํ† ํด๋กœ์ง€ ํ‚ค๋กœ ๋ช…์‹œํ–ˆ์ง€๋งŒ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค ๋…ธ๋“œ์˜ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„์ธ kubernetes.io/hostname์œผ๋กœ๋„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ์ด hostname ๋ ˆ์ด๋ธ”์€ ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋˜๋Š”๋ฐ, ํŠน์ง•์€ ๊ฐ ๋…ธ๋“œ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๊ฐ–๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
 
์ด์ œ kubernetes.io/hostname์„ ํ† ํด๋กœ์ง€ ํ‚ค๋กœ ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์„ ํ™œ์šฉํ•˜๋Š” podAntiAffinity๋ฅผ ์‚ดํŽด๋ณด์ž. podAntiAffinity๋Š” "Anti" ๋ผ๋Š” ๋‹จ์–ด์˜ ์–ด๊ทผ์ด against ๋ผ๋Š” ๋œป์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด podAffinity์˜ ์ •๋ฐ˜๋Œ€ ๊ธฐ๋Šฅ์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ฆ‰, ํŠน์ • ์กฐ๊ฑด์„ ๋งŒ์กฑํ•˜๋Š” ํŒŒ๋“œ์™€ ๊ฐ™์€ ํ† ํด๋กœ์ง€์˜ ๋…ธ๋“œ๋ฅผ ์„ ์ •ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๋œป์ด๋‹ค. ๊ฒฐ๋ก ๋ถ€ํ„ฐ ๋งํ•˜๋ฉด ์ด podAntiAffinity๋ฅผ ์ž˜ ํ™œ์šฉํ•˜๋ฉด ๊ณ ๊ฐ€์šฉ์„ฑ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ํŒŒ๋“œ๋ฅผ ์—ฌ๋Ÿฌ ๊ฐ€์šฉ์˜์—ญ์— ๋ฉ€๋ฆฌ ํผ๋œจ๋ฆฌ๋Š” ์ „๋žต์„ ์„ธ์šธ ์ˆ˜ ์žˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ํ˜ธ์ŠคํŠธ ๋„ค์ž„์€ ๋…ธ๋“œ๋งˆ๋‹ค ๊ณ ์œ ํ•œ ์ด๋ฆ„์„ ๊ฐ–๋Š”๋ฐ, ์ด ๊ณ ์œ ํ•œ ์ด๋ฆ„์— ๋Œ€ํ•ด podAntiAffinity๋ฅผ ์ ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์€ ๊ทธ ๊ณ ์œ ํ•œ ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ๊ฐ–๋Š” ๋…ธ๋“œ๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ๋…ธ๋“œ๋“ค์— ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•˜๋ผ๋Š” ๋œป์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.
 
์กฐ๊ธˆ ๋” ์‘์šฉํ•ด์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์ •์˜ํ•  ๋•Œ, ํŒŒ๋“œ์˜ ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ๋ฅผ ์ •์˜ํ•˜๋Š” ๋ถ€๋ถ„์˜ ๋ ˆ์ด๋ธ”์„ podAntiAffinity์˜ ๋ผ๋ฒจ ์…€๋ ‰ํ„ฐ์˜ ๋ ˆ์ด๋ธ”๊ณผ ๋™์ผ์‹œํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ? ์ผ๋‹จ ์•„๋ž˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ๋ฅผ ์‚ดํŽด๋ณด์ž.
 
 

apiVersion: apps/v1
kind: Deployment
metadata:
  name: pod-anti-affinity-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      appName: testApp
  template:
    metadata:
      name: pod-anti-affinity-pod
      labels:
        appName: testApp
    spec:
      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - topologyKey: kubernetes.io/hostname
              labelSelector:
                matchExpressions:
                  - key: appName
                    operator: In
                    values:
                      - testApp
      containers:
        - name: nginx
          image: nginx:latest

 
 
์šฐ์„  ๋จผ์ € podAntiAffinity ๋ถ€๋ถ„์„ ํ•ด์„ํ•ด๋ณด์ž. Hard ์กฐ๊ฑด์„ ๋ช…์‹œํ–ˆ๊ณ , ํ† ํด๋กœ์ง€ ํ‚ค๋Š” hostname์œผ๋กœ ๋ช…์‹œํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ appName=testApp ์„ ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ํŒŒ๋“œ๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋…ธ๋“œ์˜ ํ˜ธ์ŠคํŠธ๋„ค์ž„๊ณผ ๋™์ผํ•œ ํ˜ธ์ŠคํŠธ๋„ค์ž„์„ ๊ฐ–๋Š” ๋…ธ๋“œ์—๋Š” ๋ฐ˜๋“œ์‹œ ์ƒ์„ฑํ•˜์ง€ ๋ง๋ผ๋Š” ๋œป์ด๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๋…ธ๋“œ์—๋‹ค๊ฐ€ ํ•ด๋‹น ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋ผ๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ spec.selector.matchLabels ์˜์—ญ์„ ๋ณด์ž. ํ•ด๋‹น ์˜์—ญ์„ ๋ณด๋‹ˆ ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ฆฌ์†Œ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ํŒŒ๋“œ์˜ ๋ ˆ์ด๋ธ”์„ appName=testApp์œผ๋กœ ์ง€์ •ํ–ˆ๋‹ค. ์ฆ‰, ๋‹ค๋ฅธ ๋…ธ๋“œ์—๋‹ค๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ํŒŒ๋“œ๋„ appName=testApp ๋ ˆ์ด๋ธ”์„ ๊ฐ–๊ฒŒ ํ•œ ๊ฒƒ์ด๋‹ค. ์ด๋ ‡๊ฒŒ ๋˜๋ฉด ์—ฐ์‡„์ ์œผ๋กœ ์ดํ›„์— ์ƒ์„ฑ๋˜๋Š” ํŒŒ๋“œ๋“ค์€ ๋ฐฉ๊ธˆ ์ƒ์„ฑ๋œ ํŒŒ๋“œ๊ฐ€ ํ• ๋‹น๋œ ๋…ธ๋“œ์™€ ๋‹ค๋ฅธ ๋…ธ๋“œ์— ํ• ๋‹น๋  ์ˆ˜ ๋ฐ–์— ์—†๋‹ค.(์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๋””ํ”Œ๋กœ์ด๋จผํŠธ, ๋ ˆํ”Œ๋ฆฌ์นด์…‹์œผ๋กœ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋”๋ผ๋„ ์Šค์ผ€์ฅด๋ง์€ ํŒŒ๋“œ ๊ฐ๊ฐ ๋…๋ฆฝ์ ์œผ๋กœ ์ด๋ฃจ์–ด์ง„๋‹ค๊ณ  ํ–ˆ๋‹ค!) ์ด๋ ‡๊ฒŒ ์—ฐ์‡„์ ์œผ๋กœ ๊ณ„์† ์ˆ˜ํ–‰ํ•˜๋‹ค ๋ณด๋ฉด ๊ฒฐ๊ตญ ๋ชจ๋“  ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ํ•˜๋‚˜์”ฉ ํ• ๋‹นํ•˜๋Š” ๋งˆ์น˜ ๋ฐ๋ชฌ์…‹๊ณผ ๋น„์Šทํ•œ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.
 
์ฐธ๊ณ ๋กœ podAffinity, podAntiAffinity ๋ชจ๋‘ nodeAffinity ์ฒ˜๋Ÿผ Soft ์กฐ๊ฑด๋„ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹น์—ฐํžˆ Soft ์กฐ๊ฑด์„ ๋ช…์‹œํ•˜๋ฉด weight ๊ฐ’์„ ๋ช…์‹œํ•ด์•ผ ํ•˜๊ณ , ๊ฒฐ๊ตญ ํ† ํด๋กœ์ง€ ํ‚ค๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‚˜๋ˆ„์–ด์ง„ ๊ทธ๋ฃน ๋‚ด์˜ ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‹ค๋ฅธ ํ† ํด๋กœ์ง€ ํ‚ค ๊ทธ๋ฃน ๋‚ด์˜ ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์€ ์กฐ๊ธˆ์ด๋ผ๋„ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•„๋‘๋„๋ก ํ•˜์ž.

2-3. ๋…ธ๋“œ์™€ ํŒŒ๋“œ๋ฅผ ํ•จ๊ป˜ ์ง€์ •ํ•˜๊ธฐ : Taints ์™€ Tolerations

๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ๋…ธ๋“œ ์„ ํƒ ๋ฐฉ๋ฒ•์€ Taints์™€ Tolerations์„ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค. Taints๋Š” ๋…ธ๋“œ์— ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๊ณ , Tolerations๋Š” ํŒŒ๋“œ์— ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค. ๊ทธ๋ž˜์„œ ์ด Taints์™€ Tolerations๋ฅผ ํ•จ๊ป˜ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•˜๋‚˜์”ฉ ์‚ดํŽด๋ณด์ž.
 
๋จผ์ € Taints์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” '์–ผ๋ฃฉ'์ด๋ผ๋Š” ์˜๋ฏธ๋กœ, ๋…ธ๋“œ์— '์–ผ๋ฃฉ'์„ ๋ฌปํžŒ๋‹ค๋ผ๊ณ  ๋น„์œ ํ•  ์ˆ˜ ์žˆ๋‹ค. ์ฆ‰, ์–ผ๋ฃฉ์ด ๋ฌป์€ ๋…ธ๋“œ์—๋Š” ํŒŒ๋“œ๊ฐ€ ํ• ๋‹น๋  ์ˆ˜ ์—†๋„๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ด ๋ฐ”๋กœ Taints์ด๋‹ค. Tolerations์€ ๋ฐฉ๊ธˆ ์†Œ๊ฐœํ•œ Taints ์ฆ‰, ์–ผ๋ฃฉ์ด ๋ฌป์€ ๋…ธ๋“œ์ง€๋งŒ ํ•ด๋‹น ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” ๊ธฐ๋Šฅ์ด๋‹ค. ๊ทธ๋ž˜์„œ Tolerations์˜ ์‚ฌ์ „์  ์˜๋ฏธ๊ฐ€ '์šฉ์ธํ•˜๋‹ค'์˜ '์šฉ์ธ'์„ ์˜๋ฏธํ•˜๋Š”๋ฐ, ๋งˆ์น˜ "์–ผ๋ฃฉ์ด ๋ฌป์€ ๋…ธ๋“œ๊ธด ํ•˜์ง€๋งŒ ์–ด๋–ค ํŒŒ๋“œ ๋„ˆ ๋งŒํผ์€ ํ• ๋‹น๋„๋ก ์šฉ์ธํ•ด์ค„๊ฒŒ!"์™€ ๊ฐ™๋‹ค. ์ด์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ์ ์ธ ์˜๋ฏธ ๋•Œ๋ฌธ์— Taints๋Š” ๋…ธ๋“œ์— ๋ช…์‹œํ•˜๋Š” ๊ฒƒ์ด๊ณ , Tolerations๋Š” ํŒŒ๋“œ์— ์ง€์ •ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
 
Taints์˜ ์ข…๋ฅ˜๋Š” ๋งค์šฐ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋กœ, ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ Taints๋ฅผ ์„ค์ •ํ•  ์ˆ˜๋„ ์žˆ๊ณ , ํŒŒ๋“œ ์ƒ์„ฑ๊ณผ ๊ฐ™์ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์—์„œ ๋ฐœ์ƒํ•˜๋Š” ํŠน์ • ์ด๋ฒคํŠธ๋กœ ์ธํ•ด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŠน์ • ๋…ธ๋“œ์— Taints๋ฅผ ์„ค์ •ํ•ด์ฃผ๊ธฐ๋„ ํ•œ๋‹ค. Taints๋„ ์œ„์—์„œ ์•Œ์•„๋ณธ nodeSelector, nodeAffinity, podAffinity ๋“ฑ์˜ ๋ ˆ์ด๋ธ” ์ฒ˜๋Ÿผ <key>=<value> ํ˜•ํƒœ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค. ๋‹ค๋งŒ, ์•ž์„œ ์•Œ์•„๋ณธ ๋ ˆ์ด๋ธ”๊ณผ๋Š” ๋‹ค๋ฅด๊ฒŒ Taints์—๋Š” Effect ๋ผ๋Š” ๊ฒƒ์„ ์ถ”๊ฐ€๋กœ ๋ช…์‹œํ•ด์ค€๋‹ค. ์•„๋ž˜๋Š” kubectl ๋ช…๋ น์–ด๋กœ Taints๋ฅผ ํŠน์ • ๋…ธ๋“œ์— ์„ค์ •ํ•˜๋Š” ์˜ˆ์‹œ์ด๋‹ค.
 

kubectl taint node $NODE_NAME <key>=<value>:$Effect

 
Effect๊ฐ€ ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋Š” Taint์˜ ํšจ๊ณผ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ์–ด๋–ค ๋…ธ๋“œ์— ํŒŒ๋“œ๊ฐ€ ํ• ๋‹น๋˜์—ˆ์„ ๋•Œ ๋ฐœ์ƒํ•  ํšจ๊ณผ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด Effect์— ๋ช…์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์ข…๋ฅ˜๋Š” NoSchedule(ํŒŒ๋“œ๋ฅผ ์Šค์ผ€์ฅด๋งํ•˜์ง€ ์•Š์Œ), NoExecute(ํŒŒ๋“œ ์‹คํ–‰ ์ž์ฒด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Œ), PreferNoSchedule(๊ฐ€๋Šฅํ•˜๋ฉด ์Šค์ผ€์ฅด๋ง ํ•˜์ง€ ์•Š์Œ)์ด ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„๋ž˜์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋กœ ํŠน์ • ๋…ธ๋“œ์— Taint๋ฅผ ์„ค์ •ํ•œ๋‹ค๊ณ  ํ•ด๋ณด์ž.
 

kubectl taint node zedd-node app/label=AppTest:NoSchedule

 
์œ„ ๋ช…๋ น์–ด์˜ ์˜๋ฏธ๋ฅผ ํ•ด์„ํ•ด๋ณด๋ฉด "zedd-node" ๋ผ๋Š” ์ด๋ฆ„์„ ๊ฐ–๋Š” ๋…ธ๋“œ์—๋Š” "app/label=AppTest" ๋ผ๋Š” ๋ ˆ์ด๋ธ”์„ ๊ฐ–๋Š” ํŒŒ๋“œ๋“ค์„ ์Šค์ผ€์ฅด๋ง ํ•  ์ˆ˜ ์—†๋‹ค!"์ด๋‹ค.
 
๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ์œ„์—์„œ ์„ค์ •ํ•œ Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•ด์„œ ํ•ด๋‹น ํŒŒ๋“œ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— Tolerations์„ ๋ช…์‹œํ•ด๋ณด์ž. Tolerations๊ฐ€ ๋ช…์‹œ๋œ ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ ์˜ˆ์‹œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค.
 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-tolerations
spec:
  tolerations:
    - key: app/label
      value: AppTest
      operator: Equal
      effect: NoSchedule
  containers:
    - name: nginx
      image: nginx:latest

 
tolerations ์˜์—ญ์„ ๋ณด๋ฉด Taints๋ฅผ ์„ค์ •ํ•  ๋•Œ ๋ช…์‹œํ–ˆ๋˜ key, value ๊ฐ’์„ ๋ช…์‹œํ•ด์ค€๋‹ค. ๊ทธ๋ฆฌ๊ณ  operator๋กœ ํ•ด๋‹น value ๊ฐ’์ด ์ •ํ™•์ผ ์ผ์น˜(Equal)ํ•  ๋•Œ๋งŒ ์ ์šฉํ•˜๋ฉฐ Taint์˜ ํšจ๊ณผ๋Š” NoSchedule์„ ๋ช…์‹œํ•จ์œผ๋กœ์จ ์œ„์—์„œ ์„ค์ •ํ•œ Taint์˜ ํšจ๊ณผ์™€ ๋™์ผํ•˜๊ฒŒ ๋ช…์‹œํ•ด์ค€๋‹ค.
 
์ด๋ ‡๊ฒŒ ํŒŒ๋“œ์— Tolerations์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ํ•ด๋‹น ํŒŒ๋“œ๋Š” ์œ„์—์„œ Taint๋ฅผ ์„ค์ •ํ•œ ๋…ธ๋“œ์— ์ƒ์„ฑ๋  ์ˆ˜๋„ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ '์ƒ์„ฑ๋  ์ˆ˜๋„ ์žˆ๋‹ค'๋ผ๊ณ  ํ•œ ์ ์— ์ž ์‹œ ์ฃผ๋ชฉํ•˜์ž. ์œ„์ฒ˜๋Ÿผ ํŒŒ๋“œ์— Tolerations์„ ๋ช…์‹œํ•œ๋‹ค๊ณ  ํ•ด์„œ ๋ฐ˜๋“œ์‹œ ํ•ด๋‹น Tolerations์— ๋Œ€์‘๋˜๋Š” Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์—๋งŒ ํŒŒ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ๋‹จ์ง€, ํ•ด๋‹น Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์— ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๋ผ๊ณ  ๊ฐ€๋Šฅ์„ฑ๋งŒ ๋ช…์‹œํ•œ ์…ˆ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์ •๋ง ๋ช…์‹œ์ ์œผ๋กœ ํ•ด๋‹น Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋„๋ก ์˜๋„ํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ์œ„์—์„œ ๋ฐฐ์šด nodeSelector ์™€ ๊ฐ™์€ ๊ฒƒ์„ ํ•จ๊ป˜ ์ด์šฉํ•ด์„œ ์ง€์ •ํ•ด์ฃผ์–ด์•ผ ํ•œ๋‹ค.
 
๊ทธ๋ฆฌ๊ณ  ์œ„์—์„œ Taint๋ฅผ ์„ค์ •ํ•  ๋•Œ <key>=<value> ๊ฐ’์„ ๋ช…์‹œํ•ด์ฃผ์—ˆ๋Š”๋ฐ, <value> ๊ฐ’์„ ๋”ฐ๋กœ ๋ช…์‹œํ•ด์ฃผ์ง€ ์•Š์•„๋„ ์ƒ๊ด€์€ ์—†๋‹ค. ๋ณ„๋„๋กœ ๋ช…์‹œํ•˜์ง€ ์•Š์œผ๋ฉด ๋นˆ ๋ฌธ์ž์—ด("")๋กœ ๊ฐ„์ฃผ๋œ๋‹ค. ์‹ค์ œ๋กœ ๋งˆ์Šคํ„ฐ ๋…ธ๋“œ์— ์„ค์ •๋˜์–ด ์žˆ๋Š” Taint๋ฅผ ๋ณด๋ฉด <key>๋งŒ ์กด์žฌํ•˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ๋งŒ์•ฝ Taint์— <value>๊ฐ€ ๋ช…์‹œ๋˜์–ด ์žˆ์ง€ ์•Š์œผ๋ฉด ์ด Taint์— ๋Œ€ํ•œ Tolerations์„ ๋ช…์‹œํ•  ๋•Œ๋„ ๋‹น์—ฐํžˆ value: ์˜์—ญ์—๋Š” ๋นˆ ๋ฌธ์ž์—ด("")์„ ๋ช…์‹œํ•ด์ฃผ๋ฉด ๋œ๋‹ค.
 
๋˜ํ•œ Taint ์„ค์ • ์‹œ, <key> ๊ฐ’ ๋งˆ์ €๋„ ์ƒ๋žตํ•˜๊ณ , Effect ๋งŒ ์ •์˜ํ•˜๋Š” ๊ฒƒ๋„ ๊ฐ€๋Šฅํ•˜๋‹ค. ์‹ค์ œ๋กœ, kube api server ํŒŒ๋“œ์˜ ๋งค๋‹ˆํŽ˜์ŠคํŠธ๋ฅผ ์‚ดํŽด๋ณด๋ฉด Tolerations์— Effect ๋งŒ ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.
 

QoS Class:         Burstable
Tolerations:       :NoExecute
...

 
์ด๋Ÿฐ ๊ฒฝ์šฐ, ์ด Tolerations๋Š” Taint์˜ <key>, <value>๊ฐ€ ๋ฌด์—‡์ด๋“ ์ง€ ์ƒ๊ด€์—†์ด ๋ชจ๋“  :NoExecute ์ข…๋ฅ˜์˜ Taint๋ฅผ ์šฉ์ธํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•œ๋‹ค. ์ฆ‰, ํ•ด๋‹น Tolerations๋ฅผ ๊ฐ–๋Š” ํŒŒ๋“œ๋“ค์€ NoExecute ๋ผ๋Š” Effect ์กฐ๊ฑด๋งŒ ์ถฉ์กฑํ•˜๋Š” ๋…ธ๋“œ์ด๋ฉด  ๊ทธ ๋…ธ๋“œ์ด ํŒŒ๋“œ๋ฅผ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค.
 
์ฐธ๊ณ ๋กœ ์œ„ ํŒŒ๋“œ ๋งค๋‹ˆํŽ˜์ŠคํŠธ์˜ tolerations ํ•ญ๋ชฉ์— operator๋กœ Equal์ด ์ •์˜๋˜์–ด ์žˆ๋Š”๋ฐ, ๋˜ ๋‹ค๋ฅธ operator ์ข…๋ฅ˜๋กœ Exists๋„ ์กด์žฌํ•œ๋‹ค. Exists๋กœ ๋งŒ์•ฝ ์„ค์ •๋œ ๊ฒฝ์šฐ, Taint์— ๋Œ€ํ•œ ์™€์ผ๋“œ์นด๋“œ๋กœ ์ˆ˜ํ–‰๋œ๋‹ค. ์ฆ‰, ๋งŒ์•ฝ ์•„๋ž˜์™€ ๊ฐ™์ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ๊ฐ€ ์ •์˜๋˜์–ด ์žˆ๋‹ค๊ณ  ํ•ด๋ณด์ž.
 

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod-tolerations
spec:
  tolerations:
    - operator: Exists
  containers:
    - name: nginx
      image: nginx:latest

 
์ด๋Ÿด ๊ฒฝ์šฐ, <key>, <value>, ์‹ฌ์ง€์–ด Effect ์ข…๋ฅ˜์— ์ƒ๊ด€์—†์ด ๋ชจ๋“  ๋…ธ๋“œ์— ํŒŒ๋“œ๋ฅผ ํ• ๋‹นํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค.

 

์ถ”๊ฐ€์ ์œผ๋กœ, Taint์˜ ํšจ๊ณผ ์ค‘ NoSchedule ๊ณผ๋Š” ๋‹ค๋ฅธ ์ข…๋ฅ˜์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ๋Œ€ํ‘œ์ ์œผ๋กœ PreferNoSchedule, NoExecute๊ฐ€ ์žˆ๋‹ค. ์ด ์ค‘ NoExecute์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด์ž. NoExecute ํšจ๊ณผ๋ฅผ ๊ฐ€์ง„ Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์—์„œ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ฅด๋ง ๋˜์ง€ ์•Š๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ํŒŒ๋“œ๊ฐ€ ์•„์˜ˆ ์‹คํ–‰์กฐ์ฐจ ๋˜์ง€ ๋ชปํ•˜๊ฒŒ ๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด NoSchedule๊ณผ NoExecute ํšจ๊ณผ ๊ฐ„์˜ ์ฐจ์ด๋Š” ๋ฌด์—‡์ผ๊นŒ? NoSchedule ํšจ๊ณผ๊ฐ€ ๋…ธ๋“œ์—์„œ ์„ค์ •๋˜๋”๋ผ๋„ NoSchedule ํšจ๊ณผ๊ฐ€ ์„ค์ •๋˜๊ธฐ ์ด์ „์˜ ํŒŒ๋“œ๋“ค์€ ๋…ธ๋“œ์—์„œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘ํ•œ๋‹ค. ๋ฐ˜๋ฉด์— NoExecute ํšจ๊ณผ๋Š” ๋…ธ๋“œ์— ์„ค์ •๋˜๋Š” ์ˆœ๊ฐ„ ์ด์ „์— ์ƒ์„ฑ๋˜์—ˆ๋˜ ํŒŒ๋“œ๋“ค์ด๋”๋ผ๋„ ๊ฐ€์ฐจ์—†์ด ์ข…๋ฃŒ์‹œ์ผœ๋ฒ„๋ฆฐ๋‹ค.(๋ฌผ๋ก  NoExecute ํšจ๊ณผ๋ฅผ ๊ฐ–๋Š” Taint์— ๋Œ€ํ•œ Toleration์„ ๊ฐ–๋Š” ํŒŒ๋“œ๋Š” ๋‹น์—ฐํžˆ NoExecute ํšจ๊ณผ์˜ Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ๋”๋ผ๋„ ํŒŒ๋“œ ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋‹ค)

 

๋งŒ์•ฝ NoExecute ํšจ๊ณผ์ธ Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์— ๋‹จ์ผ ํŒŒ๋“œ๋กœ ์ƒ์„ฑํ–ˆ๋‹ค๋ฉด ํ•ด๋‹น ํŒŒ๋“œ๋Š” ๋ฐ”๋กœ ์ข…๋ฃŒ๋˜๊ณ  ์•„๋ฌด์ผ๋„ ์ผ์–ด๋‚˜์ง€ ์•Š๋Š”๋‹ค. ๋ฐ˜๋ฉด์—, ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋‚˜ ๋ ˆํ”Œ๋ฆฌ์นด์…‹ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ฆฌ์†Œ์Šค ์˜ค๋ธŒ์ ํŠธ๋กœ ํŒŒ๋“œ๋ฅผ ํ•จ๊ป˜ ์ƒ์„ฑํ•œ๋‹ค๋ฉด NoExecute ํšจ๊ณผ์ธ Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์—์„œ ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋˜๊ณ , ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๊ทธ๊ณณ์—์„œ ์ƒ์„ฑ๋˜๋Š” Eviction์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ด์œ ๋Š” ๊ฐ„๋‹จํ•˜๋‹ค. ๋ ˆํ”Œ๋ฆฌ์นด์…‹๊ณผ ๋””ํ”Œ๋กœ์ด๋จผํŠธ๋Š” ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ช…์‹œํ•ด์ค€ ํŒŒ๋“œ ๊ฐœ์ˆ˜๋ฅผ ๋ฐ˜๋“œ์‹œ ์ง€์ผœ์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋–ป๊ฒŒ๋“  ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ์ฐพ์•„ ๊ทธ ๊ฐœ์ˆ˜๋ฅผ ๋งž์ถฐ์ฃผ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. 

 

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

 

์šฐ์„  ์ƒ์„ฑ๋œ ํŒŒ๋“œ์— ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ช…์‹œ๋˜์–ด ์žˆ๋Š” Toleration ์˜ˆ์‹œ๋ฅผ ํ•˜๋‚˜ ๋ณด์ž. ์•„๋ž˜์ฒ˜๋Ÿผ ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค.

 

node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s

 

๋งŒ์•ฝ ์œ„ Toleration์ด ํŒŒ๋“œ์— ๋ช…์‹œ๋˜์–ด ์žˆ๋‹ค๋ฉด ๋ฌด์Šจ ๋œป์ผ๊นŒ? ๋ฐ”๋กœ "๋…ธ๋“œ์˜ ์ƒํƒœ๊ฐ€ not-ready ์ด๊ฑฐ๋‚˜ unreachable์ผ ๋•Œ, 300์ดˆ ๋™์•ˆ์€ NoExecute ํšจ๊ณผ์ธ Taint๋ฅผ ๊ฐ–๋Š” ๋…ธ๋“œ์—๋„ ํ• ๋‹น์€ ๋  ์ˆ˜ ์žˆ๋‹ค"๋Š” ๋œป์ด๋‹ค. ๋งŒ์•ฝ ๋…ธ๋“œ์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค๋Š” ์ž๋™์œผ๋กœ ํ•ด๋‹น ๋…ธ๋“œ์— ์œ„์™€ ๊ฐ™์€ ์ข…๋ฅ˜์˜ Taint๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์œ„ Toleration์€ ์ด๋Ÿฐ ๋…ธ๋“œ๋“ค์ด ์ค€๋น„๋˜์ง€ ์•Š์•˜๊ฑฐ๋‚˜ ๋„คํŠธ์›Œํฌ ํ†ต์‹ ์ด ๋ถˆ๊ฐ€๋Šฅํ•œ ์ƒํ™ฉ์ด์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์‹œ๊ฐ„์ด ์ง€๋‚˜์„œ ํ˜น์‹œ๋ผ๋„ ๋…ธ๋“œ์˜ ์ƒํƒœ๊ฐ€ ์ •์ƒ์œผ๋กœ ๋Œ์•„์˜ฌ ๊ฒƒ์„ ๋Œ€๋น„ํ•˜๊ธฐ ์œ„ํ•จ์ด๋‹ค.

 

์œ„ Toleration์˜ 300์ดˆ๋ฅผ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด, ๋…ธ๋“œ๊ฐ€ ์ •์ƒ ์ƒํƒœ๋กœ ๋Œ์•„์™€์„œ NoExecute ํšจ๊ณผ๋ฅผ ๊ฐ–๋Š” Taint๊ฐ€ ์—†์–ด์งˆ ์ˆ˜๋„ ์žˆ์œผ๋‹ˆ 300์ดˆ ๋™์•ˆ์€ ์ผ๋‹จ ํŒŒ๋“œ๋ฅผ ํ•ด๋‹น ๋…ธ๋“œ์— ๊ณ„์† ํ• ๋‹น์‹œ์ผœ๋ณด์ž๋Š” ๊ฒƒ์ด๋‹ค. ๋งŒ์•ฝ 300์ดˆ๊ฐ€ ์ง€๋‚˜๋„ ๋…ธ๋“œ๊ฐ€ ์ •์ƒ ์ƒํƒœ๋กœ ๋Œ์•„์˜ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ์—ฌ์ „ํžˆ ํ•ด๋‹น ๋…ธ๋“œ์—๋Š” NoExecute ํšจ๊ณผ๋ฅผ ๊ฐ–๋Š” Taint๊ฐ€ ์กด์žฌํ•  ๊ฒƒ์ด์ง€๋งŒ, ํŒŒ๋“œ๋“ค์€ 300์ดˆ๊ฐ€ ์ง€๋‚œ ๋’ค NoExecute์— ๋Œ€ํ•œ Toleration์ด ์—†์–ด์ง€๊ฒŒ ๋˜๋‹ˆ ํ•ด๋‹น ๋…ธ๋“œ์— ํ• ๋‹น๋˜์ง€ ๋ชปํ•˜๊ณ , ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์˜ฎ๊ฒจ ์ƒ์„ฑ(Eviction)๋˜๊ฒŒ ๋œ๋‹ค. ์ด ๋•Œ, '300์ดˆ'๋ผ๋Š” ๋‹จ์œ„์˜ ์˜ต์…˜์„ tolerationSeconds ๋ผ๊ณ  ๋ถ€๋ฅธ๋‹ค.

2-4. NoSchedule, NoExecute์˜ ํšจ๊ณผ์™€ ๊ฐ™๋‹ค! : cordon, drain

์ง์ „์—์„œ ์•Œ์•„๋ณธ Taint์˜ ํšจ๊ณผ ์ข…๋ฅ˜๋“ค์ด์—ˆ๋˜ NoSchedule๊ณผ NoExecute ํšจ๊ณผ์™€ ๊ฐ๊ฐ ๋น„์Šทํ•œ cordon, drain ๋ช…๋ น์–ด์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž. ์ด ๋‘ ๋ช…๋ น์–ด๋Š” Taint, Toleration์„ ์‚ฌ์šฉํ•ด ๊ฐ„์ ‘์ ์œผ๋กœ ํšจ๊ณผ๋ฅผ ๋ช…์‹œํ•˜๋Š” NoSchedule๊ณผ NoExecute๊ณผ๋Š” ๋‹ฌ๋ฆฌ ์ข€ ๋” ๋ช…์‹œ์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋จผ์ €, cordon ๋ช…๋ น์–ด๋Š” NoSchedule๊ณผ ํšจ๊ณผ๊ฐ€ ๋™์ผํ•˜๋‹ค. ์•„๋ž˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ ํŠน์ • ๋…ธ๋“œ์— cordon์„ ํ•  ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

 

kubectl cordon $NODE_NAME

 

์ด๋ ‡๊ฒŒ cordon์ด ์ ์šฉ๋œ ๋…ธ๋“œ๋Š” ํ•ด๋‹น ๋…ธ๋“œ์— ๋” ์ด์ƒ ํŒŒ๋“œ๊ฐ€ ์Šค์ผ€์ฅด๋ง๋˜์ง€ ์•Š๋Š”๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ํ•ด๋‹น ๋…ธ๋“œ์˜ ์ƒํƒœ์— SchedulingDisabled ๋ผ๋Š” ๊ฐ’์ด ์ถ”๊ฐ€๊ฐ€ ๋œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ํ•ด๋‹น ๋…ธ๋“œ์˜ Taint๋ฅผ ๋ณด๋ฉด ์‹ค์ œ๋กœ NoSchedule ์ด๋ผ๋Š” ํšจ๊ณผ๊ฐ€ ๋ถ™์–ด์žˆ์Œ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. cordon๋„ NoSchedule๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ cordon์„ ์ ์šฉํ•˜๊ธฐ ์ „ ์ด๋ฏธ ๋…ธ๋“œ์—์„œ ์‹คํ–‰ ์ค‘์ด์—ˆ๋˜ ํŒŒ๋“œ๋ฅผ ์ข…๋ฃŒํ•˜์ง€๋Š” ์•Š๋Š”๋‹ค.

 

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

 

kubectl drain $NODE_NAME

 

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

2-5. ๋ฌด์ค‘๋‹จ ํ‡ด๊ฑฐ(Eviction)๋ฅผ ๋งŒ๋“ค๊ฒŒ ํ•ด์ฃผ๋Š” ๊ฒƒ! : PodDisruptionBudget(PDB)

๋‹ค์Œ์œผ๋กœ ์•Œ์•„๋ณผ ๋‚ด์šฉ์€ ์ง์ „์— ๋ฐฐ์šด drain ๋ช…๋ น์–ด๋‚˜ Taint์˜ NoExecute ํšจ๊ณผ์ฒ˜๋Ÿผ ์ด๋Ÿฐ ๊ฒƒ๋“ค๋กœ ์ธํ•ด ํŒŒ๋“œ๊ฐ€ ํ‡ด๊ฑฐ(Eviction)๋ฅผ ํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” PodDistruptionDudget(์ดํ•˜ PDB)์— ๋Œ€ํ•ด์„œ ์•Œ์•„๋ณด๋ ค๊ณ  ํ•œ๋‹ค. PDB๋Š” ๋ฌด์ค‘๋‹จ ํ‡ด๊ฑฐ ์ƒํ™ฉ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ๋“ฑ์žฅํ–ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด๋ณด์ž. ์•„๋ž˜์ฒ˜๋Ÿผ ๋…ธ๋“œ A์— ํŒŒ๋“œ๊ฐ€ ์šด์˜ ์ค‘์ด๋‹ค๊ฐ€, ๋…ธ๋“œ A์— ์žฅ์• ๊ฐ€ ์ƒ๊ธฐ๊ฑฐ๋‚˜ ๋…ธ๋“œ A์— ๋Œ€ํ•œ ์œ ์ง€๋ณด์ˆ˜๋ฅผ ํ•ด์•ผ ํ•˜๋Š” ๋“ฑ์˜ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•ด์„œ ํŒŒ๋“œ๊ฐ€ ๋…ธ๋“œ A๋กœ๋ถ€ํ„ฐ ํ‡ด๊ฑฐ๋˜์–ด ๋…ธ๋“œ B์— ๋‹ค์‹œ ์ƒ์„ฑ๋œ๋‹ค๊ณ  ํ•ด๋ณด์ž.

 

 

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

 

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

 

apiVersion: policy/v1
kind: PodDisruptionBudget
metadata:
  name: test-pdb
spec:
  maxUnavailable: 1
  # minAvailable: 2
  selector:
    matchLabels:
      app: TestApp

 

PDB ๋งค๋‹ˆํŽ˜์ŠคํŠธ์—๋Š” maxUnavailable๊ณผ minAvailable ์ด๋ผ๋Š” ํ‚ค์›Œ๋“œ ์ค‘ ํ•˜๋‚˜๋งŒ์„ ์‚ฌ์šฉํ•ด ํŒŒ๋“œ์˜ ์–ด๋Š ์ •๋„ ๊ฐœ์ˆ˜ ๋˜๋Š” ๋น„์œจ๋กœ ์œ ์ง€ํ•  ๊ฒƒ์ธ์ง€๋ฅผ ๋ช…์‹œํ•œ๋‹ค. maxUnavailable์€ ๋…ธ๋“œ์—์„œ ํŒŒ๋“œ๊ฐ€ ์ข…๋ฃŒ๋  ๋•Œ, ์ตœ๋Œ€ ๋ช‡ ๊ฐœ๊นŒ์ง€ ๋™์‹œ์— ์ข…๋ฃŒ๋  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๋ช…์‹œํ•œ๋‹ค. ๋งŒ์•ฝ ์œ„์ฒ˜๋Ÿผ 1๋กœ ๋ช…์‹œํ•œ๋‹ค๋ฉด ๋…ธ๋“œ ๋‚ด์˜ ํŒŒ๋“œ๋Š” ๋ฐ˜๋“œ์‹œ 1๊ฐœ๋งŒ ์ข…๋ฃŒ๋˜์–ด ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์ƒ์„ฑ๋˜๊ณ , ๋˜ 1๊ฐœ๋งŒ ์ข…๋ฃŒ๋˜์–ด ๋‹ค๋ฅธ ๋…ธ๋“œ์— ์ƒ์„ฑ๋˜๊ณ , ...(๋ฐ˜๋ณต)๋ฅผ ์ˆ˜ํ–‰ํ•  ๊ฒƒ์ด๋‹ค. ๋น„์Šทํ•˜๊ฒŒ minAvailable์€ ํŒŒ๋“œ๊ฐ€ ํ‡ด๊ฑฐ๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ ํ‡ด๊ฑฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๋…ธ๋“œ์—์„œ ์ตœ์†Œ ๋ช‡ ๊ฐœ์˜ ํŒŒ๋“œ๊ฐ€ ์ •์ƒ ์ƒํƒœ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ์ด ๋‘ ํ‚ค์›Œ๋“œ๋Š” ๋งฅ๋ฝ์ƒ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์„ ํ•˜๋ฏ€๋กœ, ๋ฐ˜๋“œ์‹œ ๋‘๊ฐœ ์ค‘ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉํ•ด ๋งค๋‹ˆํŽ˜์ŠคํŠธ์— ๋ช…์‹œํ•ด์•ผ ํ•œ๋‹ค.

 

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

 

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: zedd-nginx-replicaset
spec:
  replicas: 3
  selector:
    matchLabels:
      app: zedd-nginx-pods-label  # ์—ฌ๊ธฐ๋Š” ๋””ํ”Œ๋กœ์ด๋จผํŠธ ๋ ˆ๋ฒจ์˜ ๋ ˆ์ด๋ธ”
  template:
    metadata:
      name: zedd-nginx-pod
      labels:
        app: zedd-nginx-pods-label # ์—ฌ๊ธฐ๋Š” ํŒŒ๋“œ ํ…œํ”Œ๋ฆฟ ๋ ˆ๋ฒจ์˜ ๋ ˆ์ด๋ธ” => PDB ๋ ˆ์ด๋ธ”์€ ์—ฌ๊ธฐ์—!
    spec:
      containers:
      - name: nginx
        image: nginx:latest
        ports:
        - containerPort: 80

 

์ฐธ๊ณ ๋กœ PDB๋Š” ํ‡ด๊ฑฐํ•  ๋•Œ๋งŒ ์ ์šฉ๋˜๋Š” ๊ธฐ๋Šฅ์ด๋ฏ€๋กœ, ๋งŒ์•ฝ ์ง์ ‘์ ์œผ๋กœ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œ, ์˜ˆ๋ฅผ ๋“ค์–ด, kubectl delete pod ์™€ ๊ฐ™์€ ๋ช…๋ น์–ด๋ฅผ ์ˆ˜ํ–‰ํ•ด์„œ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๋ฉด PDB๋Š” ์ ์šฉ๋˜์ง€ ์•Š๋Š”๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋Ÿฌํ•œ ํŒŒ๋“œ ์‚ญ์ œ ๋ช…๋ น์–ด๋Š” ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ๋“œ๋ฅผ ์‚ญ์ œํ•˜๊ณ  ๋์ด๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋ฐ˜์‘ํ˜•