[Kubernetes] ์ฟ ๋ฒ๋คํฐ์ค์ ํ๋ ์ค์ผ์ฅด๋ง
๐ ํด๋น ํฌ์คํ
์ ์์ํ์ธ์! ๋์ปค/์ฟ ๋ฒ๋คํฐ์ค ์์ ์ ์ฝ๊ณ ๊ฐ์ธ์ ์ธ ๋ชฉ์ ํ์ ์์ฑ๋๋ ๊ธ์
๋๋ค. ํฌ์คํ
์ ์ฌ์ฉ๋๋ ๋ชจ๋ ์๋ฃ๋ ์ ๊ฐ ์ง์ ์ฌ๊ตฌ์ฑํ์์์ ์๋ฆฝ๋๋ค.
์ ๋ฒ ํฌ์คํ
์์๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ํ๋๋ ์ปจํ
์ด๋์ ๊ฐ์ ๋ฆฌ์์ค ์์ฒด๋ฅผ ์ผ๋ง๋ ์์ฐจ๊ฒ ํ์ฉํ ์ ์๋์ง์ ๋ํด์ ๋ฐฐ์ ๋ค. ์ด๋ฒ ํฌ์คํ
์์๋ ํ๋๋ ์ปจํ
์ด๋์ ๊ฐ์ ์ธ์คํด์ค๋ฅผ ์์ฑํ ๋, ๊ทธ ์ธ์คํด์ค๋ฅผ ์ด๋ค ์๋ฒ ์ฆ, ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ด๋ค ๋
ธ๋์ ์์ฑํ ๊ฒ์ธ์ง๋ฅผ ๊ฒฐ์ ํ๋ ์ฟ ๋ฒ๋คํฐ์ค์ ์ค์ผ์ฅด๋ง์ ๋ํด์ ๋ฐฐ์๋ณด๋ ค๊ณ ํ๋ค.
๊ฐ๋จํ ์์๋ก, ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์
์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ฐฐํฌํ๋ ค๊ณ ํ๋๋ฐ, ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ๋ฐ์ด ๋๋ (๋์ปค)์ด๋ฏธ์ง๊ฐ amd64 OS ํ๋ซํผ๋ง ์ง์์ด ๋๋ค๋ฉด ํด๋น ์ ํ๋ฆฌ์ผ์ด์
์ amd64 OS ํ๋ซํผ์ผ๋ก ๊ตฌ์ฑ๋์ด ์๋ ๋
ธ๋์ ์์ฑ๋์ด์ผ ํ๋ค. ๋ํ ๊ณ ๊ฐ์ฉ์ฑ(HA, High Availability) ์ฆ, ์๋น์ค ๋ฌด์ค๋จ์ ์ํด ์ด๋ค ์ ํ๋ฆฌ์ผ์ด์
์ ํ๋๋ ์ปจํ
์ด๋๋ฅผ ์ฟ ๋ฒ๋คํฐ์ค์ ๋ชจ๋ ๋
ธ๋์ ๊ณ ๋ฅด๊ฒ ๋ถํฌ์์ผ์ผํ ์๋ ์๋ค. ์ด๋ ๊ฒ ํน์ ๋ชฉ์ ์ ๋ฐ๋ผ ์ด๋ค ์ฑ๊ฒฉ์ ํ๋ ๋๋ ์ปจํ
์ด๋๊ฐ ํน์ ์์ปค ๋
ธ๋์ ์์ฑ๋๋๋ก ํ๋ ๊ฒ์ ๋ฐ๋ก ์ค์ผ์ฅด๋ง์ด๋ผ๊ณ ํ๋ค.
์ฟ ๋ฒ๋คํฐ์ค์์๋ ๋ค์ํ ์ค์ผ์ฅด๋ง ๋ฐฉ๋ฒ์ ์ ๊ณตํ๊ณ ์์ผ๋ฉฐ, ์ฌ์ง์ด ๋ ๋ณต์กํ ์ค์ผ์ฅด๋ง ๋ฐฉ๋ฒ์ ์ปค์คํ
ํ๊ฒ ๊ตฌํํ ์๋ ์๋ค. ์ด๋ฒ ํฌ์คํ
์์๋ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ํ๋๋ฅผ ํ ๋นํ๋ ์์ปค ๋
ธ๋๋ฅผ ์ ํํ๋ ์ค์ผ์ฅด๋ง ๊ณผ์ ์ ๋ํด ๊ฐ๋ตํ ์์๋ณด๊ณ , ์ ํํ ์ ์๋ ์ค์ผ์ฅด๋ง ์ ๋ต์ด ๋ฌด์์ด ์๋์ง์ ๋ํด ์์๋ณด๋๋ก ํ์.
1. ํ๋๋ฅผ ์ค์ผ์ฅด๋งํ๋ ์ฃผ์ฒด: kube-scheduler
์ ๋ฒ ํฌ์คํ
์ ๋ง์ง๋ง ๋ชฉ์ฐจ์์ ResourceQuota ์ LimitRange ๋ฆฌ์์ค ์ค๋ธ์ ํธ์ ๋ํด ๋ฐฐ์ฐ๋ฉด์ ํด๋น ์ค๋ธ์ ํธ๋ค์ด ์ด๋๋ฏธ์
์ปจํธ๋กค๋ฌ์ ์ข
๋ฅ๋ผ๋ ๊ฒ์ ๋ํด ๋ฐฐ์ ์๋ค. ๊ทธ ๋ ์๊ฐํ ๊ทธ๋ฆผ์ ๋ค์ ๋ณด์. ๋ง์ฝ ๊ฐ๋ฐ์๊ฐ kubectl ์ด๋ผ๋ ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํด์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ก ์์ฒญ์ ๋ณด๋ด๋ฉด ํฌ๊ฒ ์๋์ ์์๋ก ์งํ๋๋ค๊ณ ํ๋ค.
๊ฐ๋ฐ์๊ฐ kubectl ๋ช
๋ น์ด๋ก ์
๋ ฅํ ์์ฒญ์ด ํ๋์ ์์ญ์ ๋ค์ด๊ฐ๋ ๋ถ๋ถ์ ๋ชจ๋ ๋ฌด์ฌ ํต๊ณผํ๊ณ ๋๋ฉด ๊ทธ ๋ 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๊ฐ ๊ตฌ์ฒด์ ์ผ๋ก ์ด๋ค ๊ณผ์ ์ ํตํด ์์ฑํ ํ๋๋ฅผ ์ด๋ค ์์ปค ๋
ธ๋๋ก ์ ์ ํ๋์ง ์ดํด๋ณด๋๋ก ํ์. ์ฐ์ ์๋ ๊ทธ๋ฆผ์ ๋ณด์.
์ ๊ทธ๋ฆผ์ ๋จ๊ณ๋ฅผ ํ๋์ฉ ์ดํด๋ณด์.
- ๊ฐ๋ฐ์๋ ํ๋๋ฅผ ์์ฑํ๊ธฐ ์ํด kubectl CLI๋ฅผ ์ด์ฉํด ๋ช ๋ น์ด๋ฅผ ์ ๋ ฅํ๊ณ , ์ด ๋ช ๋ น์ด๋ ๋ง์คํฐ ๋ ธ๋์์ ํ๋ ํํ๋ก ์คํ๋๊ณ ์๋ kube-api server๋ก ์์ฒญ์ด ์ ์ก๋๋ค.
- ์์ฒญ์ ๋ด๊ฒจ์๋ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ณ ํ๋๋ฅผ ์์ฑํ๋ ์์ฒญ์ด๋ผ๋ ๊ฒ์ ์ธ์งํ ํ, ์์ฑํ ํ๋์ ๋ํ ์ ๋ณด๊ฐ ๋ด๊ธด ๋ฐ์ดํฐ๋ฅผ etcd์ ์ ์ฅํ๋ค. ๋จ, ์ด ๋๋ ํ๋ ์ ๋ณด์ nodeName ์ฆ, ํด๋น ํ๋๊ฐ ์ด๋ค ๋ ธ๋์์ ์์ฑ๋ ์ง์ ๋ํ ๊ฐ์ด ๋ช ์๋์ง ์์ ์ฑ etcd์ ์ ์ฅ๋๋ค.
- ์์์ ์ผ๋ก kube-api server๊ฐ ๊ณ์ Watch API๋ฅผ ์ด์ฉํด ๋ชจ๋ํฐ๋ง์ ํ๊ณ ์๋ค๊ฐ etcd์ ์ ์ฅ๋ ๋ฐ์ดํฐ ์ค nodeName ๋ฐ์ดํฐ๊ฐ ์๋ ํ๋๊ฐ ์๋ค๋ ๊ฒ์ ๊ฐ์ง
- kube-scheduler๋ 3๋ฒ์์ kube-api server๊ฐ ๊ฐ์งํ ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์
- kube-scheduler๊ฐ ํด๋น ํ๋๋ฅผ ์ด๋ค ๋ ธ๋์ ์์ฑํ ์ง ๊ฒฐ์ (์ด ๋, worker node 1์ผ๋ก ์ ์ ํ๋ค๊ณ ๊ฐ์ )
- ์ ์ ํ ๋ ธ๋์ ํ๋๋ฅผ ์์ฑ(๋ฐ์ธ๋ฉ)ํ ๊ฒ์ kube-api server์ ์์ฒญ
- ๊ฐ ์์ปค ๋ ธ๋์ ๋ถ์ด์๋ kubelet ์์ด์ ํธ๋ค์ด kube-api server์ Watch API๋ฅผ ์ด์ฉํด์ ๊ณ์ ๊ฐ์ง ์ค์ด๋ค๊ฐ nodeName์ ๋ช ์๋ worker node 1 ๊ฐ์ ๋ณด๊ณ worker node 1์ ๋ถ์ด์๋ kubelet์ด ์ค์ง์ ์ผ๋ก ํ๋๋ฅผ ์์ฑํ๊ธฐ ์์
- ํ๋ ์์ฑ ์๋ฃ ํ ๊ฐ๋ฐ์์๊ฒ ํ๋ ์ ์ ์์ฑ๋์๋ค๊ณ ์๋ต
ํ๋๊ฐ ์์ฑ๋๋ ๊ณผ์ ์ ํฌ๊ฒ ์์ ๊ฐ๋ค. ์ฐ๋ฆฌ๋ ์ด์ ์ ๋จ๊ณ์์ 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๋ ์ ์ฉ๋์ง ์๋๋ค. ์๋ํ๋ฉด ์ด๋ฌํ ํ๋ ์ญ์ ๋ช ๋ น์ด๋ ๋ง ๊ทธ๋๋ก ํ๋๋ฅผ ์ญ์ ํ๊ณ ๋์ด๊ธฐ ๋๋ฌธ์ด๋ค.