๐ก ๋ณธ ๋ฌธ์๋ '์ฟ ๋ฒ๋คํฐ์ค ์ ๋ฌธ: Part II. ์ฟ ๋ฒ๋คํฐ์ค ๊ธฐ๋ณธ ๊ฐ๋ '์ ๋ํด ์ ๋ฆฌํด๋์ ๊ธ์ ๋๋ค.
'์ฟ ๋ฒ๋คํฐ์ค ์ ๋ฌธ'์ด๋ผ๋ Kubernetest์ ๊ฐ๋ ๋ฐ ์ค์ต์ ๋ค๋ฃฌ ์ฑ ์ ์ฝ์ผ๋ฉฐ ๊ด๋ จ ํต์ฌ ๋ด์ฉ์ ์ ๋ฆฌํ์์ต๋๋ค. ๋ณธ ๋ฌธ์์ ๊ฒฝ์ฐ '์ฟ ๋ฒ๋คํฐ์ค ์ ๋ฌธ: Part II. ์ฟ ๋ฒ๋คํฐ์ค ๊ธฐ๋ณธ ๊ฐ๋ '์ ๋ด์ฉ์ธ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฒ์ ์ ํ๋ ์ฌ๋์ด ๊ผญ ์์์ผ ํ ๋ด์ฉ์ ๋ํด ๋ค๋ฃจ์์ผ๋ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค. ์ถ๊ฐ๋ก, ํด๋น ์ฑ ์ ์ํ ์์ ๋ [github] kubernetes-book-sample์์ ๋ค์ด ๋ฐ์ kubectl apply -f <filename>.yaml ๋ช ๋ น์ ํตํด ์ค์ตํ ์ ์์ผ๋ ์ฐธ๊ณ ํ์๊ธฐ ๋ฐ๋๋๋ค.
1. ์ฟ ๋ฒ๋คํฐ์ค ์ํคํ ์ฒ
1.1 ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ์ ์ฒด ๊ตฌ์กฐ
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ ํฌ๊ฒ ๋ ์ข ๋ฅ์ ์๋ฒ๋ก ๊ตฌ์ฑํฉ๋๋ค. ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ง์คํฐ(Control Plane, cp)์ ์ค์ ์ปจํ ์ด๋๋ฅผ ์คํ์ํค๋ ๋ ธ๋(Worker Node)์ ๋๋ค.
๋ง์คํฐ์๋ etcd, kube-apiserver, kube-schduler, kube-controller-manager, kubelet, kube-proxy, docker ๋ฑ์ ์ปดํฌ๋ํธ๊ฐ ์คํ๋ฉ๋๋ค. ์ปดํฌ๋ํธ ๊ฐ๊ฐ์ด ๋ค๋ฅธ ๋ง์คํฐ๋ ๋ ธ๋ ์๋ฒ์์ ๋ณ๊ฐ๋ก ์คํ๋์ด๋ ์ค์ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ์ด์ํ๋ ๋ฐ ์ด์์ ์์ผ๋, ๋ง์คํฐ๊ฐ ์๋ฒ 1๋๋ผ๋ฉด ํ๋ก์ธ์ค ํ ๋ฌถ์์ผ๋ก ํด๋น ์๋ฒ์์ ๊ฐ์ด ์คํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ธ ๊ตฌ์ฑ์ ๋๋ค(๋ณดํต ๊ณ ๊ฐ์ฉ์ฑ์ ์ํด 3๋๋ฅผ ๊ตฌ์ฑํด์ ์ด์ํฉ๋๋ค.). ๋ ธ๋(์ด๊ธฐ์ ๋ฏธ๋์ธ์ด๋ผ๊ณ ๋ ํจ)์๋ kubelet, kube-proxy, docker ๋ฑ์ ์ปดํฌ๋ํธ๊ฐ ์คํ๋ฉ๋๋ค.
- ๊ฐ ์ปดํฌ๋ํธ์ ์ค์ฌ์๋ kube-apiserver๊ฐ ์์ผ๋ฉฐ, ๋ชจ๋ ํต์ ์ ์ค์ฌ์ผ๋ก kube-apiserver๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ์ปดํฌ๋ํธ๊ฐ ์๋ก ํ์ํ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ์ต๋๋ค. ํนํ ๋ณ๋์ ํ๋ก์ธ์ค์ธ etcd์๋ kube-apiserver๋ง ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ง์คํฐ ๋ด๋ถ etcd๋ ์ปจํ ์ด๋๋ก ๊ด๋ฆฌํ ์๋ ์์ง๋ง, ์๋ฒ ํ๋ก์ธ์ค๋ก ์คํํ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
- kubelet์ด ๋ง์คํฐ์ ์๋ ๋์ปค๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๋์ปค ๋ด๋ถ์๋ ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ฆฌ์ฉ ์ปดํฌ๋ํธ kube-scheduler, kube-controller-manager, kube-apiserver, kube-proxy๊ฐ ์์ต๋๋ค. ๊ด๋ฆฌ์ฉ ์ปดํฌ๋ํธ๋ ๋ชจ๋ hyperkube๋ผ๋ ๋ฐ์ด๋๋ฆฌ ํ์ผ๋ก ์ปดํ์ผ ๋์๊ณ ์คํํ ๋ ์ต์ ์ ์ค์ ํด ๊ฐ ์ปดํฌ๋ํธ์ ์ญํ ์ ์ํํฉ๋๋ค.
- ๋
ธ๋ ์ญ์ kubelet์ผ๋ก ๋์ปค๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. kubelet์ ๋ง์คํฐ์ kube-apiserver์ ํต์ ํ๋ฉด์ ํ๋์ ์์ฑ, ๊ด๋ฆฌ, ์ญ์ ๋ฅผ ๋ด๋นํฉ๋๋ค.
- ๋ ธ๋ ๋ด๋ถ kube-proxy๋ ์ปจํ ์ด๋๋ก ๊ด๋ฆฌํ ์๋ ์์ง๋ง, ์๋ฒ ํ๋ก์ธ์ค๋ก ์คํํ๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
1.2 ์ฟ ๋ฒ๋คํฐ์ค์ ์ฃผ์ ์ปดํฌ๋ํธ
์ฟ ๋ฒ๋คํฐ์ค์ ์ปดํฌ๋ํธ๋ ์ธ ๊ฐ์ง๋ก ๊ตฌ๋ถํฉ๋๋ค. ํด๋ฌ์คํฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์์ธ ๋ง์คํฐ์ฉ ์ปดํฌ๋ํธ, ๋ ธ๋์ฉ ์ปดํฌ๋ํธ, ํ์๋ ์๋์ง๋ง ์ถ๊ฐ๋ก ์ฌ์ฉํ ์ ์๋ ์ ๋์จ์ฉ ์ปดํฌ๋ํธ์ ๋๋ค.
1.2.1 ๋ง์คํฐ์ฉ ์ปดํฌ๋ํธ
etcd
- ์ฝ์ด OS์์ raft ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ๊ฐ๋ฐํ ๊ณ ๊ฐ์ฉ์ฑ์ ์ ๊ณตํ๋ 'key-value ์ ์ฅ์'
- raft ์๊ณ ๋ฆฌ์ฆ: ๋ ธ๋ ์ฌ์ด์ ์ํ ๊ณต์ ํ๋ ํฉ์ ์๊ณ ๋ฆฌ์ฆ
- ์๋ฒ ํ๋๋น ํ๋ก์ธ์ค 1๊ฐ๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ๋ณดํต etcd ์์ฒด๋ฅผ ํด๋ฌ์คํฐ๋ง ํ ํ ์ฌ๋ฌ ๊ฐ ๋ง์คํฐ ์๋ฒ์ ๋ถ์ฐํด์ ์คํํด ๋ฐ์ดํฐ์ ์์ ์ฑ์ ๋ณด์ฅํจ
- ํด๋ฌ์คํฐ๋ง: ์ฌ๋ฌ ๋ ์ปดํจํฐ๋ฅผ ์ฐ๊ฒฐํด ์์คํ ํ๋์ฒ๋ผ ๊ตฌ์ฑ
- etcd ์์ฒด๋ ๊ฝค ์์ ์ ์ด์ง๋ง, ๋ ์์ ์ ์ผ๋ก ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ด์ํ๋ ค๋ฉด ์ฃผ๊ธฐ์ ์ผ๋ก etcd์ ์๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐฑ์ ํ ๊ฒ์ ๊ถ์ฅ
kube-apiserver
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ API๋ฅผ ์ฌ์ฉํ ์ ์๋๋ก ํด์ฃผ๋ ์ปดํฌ๋ํธ
- Kube-api๋ฅผ ํตํด ํน์ ์์์ ์กฐํ ๋ช ๋ น์ ๋ฐ์ผ๋ฉด, ์์ฒญ์ด ์ ํจํ๊ณ ์คํํ ๊ถํ์ด ์๋์ง ๊ฒ์ฌํ ํ ํด๋น ์์ ์ ์ํํ์ฌ ์ ๋ฌํ๋ ์ญํ
- ์ฟ ๋ฒ๋คํฐ์ค๋ Micro Service Architecture(MSA)์ด๋ฏ๋ก, ์ปดํฌ๋ํธ๋ค์ด ์๋ก ๋ถ๋ฆฌ๋์ด ์์ผ๋ฉฐ ๋ชจ๋ ์์ฒญ์ kube-apiserver๋ฅผ ํตํด ์ ๋ฌ๋จ
kube-scheduler
- ์๋กญ๊ฒ ์คํํ 'ํ๋'์ ์กฐ๊ฑด์ ์๋ง๋ ๋ ธ๋๋ฅผ ํ์ํ๊ณ , ํ๋๋ฅผ ํ ๋นํ๋ ์ญํ ์ ์ํ
- pod์ ์กฐ๊ฑด: ํ๋์จ์ด ์๊ตฌ์ฌํญ, affinity์ anti-affinity ๋ง์กฑ ์ฌ๋ถ, ํน์ ๋ฐ์ดํฐ๊ฐ ์๋ ๋
ธ๋์ ํ ๋น ๋ฑ
- affinity: ํจ๊ป ์์ด์ผ ํ๋ ํ๋๋ค์ ๊ฐ์ ๋ ธ๋์ ์คํ
- anti-affinity: ํ๋๋ฅผ ๋ค์ํ ๋ ธ๋๋ก ๋ถ์ฐํด์ ์คํ
kube-controller-manager
- ์ฟ ๋ฒ๋คํฐ์ค์์ ํ๋๋ค์ ๊ด๋ฆฌํ๋ '์ปจํธ๋กค๋ฌ(controller)' ํ๋ก์ธ์ค๋ฅผ ์คํํ๋ ์ปดํฌ๋ํธ
- ์ปจํธ๋กค๋ฌ ๊ฐ๊ฐ์ ๋ ผ๋ฆฌ์ ์ผ๋ก ๊ฐ๋ณ ํ๋ก์ธ์ค์ง๋ง ๋ณต์ก๋๋ฅผ ์ค์ด๋ ค๊ณ ๋ชจ๋ ์ปจํธ๋กค๋ฌ๋ฅผ ๋ฐ์ด๋๋ฆฌ ํ์ผ ํ๋๋ก ์ปดํ์ผํด ๋จ์ผ ํ๋ก์ธ์ค๋ก ์คํ
cloud-controller-manager
- ์ฟ ๋ฒ๋คํฐ์ค์ '์ปจํธ๋กค๋ฌ'๋ค์ ํด๋ผ์ฐ๋ ์๋น์ค์ ์ฐ๊ฒฐํ์ฌ ๊ด๋ฆฌํ๋ ์ปดํฌ๋ํธ
- ๋ณดํต ๋ค ๊ฐ์ง ์ปจํธ๋กค๋ฌ ์ปดํฌ๋ํธ๋ฅผ ๊ด๋ฆฌํจ
- ๋ ธ๋ ์ปจํธ๋กค๋ฌ: ํด๋ฌ์ฐ๋ ์๋น์ค ์์์ ๋ ธ๋๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ
- ๋ผ์ฐํธ ์ปจํธ๋กค๋ฌ: ๊ฐ ํด๋ผ์ฐ๋ ์๋น์ค ์์ ๋คํธ์ํฌ ๋ผ์ฐํ ์ ๊ด๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ
- ์๋น์ค ์ปจํธ๋กค๋ฌ: ๊ฐ ํด๋ผ์ฐ๋ ์๋น์ค์์ ์ ๊ณตํ๋ ๋ก๋๋ฐธ๋ฐ์๋ฅผ ์์ฑ, ๊ฐฑ์ , ์ญ์ ํ๋ ๋ฐ ์ฌ์ฉ
- ๋ณผ๋ฅจ ์ปจํธ๋กค๋ฌ: ํด๋ผ์ฐ๋ ์๋น์ค์์ ์์ฑํ ๋ณผ๋ฅจ์ ๋ ธ๋์ ์ฐ๊ฒฐํ๊ฑฐ๋ ๋ง์ดํธ ํ๋ ๋ฑ์ ์ฌ์ฉ
1.2.2 ๋ ธ๋์ฉ ์ปดํฌ๋ํธ
kubelet
- ๋ง์คํฐ์ kube-apiserver์ ํต์ ํ๋ฉฐ pod container์ ์คํ์ ๊ด๋ฆฌ
- ๋จ, ํ๋ ๋ด์์๋ ์ฟ ๋ฒ๋คํฐ์ค์ ์ํด ๋ง๋ค์ด์ง์ง ์์ ์ปจํ ์ด๋๋ค์ ๊ด๋ฆฌํ์ง ์์
- PodSpecs ์กฐ๊ฑด์ด ๋ด๊ธด ์ค์ ์ ์ ๋ฌ๋ฐ์์ ์ปจํ ์ด๋๋ฅผ ์คํํ๊ณ ๊ด๋ฆฌํจ
kube-proxy
- ์ฟ ๋ฒ๋คํฐ์ค๋ ํด๋ฌ์คํฐ ๋ด๋ถ์ ๋ณ๋ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ์ค์ ํ๊ณ ๊ด๋ฆฌํ๋๋ฐ, ์ด๋ฌํ ๊ฐ์ ๋คํธ์ํฌ์ ๋์์ ๊ด๋ฆฌํ๊ธฐ ์ํ ์ปดํฌ๋ํธ
์ปจํ ์ด๋ ๋ฐํ์(e.g. Docker)
- ์ค์ ๋ก ์ปจํ ์ด๋๋ฅผ ์คํ์ํค๋ฉฐ, ๊ฐ์ฅ ๋ง์ด ์๋ ค์ง ๋ฐํ์์ Docker๊ฐ ์์(continerd, runc ๊ฐ์ ๋ฐํ์๋ ์ง์)
1.2.3 ์ ๋์จ์ฉ ์ปดํฌ๋ํธ
ํด๋ฌ์คํฐ ์์์ ํ์ํ ๊ธฐ๋ฅ์ ์คํํ๋ ํ๋๋ก, ๋ค์์คํ์ด์ค๋ kube-system์ ๋๋ค. ์ ๋์จ์ผ๋ก ์ฌ์ฉํ๋ ํ๋๋ค์ ๋ํ๋ก์ด๋จผํธ, ๋ฆฌํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ ๋ฑ์ผ๋ก ๊ด๋ฆฌํฉ๋๋ค.
๋คํธ์ํฌ ์ ๋์จ
- ์ฟ ๋ฒ๋คํฐ์ค๋ ํด๋ฌ์คํฐ ์์ ๊ฐ์ ๋คํธ์ํฌ๋ฅผ ๊ตฌ์ฑํด ์ฌ์ฉํ ๋ kube-proxy ์ด์ธ์ ๋คํธ์ํน ์๋์จ์ ์ฌ์ฉํจ
- AWS, Azure ๋ฑ ํด๋ผ์ฐ๋ ์๋น์ค์์ ์ ๊ณตํ๋ ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋ณ๋๋ก ๊ตฌ์ฑํ ํ์๋ ์์ผ๋ ์ง์ ์๋ฒ์ ๊ตฌ์ฑํ๋ค๋ฉด ์ค์นํด์ ์ฌ์ฉํด์ผ ํจ
DNS ์ ๋์จ
- ํด๋ฌ์คํฐ ์์์ ๋์ํ๋ DNS ์๋ฒ๋ก, ์ฟ ๋ฒ๋คํฐ์ค ์๋น์ค์ DNS ๋ ์ฝ๋๋ฅผ ์ ๊ณตํจ
- ์ฟ ๋ฒ๋คํฐ์ค ์์ ์คํ๋ ์ปจํ ์ด๋๋ค์ ์๋์ผ๋ก DNS ์๋ฒ์ ๋ฑ๋ก๋จ
- ์ฃผ๋ก ์ฌ์ฉํ๋ DNS ์ ๋์จ: kube-dns, CoreDNS
๋์๋ณด๋ ์ ๋์จ(์น UI)
- kubectl ์ด๋ผ๋ CLI ์ธ์ ์น UI ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฌ์ฉ์ ์ํ ๊ฒฝ์ฐ ๋์๋ณด๋ ์ ๋์จ์ ์ฌ์ฉํจ.
- ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๋ฅผ ์ํ ๋ฒ์ฉ ์น ๊ธฐ๋ฐ UI๋ฅผ ์ ๊ณต
์ปจํ ์ด๋ ์์(๋ฆฌ์์ค) ๋ชจ๋ํฐ๋ง
- ์ปจํ ์ด๋ ์์ ๋ชจ๋ํฐ๋ง ์ ํด๋ฌ์คํฐ ์์์ ์คํ์ค์ธ ์ปจํ ์ด๋์ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ์ ๋์จ
- CPU, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๊ฐ์ ๋ฐ์ดํฐ๋ค์ ์๊ณ์ด ํ์์ผ๋ก ๊ธฐ๋กํ๋ฉฐ, kubelet ์์ ํฌํจ๋ cAdvisor๋ผ๋ ์ปจํ ์ด๋ ๋ชจ๋ํฐ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ ์ ์์
ํด๋ฌ์คํฐ ๋ก๊น
- ํด๋ฌ์คํฐ ์ ๊ฐ๋ณ ์ปจํ ์ด๋์ ๋ก๊ทธ์ ์ฟ ๋ฒ๋คํฐ์ค ๊ตฌ์ฑ ์์์ ๋ก๊ทธ๋ค์ ์์งํ๋ ํ๋๋ฅผ ์คํํด์ ์ค์ํํ ๋ก๊ทธ ์์ง ์์คํ ์ ๋ชจ์์ ๋ณด๋ ์ ๋์จ
- ๋ก๊ทธ ์์งํด์ ๋ณด์ฌ์ค ๋๋ ElasticSearch Logstash Kibana(ELK), ElasticSearch Fluentd Kibans(EFK)๋ฅผ ๋ง์ด ์ฌ์ฉํจ
1.3 ์ค๋ธ์ ํธ์ ์ปจํธ๋กค๋ฌ
์ฟ ๋ฒ๋คํฐ์ค๋ ํฌ๊ฒ ์ฌ์ฉ์๊ฐ ์ ์ํ desired state๋ฅผ ์ ์งํ๊ณ ์์ ์ ์ํํ๋ '์ค๋ธ์ ํธ'์ ์ค๋ธ์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ '์ปจํธ๋กค๋ฌ'๋ก ๋๋๋๋ค.
- ์ค๋ธ์ ํธ: pod, service, volume, namespace ๋ฑ
- ์ปจํธ๋กค๋ฌ: ReplicaSet, Deployment, StatefulSet, DaemonSet, Job ๋ฑ
์ค๋ธ์ ํธ, ์ปจํธ๋กค๋ฌ๋ ๋ค์ ์ณ ํฐ์์ ์ค๋ช ํ ์์ ์ด๋ฉฐ, ์ฌ๊ธฐ์๋ ํด๋ฌ์คํฐ๋ฅผ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋๋๋ '๋ค์์คํ์ด์ค'์ ์ค๋ธ์ ํธ ๋ฐ ์ปจํธ๋กค๋ฌ๊ฐ ์ด๋ค ์ํ์ฌ์ผ ํ๋์ง ์ค์ ํ๋ 'ํ ํ๋ฆฟ'์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
1.3.1 ๋ค์์คํ์ด์ค
๋ค์์คํ์ด์ค๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ํ๋๋ฅผ ์ฌ๋ฌ ๊ฐ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋๋ ์ ์ฌ์ฉํ๋๋ก ๋์์ฃผ๋ฉฐ, ์ด๋ก ์ธํด ์ฌ๋ฌ ์ฌ์ฉ์๊ฐ ํ๋์ ํด๋ฌ์คํฐ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๋ํ ๋ค์์คํ์ด์ค ๋ณ๋ก ๋ณ๋์ ์ฟผํฐ๋ฅผ ์ค์ ํด์ ํน์ ๋ค์์คํ์ด์ค์ ์ฌ์ฉ๋์ ์ ํํ ์ ์์ต๋๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฒ์ ์ค์นํ๋ฉด ๊ธฐ๋ณธ์ผ๋ก ๋ช ๊ฐ์ ๋ค์์คํ์ด์ค๊ฐ ์์ฑ๋๋ฉฐ, 'kubectl get namespaces' ๋ช ๋ น์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
% kubectl get namespace
NAME STATUS AGE
default Active 36d
kube-node-lease Active 36d
kube-public Active 36d
kube-system Active 36d
- default: ๊ธฐ๋ณธ ๋ค์ด์คํ์ด์ค์ด๋ฉฐ, ์ฟ ๋ฒ๋คํฐ์ค์์ ๋ช ๋ น์ ์คํํ ๋ ๋ณ๋์ ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํ์ง ์๋๋ค๋ฉด ํญ์ default ๋ค์์คํ์ด์ค์ ๋ช ๋ น์ ์ ์ฉํฉ๋๋ค.
- kube-system: ์ฟ ๋ฒ๋คํฐ์ค ์์คํ ์์ ๊ด๋ฆฌํ๋ ๋ค์์คํ์ด์ค์ด๋ฉฐ, ์ด ๋ค์์คํ์ด์ค์๋ ์ฟ ๋ฒ๋คํฐ์ค ๊ด๋ฆฌ์ฉ ํ๋๋ ์ค์ ์ด ์์ต๋๋ค.
- kube-public: ํด๋ฌ์คํฐ ์ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ฝ์ ์ ์๋ ๋ค์์คํ์ด์ค ์ ๋๋ค. ๋ณดํต ํด๋ฌ์คํฐ ์ฌ์ฉ๋ ๊ฐ์ ์ ๋ณด๋ฅผ ์ด ๋ค์์คํ์ด์ค์์ ๊ด๋ฆฌํฉ๋๋ค.
- kube-node-lease: ๊ฐ ๋ ธ๋์ lease object ๋ค์ ๊ด๋ฆฌํ๋ ๋ค์์คํ์ด์ค ์ด๋ฉฐ, ์ฟ ๋ฒ๋คํฐ์ค 1.13 ์ดํ ์ํ๋ก ์ถ๊ฐ๋์์ต๋๋ค.
kubectl๋ก ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํด์ ์ฌ์ฉํ ๋๋ --namespace=kube-system ์ฒ๋ผ ๋ค์์คํ์ด์ค๋ฅผ ์ง์ ํด์ผํ๋ฉฐ, ์ง์ ํ์ง ์์ผ๋ฉด default๋ก ์ค์ ๋ฉ๋๋ค.
์ถ๊ฐ๋ก ์ผ์ผ์ด ์ง์ ํ์ง ์๊ณ ๊ธฐ๋ณธ ๋ค์์คํ์ด์ค๋ฅผ ๋ฐ๊พธ๋ ๋ฐฉ๋ฒ์ ๋๊ฐ์ง๊ฐ ์์ต๋๋ค. kubectl๋ก ์ ๊ณตํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
% kubectl config set-context {์ปจํ
์คํธ ์ด๋ฆ} --namespace={๋ณ๊ฒฝํ ๋ค์์คํ์ด์ค}
๊ทธ๋ฆฌ๊ณ kubctx ๋ผ๋ ํจํค์ง๋ฅผ ์ค์นํ๋ฉด, kubens ๋ผ๋ ๋ช ๋ น์ด๋ฅผ ํตํด ์ฝ๊ฒ ๊ธฐ๋ณธ namespace ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค๊ณ ํฉ๋๋ค.
% brew install kubectx
% kubeens {namespace name}
1.3.2 ํ ํ๋ฆฟ
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ '์ค๋ธ์ ํธ'๋ '์ปจํธ๋กค๋ฌ'๊ฐ ์ด๋ค ์ํ์ฌ์ผ ํ๋์ง(desired state)๋ฅผ ์ ์ฉํ ๋๋ YAML ํ์์ ํ ํ๋ฆฟ์ ์ด์ฉํฉ๋๋ค.
YAML์์ ์ฌ์ฉํ๋ data type์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
Scalars (strings/number) |
Sequence (arrays/lists) |
Mappings (hashes/dictionaries) |
Name: choi Birth: 2000 |
ProgrammingSkills: - C++ - Python |
Data: Height: 173 Weight: 73 |
ํ ํ๋ฆฟ์ ๊ธฐ๋ณธ ํ์์ ๋ค์๊ณผ ๊ฐ์ผ๋ฉฐ, ๊ณต์ ๋ฌธ์๋ฅผ ์ฐธ์กฐํ๋ฉด YAML์์ ์ฌ์ฉํ๋ field์ ๋ํด ์์ธํ ์ ์ ์์ต๋๋ค.
apiVersion: v1
kind: Pod
metadata:
spec:
- apiVersion: ์ฌ์ฉํ๋ ค๋ ์ฟ ๋ฒ๋คํฐ์ค API ๋ฒ์ ์ ๋ช ์ํฉ๋๋ค. kubectl api-versions ๋ช ๋ น์ ํตํด ํ์ฌ ํด๋ฌ์คํฐ์์ ์ฌ์ฉ๊ฐ๋ฅํ API ๋ฒ์ ์ ํ์ธํ ์ ์์ต๋๋ค.
- kind: ์ด๋ค ์ข ๋ฅ์ ์ค๋ธ์ ํธ ํน์ ์ปจํธ๋กค๋ฌ์ ์์ ์ธ์ง ๋ช ์ํฉ๋๋ค. pod์ด๋ผ ๋ช ์ํ๋ฉด ํ๋์ ๊ดํ ํ ํ๋ฆฟ์ ๋๋ค.
2. ํ๋
2.1. ํ๋ ๊ฐ๋
k8s๋ ํ๋๋ผ๋ ์ต์ ๋จ์๋ก ์ปจํ ์ด๋๋ฅผ '๋ฌถ์ด' ๊ด๋ฆฌํ๋ฉฐ, ํ๋๋ ์ปจํ ์ด๋ ์ฌ๋ฌ๊ฐ๋ก ๊ตฌ์ฑ๋ฉ๋๋ค. ์ปจํ ์ด๋ ์ฌ๋ฌ๊ฐ๋ฅผ ํ๊บผ๋ฒ์ ๊ด๋ฆฌํ ๋๋ ์ปจํ ์ด๋๋ง๋ค ์ญํ ๋ถ์ฌํ ์ ์์ผ๋ฉฐ, ๋๊ฒ ํ๋์ ์ปจํ ์ด๋์๋ ํ๋์ ์ญํ ์ ๋ถ์ฌํฉ๋๋ค(e.g. ๋ก๊ทธ, ๋ณผ๋ฅจ ๋ฑ).
ํ ํ๋ ์์ ์๋ ์ปจํ ์ด๋๋ ๊ฐ์ IP ํ๋๋ฅผ ๊ณต์ ํ๋ฉฐ, ์ธ๋ถ์์ ์ด ํ๋์ ์ ๊ทผํ๋ค๋ฉด? ์ ํด์ง ํ๋์ IP๋ก ์ ๊ทผํ์ฌ ์ปจํ ์ด๋๋ง๋ค ๋ถ์ฌ๋ ํฌํธ๋ฅผ ํตํด ์ปจํ ์ด๋์ ํต์ ํฉ๋๋ค.
2.2. ํ๋ ์ฌ์ฉํ๊ธฐ
๊ต์ฌ์ ํ๋์ ํฌํ๋ฆฟ ์ค์ ์์์ธ pod/pod-sample.yaml ํ์ผ์ ์ดํด๋ด ์๋ค.
apiVersion: v1
kind: Pod
metadata:
name: kubernetes-simple-pod
labels:
app: kubernetes-simple-pod
spec:
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
ports:
- containerPort: 8080
- .metadata.name : ํ๋ ์ด๋ฆ ์ค์ .
- .metatdata.labels.app : ์ค๋ธ์ ํธ ์๋ณ ๋ ์ด๋ธ ์ค์ .
- .spec.containers[].name : ์ปจํ ์ด๋ ์ด๋ฆ ์ค์ . name ์์ '-' ํ์๋ ๋ฐฐ์ด์ ์๋ฏธํจ. .spec.containers์ ํ์ ํ๋๋ฅผ ๋ฐฐ์ดํํ๋ก ๋ฌถ๊ฒ ๋ค๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ด๋ ๋๊ฒ .spec.containers[] ๋ผ๊ณ ํ๊ธฐํจ.
- .spec.containers[].image : ์ปจํ ์ด๋์์ ์ฌ์ฉํ ์ด๋ฏธ์ง๋ฅผ ์ง์ .
- .spec.containers[].ports[].containerPort : ํด๋น ์ปจํ ์ด๋์ ์ ์ํ ํฌํธ ๋ฒํธ๋ฅผ ์ค์ ํจ.
ํด๋น ์ํ์ ๊ฒฝ์ฐ, ์ ์์ github์์ pod/pod-sample.yaml์ ์ ์ฅ๋์ด ์์ผ๋ ํด๋น yaml ํ์ผ์ ์คํํฉ์๋ค. ์ดํ 'kubectl get pod' ๋ช ๋ น์ผ๋ก STATUS ํญ๋ชฉ์ด Running ์ด๋ฉด ์ ์์ ์ผ๋ก ์คํ๋ ๊ฒ์ ๋๋ค.
% kubectl apply -f pod/pod-sample.yaml
pod/kubernetes-simple-pod created
% kubectl get pod
NAME READY STATUS RESTARTS AGE
kubernetes-simple-pod 1/1 Running 0 8s
2.3 ํ๋ ์๋ช ์ฃผ๊ธฐ
ํ๋๋ ์์ฑ๋ถํฐ ์ญ์ ๊น์ง์ ๊ณผ์ ์ ์๋ช ์ฃผ๊ธฐ(Lifecycle)์ด ์์ต๋๋ค.
- Pending: k8s system์ ํ๋๋ฅผ ์์ฑํ๋ ์ค์. ์ด ์ํ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ ํ ์ ์ฒด ์ปจํ ์ด๋๋ฅผ ์คํํ๋ฏ๋ก ์๊ฐ์ด ๊ฑธ๋ฆผ.
- Running: ํ๋ ์ ๋ชจ๋ ์ปจํ ์ด๋๊ฐ ์คํ ์ค์ธ ์ํ.
- Succeeded: ํ๋ ์ ๋ชจ๋ ์ปจํ ์ด๋๊ฐ ์ ์ ์คํ ์ข ๋ฃ๋ ์ํ๋ก ์ฌ์์๋์ง ์์.
- Failed: ํ๋ ์ ๋ชจ๋ ์ปจํ ์ด๋ ์ค ์ ์์ ์ผ๋ก ์คํ ์ข ๋ฃ๋์ง ์์ ์ปจํ ์ด๋๊ฐ ์๋ ์ํ. ์ปจํ ์ด๋ ์ข ๋ฃ ์ฝ๋๊ฐ 0์ด ์๋๋ฉด ๋น์ ์ ์ข ๋ฃ์ด๊ฑฐ๋ ์์คํ ์ด ์ง์ ์ปจํ ์ด๋๋ฅผ ์ข ๋ฃํ ๊ฒ.
- Unknown: ํ๋์ ์ํ๋ฅผ ํ์ธํ ์ ์๋ ์ํ์ด๋ค ๋ณดํต ํ๋๊ฐ ์๋ ๋ ธ๋์ ํต์ ํ ์ ์์ ๋.
'kubectl get pod', 'kubectl describe pod kubernetes-simple-pod' ๋ช ๋ น์ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
% kubectl get pod
NAME READY STATUS RESTARTS AGE
kubernetes-simple-pod 1/1 Running 0 8s
% kubectl describe pod kubernetes-simple-pod
Name: kubernetes-simple-pod
Namespace: default
Priority: 0
Service Account: default
Node: docker-desktop/192.168.65.4
Start Time: Sun, 26 Mar 2023 13:55:52 +0900
Labels: app=kubernetes-simple-pod
Annotations: <none>
Status: Running
IP: 10.1.0.14
IPs:
IP: 10.1.0.14
Containers:
kubernetes-simple-pod:
...
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
...
Condition ํญ๋ชฉ์ ํ๋์ ํ์ฌ ์ํ๋ฅผ ๋ํ๋ด๋ฉฐ, Type๊ณผ Status๋ก ๊ตฌ๋ถ๋์ด ์์ต๋๋ค.
Status๋ ํด๋น Type์ด ํ์ฑํ(True), ๋นํ์ฑํ(False), ์ ์ ์์(Unknown) ์ธ์ง์ ๋ฐ๋ผ ์ํ๋ฅผ ํ์ํ๋ฉฐ, Type์๋ ๋ค์ ๊ฐ์ ์ ๋ณด๊ฐ ์๋ค.
- Initialized: ๋ชจ๋ ์ด๊ธฐํ ์ปจํ ์ด๋๊ฐ ์ฑ๊ณต์ ์ผ๋ก ์์ ์๋ฃ๋์๋ค๋ ๋ป.
- Ready: ํ๋๋ ์์ฒญ๋ค์ ์คํํ ์ ์๊ณ ์ฐ๊ฒฐ๋ ๋ชจ๋ ์๋น์ค์ ๋ก๋๋ฐธ๋ฐ์ฑ ํ์ ์ถ๊ฐ๋์ด์ผ ํ๋ค๋ ๋ป.
- ContainersReady: ํ๋ ์ ๋ชจ๋ ์ปจํ ์ด๋๊ฐ ์ค๋น ์ํ๋ผ๋ ๋ป.
- PodScheduled: ํ๋๊ฐ ํ๋์ ๋ ธ๋๋ก ์ค์ผ์ค์ ์๋ฃํ๋ค๋ ๋ป.
- Unschedulable: ์ค์ผ์ค๋ฌ๊ฐ ์์์ ๋ถ์กฑํ๊ฑฐ๋ ๋ค๋ฅธ ์ ์ฝ ๋ฑ์ผ๋ก ์ง๊ธ ๋น์ฅ ํ๋๋ฅผ ์ค์ผ์คํ ์ ์๋ค๋ ๋ป.
2.4. kubelet์ผ๋ก ์ปจํ ์ด๋ ์ง๋จ
์ปจํ ์ด๋ ์คํ ํ์๋ kubelet์ด ์ปจํ ์ด๋๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ์ง๋จํฉ๋๋ค. ์ด๋ ํ์ํ ํ๋ก๋ธ(probe)์๋ ๋ค์ ์ธ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- livenessProbe: ์ปจํ ์ด๋๊ฐ ์คํ๋์๋์ง ํ์ธํ๋ฉฐ, ์ด ์ง๋จ์ด ์คํจํ์ ๊ฒฝ์ฐ ์ ์ฑ ์ ๋ฐ๋ผ ์ปจํ ์ด๋๋ฅผ ์ฌ์์ํจ.
- readinessProbe: ์ปจํ
์ด๋๊ฐ ์คํ๋ ํ ์ค์ ์๋น์ค ์์ฒญ์ ์๋ตํ ์ ์๋์ง ์ง๋จ
- ํนํ ์คํํ์ฌ ์ค์ ๋ก ์๋น์ค ์์ฒญ์ ๋ฐ์ ์ ์์๋ ๊น์ง์ ์๊ฐ์ด ํ์ํ ์ดํ๋ฆฌ์ผ์ด์ ์ ์๋น์ค์ ์ ๋ฆฌ
- e.g. ์๋ฐ app ์ฒ๋ผ ํ๋ก์ธ์ค ์์ ํ ์ฑ์ด ์ด๊ธฐํ๋ ๋๊น์ง ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ํฉ, ๋์ฉ๋ ๋ฐ์ดํฐ๊ฐ ํ์ํ ์ฑ ๋ฑ์ ์ ์ฉ
์ปจํ ์ด๋ ์ง๋จ์ ์ปจํ ์ด๋๊ฐ ๊ตฌํํ ํธ๋ค๋ฌ(handler)๋ฅผ kubelet์ด ํธ์ถํ๋ฉฐ, handler์๋ ์ธ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ExecAction: ์ปจํ ์ด๋ ์์ ์ง์ ๋ ๋ช ๋ น์ ์คํํ๊ณ ์ข ๋ฃ ์ฝ๋๊ฐ 0์ผ๋ Success๋ผ๊ณ ์ง๋จ.
- TCPSocketAction: ์ปจํ ์ด๋ ์์ ์ง์ ๋ IP์ ํฌํธ๋ก TCP ์ํ๋ฅผ ํ์ธํ๊ณ ํฌํธ๊ฐ ์ด๋ ค ์์ผ๋ฉด Success๋ผ๊ณ ์ง๋จ.
- HTTPGetAction: ์ปจํ ์ด๋ ์์ ์ง์ ๋ IP, ํฌํธ, ๊ฒฝ๋ก๋ก HTTP GET ์์ฒญ์ ๋ณด๋ธ๋ค. ์๋ต ์ํ ์ฝ๋๊ฐ 200~400์ด๋ฉด Success๋ผ๊ณ ์ง๋จํ๋ค.
์ง๋จ ๊ฒฐ๊ณผ ์ญ์ ์ธ๊ฐ์ง๊ฐ ์์ต๋๋ค.
- Success : ์ปจํ ์ด๋ ์ง๋จ ์ฑ๊ณต
- Failure : ์ปจํ ์ด๋ ์ง๋จ ์คํจ
- Unknown : ์ง๋จ ์์ฒด๊ฐ ์คํจํด ์ปจํ ์ด๋ ์ํ๋ฅผ ์ ์ ์์
2.5 ์ด๊ธฐํ ์ปจํ ์ด๋(init container)
์ด๊ธฐํ ์ปจํ ์ด๋(init container)๋ app container๊ฐ ์คํ๋๊ธฐ ์ ํ๋๋ฅผ ์ด๊ธฐํํ๋ฉฐ, ๋ณด์์ ์ด์ ๋ก ๊ฐ์ด ๋๋ฉด ์๋๋ ์ฑ์ ์์ค์ฝ๋๋ฅผ ๋ณ๋ ๊ด๋ฆฌํ ๋ ์ ์ฉํฉ๋๋ค. ์ด๋ ๋ค์๊ณผ ๊ฐ์ ํน์ง์ด ์์ต๋๋ค.
- ์ด๊ธฐํ ์ปจํ ์ด๋๋ ์ฌ๋ฌ๊ฐ ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ฉฐ, pod tamplate์ ๋ช ์ํ ์์๋๋ก ์คํ๋๋ค.
- ์ด๊ธฐํ ์ปจํ ์ด๋๋ ์คํ ์คํจํ๋ฉด ์ฑ๊ณตํ ๋๊น์ง ์ฌ์์ํฉ๋๋ค. ์ด๋ฅผ ์ด์ฉํ๋ฉด k8s์ '์ ์ธ์ ' ํน์ง์์ ๋ฒ์ด, ํ์ํ ๋ช ๋ น๋ค์ ์์๋๋ก ์คํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์ด๊ธฐํ ์ปจํ ์ด๋๊ฐ ๋ชจ๋ ์คํ๋ ํ์์ผ app container๊ฐ ์คํ๋ฉ๋๋ค.
์ด๋ฐ ํน์ง์ ์ด์ฉํด pod ์คํ ์ app container๊ฐ ์ธ๋ถ ํน์ ์กฐ๊ฑด์ ๋ง์กฑํ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค ์คํํ๋๋ก ๋ง๋ค ์ ์์ต๋๋ค. ๋ฌผ๋ก , ์ด๊ธฐํ ์ปจํ ์ด๋์ ๋จ์ ๋ ์์ต๋๋ค. pod๊ฐ ๋ชจ๋ ์ค๋น๋๊ธฐ ์ ์คํํ ํ ์ข ๋ฃ๋์ด์ผ ํ๋ ์ปจํ ์ด๋์ด๊ธฐ ๋๋ฌธ์ readinessProbe๋ฅผ ์ง์ํ์ง ์์ต๋๋ค.
์ด๊ธฐํ ์ปจํ ์ด๋๋ฅผ ์ค์ ํ ํ๋ ์ค์ ์ ์์๋ pod/pod-init.yaml๋ฅผ ์ดํด๋ด ์๋ค.
spec:
initContainers:
- name: init-myservice
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld01;']
- name: init-mydb
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'sleep 2; echo helloworld02;']
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
command: ['sh', '-c', 'echo The app is running! && sleep 3600']
์ด๊ธฐํ ์ปจํ ์ด๋๋ .spec.initContainers[] ์ ํ์ ํ๋์ ์ ์๋๋ฉฐ, ์ฑ ์ปจํ ์ด๋๋ .spec.containers[] ํ์์ ์ ์๋ฉ๋๋ค.
๋ฐ๋ผ์ ํด๋น yaml ํ์ผ์ ์คํํ๋ฉด? ํด๋น ํ๋๋ฅผ ์คํํ๊ธฐ ์ ์ 'init-service', 'init-mydb' ์ปจํ ์ด๋๋ฅผ ์คํํ ํ 'kubernetes-simple-pod' ์ปจํ ์ด๋๋ฅผ ์คํ์์ผ ํ๋์ pod๋ก ์คํํฉ๋๋ค.
2.6 ํ๋ ์ธํ๋ผ ์ปจํ ์ด๋
k8s์๋ ๋ชจ๋ ํ๋์์ ํญ์ ์คํ๋๋ pause๋ผ๋ ์ปจํ ์ด๋๊ฐ ์์ต๋๋ค. ์ด pause๋ฅผ 'ํ๋ ์ธํ๋ผ ์ปจํ ์ด๋(Pod infrastructure container)' ๋ผ๊ณ ํฉ๋๋ค.
pause๋ ํ๋ ์ ๊ธฐ๋ณธ ๋คํธ์ํฌ๋ก ์คํ๋๋ฉฐ, ํ๋ก์ธ์ค ์๋ณ์๊ฐ 1(PID 1)๋ก ์ค์ ๋๋ฏ๋ก ๋ค๋ฅธ ์ปจํ ์ด๋์ ๋ถ๋ชจ ์ญํ ์ ํฉ๋๋ค. ๋ค๋ฅธ ์ปจํ ์ด๋๋ pause๊ฐ ์ ๊ณตํ๋ ๋คํธ์ํฌ๋ฅผ ๊ณต์ ํด ์ฌ์ฉํฉ๋๋ค. ๊ทธ๋์ ํ๋ ์ ๋ค๋ฅธ ์ปจํ ์ด๋๊ฐ ์ฌ์์๋์ ๋๋ ํ๋์ IP๋ฅผ ์ ์งํ์ง๋ง, pause๊ฐ ์ฌ์์๋๋ค๋ฉด ํ๋ ์์ ๋ค๋ฅธ ๋ชจ๋ ์ปจํ ์ด๋๋ ์ฌ์์๋ฉ๋๋ค.
kubelet์๋ ๋ช ๋ น ์ต์ ์ผ๋ก '--pod-infra-container-image'๋ก pause๊ฐ ์๋ ๋ค๋ฅธ ์ปจํ ์ด๋๋ฅผ ํ๋ ์ธํ๋ผ ์ปจํ ์ด๋๋ก ์ง์ ํ ์ ์์ต๋๋ค.
2.7. ์คํํฑ ํ๋
์คํํฑ ํ๋(static pod)๋ kube-apiserver๋ฅผ ํตํ์ง ์๊ณ kubelet์ด ์ง์ ์คํํ๋ ํ๋์ ๋๋ค. kubelet ์ค์ ์ '--pod-manifest-path'๋ผ๋ ์ต์ ์ ์ง์ ํ ๋๋ ํฐ๋ฆฌ์ static pod๋ก ์คํํ๋ ค๋ ํ๋๋ฅผ ๋ฃ์ด๋๋ฉด, kubelet์ด ๊ทธ๊ฑธ ๊ฐ์งํด static pod๋ก ์คํํฉ๋๋ค.
static pod๋ kubelet์ด ์ง์ ๊ด๋ฆฌํ๋ฉฐ ์ด์์ด ์๊ธด๋ค๋ฉด ์ฌ์์ํฉ๋๋ค. ๋ kubelet์ด ์คํ์ค์ธ ๋ ธ๋์์๋ง ์คํ๋๊ณ ๋ค๋ฅธ ๋ ธ๋์์๋ ์คํ๋์ง ์์ต๋๋ค. kube-apiserver๋ก pod๋ฅผ ์กฐํ ๊ฐ๋ฅํ์ง๋ง static pod์ ์ด๋ ํ ๋ช ๋ น์ ์คํํ ์๋ ์์ต๋๋ค.
๋ณดํต static pod๋ kube-apiserver, etcd๊ฐ์ system pod๋ฅผ ์คํํ๋ ์ฉ๋๋ก ๋ง์ด ์ฐ์ ๋๋ค. k8s์์ ํ๋๋ฅผ ์คํํ๋ ค๋ฉด kube-apiserver๊ฐ ํ์ํ๋ฐ kube-apiserver ์์ฒด๋ฅผ ์ฒ์ ์คํํ๋ ๋ณ๋์ ์๋จ์ผ๋ก static pod๋ฅผ ์ด์ฉํ๋ ๊ฒ์ ๋๋ค.
2.8 ํ๋์ CPU์ ๋ฉ๋ชจ๋ฆฌ ์์ ํ ๋น
๋ ธ๋ ํ๋์ ์ฌ๋ฌ ๊ฐ ํ๋๋ฅผ ์คํํ๋ ์ผ์ด ์์ฃผ ์์ต๋๋ค. ์ด๋ ์์ ์ฌ์ฉ๋์ด ํฐ ํ๋๊ฐ ๋ ธ๋ ํ๋์ ๋ชจ์ฌ์๋ค๋ฉด ํ๋๋ค์ ์ฑ๋ฅ์ด ๋๋น ์ง๋ฉฐ ์ ์ฒด ํด๋ฌ์คํฐ ์์ ํจ์จ๋ ๋ฎ์์ง๋๋ค.
k8s์์๋ ์ด๋ฅผ ๋ง๋ ์ฌ๋ฌ ๋ฐฉ๋ฒ์ด ์์ผ๋ฉฐ, ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๊ฒ์ ํ๋ ์ค์ ์ ํ๋ ์ ๊ฐ ์ปจํ ์ด๋๊ฐ CPU๋ ๋ฉ๋ชจ๋ฆฌ์ ์ต์ ์๊ตฌ๋(request)์ ์ํ์ (limits)์ ์ง์ ํ๋ ๊ฒ์ ๋๋ค. pod/pod-resource.yaml ํ์ผ์์ ์์ ํ ๋น๋์ ์ง์ ํ๋ ๋ฐฉ๋ฒ์ ์ตํ๋ณด๋๋ก ํฉ์๋ค.
spec:
containers:
- name: kubernetes-simple-pod
image: arisu1000/simple-container-app:latest
resources:
requests:
cpu: 0.1 --- 1
memory:200M --- 2
limits:
cpu: 0.5 --- 3
memory: 1G --- 4
ports:
- containerPort: 8080
- .spec.continers[].resource.request ํ๋๋ฅผ ํตํด ์ต์ ์์ ์๊ตฌ๋์ ์ง์
- ์ด ํ๋์ ์ค์ ๋ ๋งํผ ์์ ์ฌ์ ๊ฐ ์๋ ๋ ธ๋์ฌ์ผ ๊ทธ๊ณณ์ ํ๋๊ฐ ์ค์ผ์ค๋ง๋์ด ์คํ๋จ
- ์์์ด ์๊ตฌํ๋ ๋งํผ ์๋ ๋ ธ๋๊ฐ ์๋ค๋ฉด ํ๋๋ Pending ์ํ๋ก ์คํ๋์ง ์์ผ๋ฉฐ ํด๋ฌ์คํฐ ๋ด์ ์์ ์ฌ์ ๊ฐ ์๊ธธ ๋๊น์ง ๋๊ธฐํจ.
- .spec.continers[].resource.request ํ๋๋ฅผ ํตํด ์์ ์ํ์ ์ ์ง์
- ํ์์ ์ฌ์ฉ๋์ด ์ ๋๋ผ๋ ๊ฐ์๊ธฐ ๋์ด๋ ์ ์์ผ๋ฉฐ, ์ด๋ limit ์ค์ ์ด ๋ฐ๋ก ์๋ค๋ฉด ํด๋น ์ปจํ ์ด๋๊ฐ ๋ ธ๋์ ๋ชจ๋ ์์์ ์ฌ์ฉํ ๊ฒ
- ๊ทธ๋ผ ๊ฐ์ ๋ ธ๋์ ์คํ๋ ๋ค๋ฅธ ์ปจํ ์ด๋๊ฐ ๋ชจ๋ ์ํฅ์ ๋ฐ์์ ์์ผ๋ฉฐ, ์ต์ ์ ํด๋ฌ์คํฐ ์ ๋ชจ๋ ์๋น์ค์ ์ํฅ์ ๋ผ์น ์๋ ์๊ธฐ์ limit์ค์ ์ผ๋ก ์ด๋ฅผ ๋ง์์ค
- ์ถ๊ฐ๋ก, ์ฌ๊ธฐ์ ์ง์ ํ CPU ํ๋๋ 0.1, 0.5 ๋ฑ์ผ๋ก ํํํ๋ฉฐ, ์ฌ๊ธฐ์ 1์ ์ฝ์ด ํ๋์ ์ฐ์ฐ ๋ฅ๋ ฅ์ ์ ๋ถ ์ฐ๋๋ก ์ค์ ํ๋ค๋ ๋ป์ด๋ค. ๋ฐ๋ผ์ 0.1์ด๋ผ๋ฉด CPU ์ฝ์ด ํ๋์ 10%๋งํผ ์ฐ์ฐ๋ฅ๋ ฅ์ ํ ๋นํ๋ค๋ ์๋ฏธ๊ฐ ๋ฉ๋๋ค.
2.9. ํ๋์ ํ๊ฒฝ ๋ณ์ ์ค์ ํ๊ธฐ
ํ๋์ ํ๊ฒฝ ๋ณ์ ์ค์ ๋ฐฉ๋ฒ์ .spec.containers[].env[] ํ๋์์ ์ค์ ํ๋ฉฐ, ๋ค์๊ณผ ๊ฐ์ ์๋ฏธ๋ฅผ ์ง๋๋๋ค.
- name : ์ฌ์ฉํ ํ๊ฒฝ๋ณ์์ ์ด๋ฆ์ ์ค์ .
- value : ๋ฌธ์์ด์ด๋ ์ซ์ ํ์์ ๊ฐ์ ์ค์ .
- valueFrom: ๊ฐ์ ์ง์ ํ ๋นํ๋ ๊ฒ์ด ์๋๋ผ ์ด๋๊ฐ ๋ค๋ฅธ ๊ณณ์์ ์ฐธ์กฐํ๋ ๊ฐ ์ค์ .
- fieldRef : ํ๋์ ํ์ฌ ์ค์ ๋ด์ฉ์ ๊ฐ์ผ๋ก ์ค์ ํ๋ค๋ ์ ์ธ.
- fieldPath : .fieldRef์์ ์ด๋์ ๊ฐ์ ๊ฐ์ ธ์ฌ ๊ฒ์ธ์ง ์ง์ . ๊ฐ์ ์ฐธ์กฐํ๋ ค๋ ํญ๋ชฉ์ ์์น๋ฅผ ์ง์ .
- resourceFieldRef : ์ปจํ ์ด๋์ CPU, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ผ๋ง๋ ํ ๋นํ๋์ง์ ๊ดํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ด.
- containerName: ํ๊ฒฝ ๋ณ์ ์ค์ ์ ๊ฐ์ ธ์ฌ ์ปจํ ์ด๋ ์ด๋ฆ์ ์ค์ .
- resource : ์ด๋ค ์์์ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ฌ์ง ์ค์ .
์ฌ์ฉ์์๋ 'pod/pod-env.yaml' ํ์ผ์ ์ฐธ๊ณ ํ๋๋ก ํฉ์๋ค. ํด๋น ํ๊ฒฝ ๋ณ์๊ฐ ์ ์ฉ๋์๋์ง ํ์ธํ๋ ๋ฐฉ๋ฒ์, ํด๋น ์ปจํ ์ด๋์ ์ ์ํ์ฌ env๋ช ๋ น์ด๋ก ํ๊ฒฝ๋ณ์๋ฅผ ํ์ธํ๋ ๊ฒ์ ๋๋ค.
% kubectl apply -f pod/pod-env.yaml
% kubectl exec -it kubernetes-simple-pod sh
- # env
POD_IP=10.1.0.5
...(ํ๊ฒฝ๋ณ์ ๋ด์ฉ)
2.10. ํ๋ ๊ตฌ์ฑ ํจํด
ํ๋๋ก ์ฌ๋ฌ ๊ฐ์ ์ปจํ ์ด๋๋ฅผ ๋ฌถ์ด์ ๊ตฌ์ฑํ๊ณ ์คํํ ๋ ๋ช๊ฐ์ง ํจํด์ ์ ์ฉํ ์ ์์ต๋๋ค. ์ด๋ ๊ตฌ๊ธ์ '์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ๋ถ์ฐ ์์คํ ๋์์ธ ํจํด' ์ ์ฐธ๊ณ ํ๋ฉด ๋์์ด ๋ฉ๋๋ค.
2.10.1. ์ฌ์ด๋์นด ํจํด(Sidecar)
์๋ ์ฌ์ฉํ๋ ค๋ ๊ธฐ๋ณธ ์ปจํ ์ด๋์ ๊ธฐ๋ฅ์ ํ์ฅ/๊ฐํํ๋ ์ฉ๋์ ์ปจํ ์ด๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ ๋๋ค. ๊ธฐ๋ณธ ์ปจํ ์ด๋๋ ์๋ ๋ชฉ์ ์ ๊ธฐ๋ฅ์๋ง ์ถฉ์คํ๋๋ก ๊ตฌ์ฑํ๊ณ , ๋๋จธ์ง ๊ณตํต ๋ถ๊ฐ ๊ธฐ๋ฅ๋ค์ ์ฌ์ด๋์นด ์ปจํ ์ด๋๋ฅผ ์ถ๊ฐํด์ ์ฌ์ฉํฉ๋๋ค.
์ผ๋ฐ์ ์ธ ์น ์๋ฒ์ ์๋ผ๋ฉด? ์น ์๋ฒ ์ปจํ ์ด๋๋ ๊ทธ ์ญํ ๋ง ํ๊ณ , ๋ก๊ทธ๋ ํ์ผ๋ก ๋จ๊น๋๋ค. ์ฌ์ด๋์นด ์ญํ ์ธ ๋ก๊ทธ ์์ง ์ปจํ ์ด๋๊ฐ ํ์ผ ์์คํ ์ ์์ด๋ ๋ก๊ทธ๋ฅผ ์์งํด ์ธ๋ถ์ ๋ก๊ทธ ์์ง ์์คํ ์ผ๋ก ๋ณด๋ ๋๋ค. ์ด๋ฌ๋ฉด ์น ์๋ฒ ์ปจํ ์ด๋๋ฅผ ๋ค๋ฅธ ์ญํ ์ ํ๋ ์ปจํ ์ด๋๋ก ๋ณ๊ฒฝํ์ ๋๋ ๋ก๊ทธ ์์ง ์ปจํ ์ด๋๋ ๊ทธ๋๋ก ์ฌ์ฉ ๊ฐ๋ฅํ๋ฉฐ, ๊ณตํต ์ญํ ์ ํ๋ ์ปจํ ์ด๋์ ์ฌ์ฌ์ฉ์ฑ์ ๋์ผ ์ ์์ต๋๋ค.
2.10.2. ์ฐ๋ฒ์๋ ํจํด(Ambassador)
ํ๋ ์์์ ํ๋ก์ ์ญํ ์ ํ๋ ์ปจํ ์ด๋๋ฅผ ์ถ๊ฐํ๋ ํจํด์ ๋๋ค. ํ๋ ์์์ ์ธ๋ถ ์๋ฒ์ ์ ๊ทผํ ๋ ๋ด๋ถ ํ๋ก์์ ์ ๊ทผํ๋๋ก ์ค์ ํ๊ณ , ์ค์ ์ธ๋ถ์ ์ฐ๊ฒฐ์ ํ๋ก์์์ ์์์ ์ฒ๋ฆฌํฉ๋๋ค.
์น ์๋ฒ ์ปจํ ์ด๋๋ ์บ์์ localhost๋ก๋ง ์ ๊ทผํ๊ณ , ์ธ๋ถ ์บ์ ์ค ์ด๋๋ก ์ ๊ทผํ ์ง๋ ํ๋ก์ ์ปจํ ์ด๋๊ฐ ์ฒ๋ฆฌํฉ๋๋ค. ์ด ๋ฐฉ์์ ํ๋์ ํธ๋ํฝ์ ๋ ์ธ๋ฐํ๊ฒ ์ ์ดํ ์ ์๋ค๋ ์ฅ์ ์ด ์์ต๋๋ค.
2.10.3. ์ด๋ํฐ ํจํด(Adapter)
ํ๋ ์ธ๋ถ๋ก ๋ ธ์ถ๋๋ ์ ๋ณด๋ฅผ ํ์คํํ๋ ์ด๋ํฐ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ค๋ ๋ป์ ๋๋ค. ์ฃผ๋ก ์ด๋ํฐ ์ปจํ ์ด๋๋ก ํ๋์ ๋ชจ๋ํฐ๋ง ๋ฐ์ดํฐ๋ฅผ ๋ ธ์ถ์ํค๊ณ , ์ธ๋ถ ๋ชจ๋ํฐ๋ง ์์คํ ์์ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ฃผ๊ธฐ์ ์ผ๋ก ๊ฐ์ ธ๊ฐ ๋ชจ๋ํฐ๋งํ๋๋ฐ ์ด์ฉํฉ๋๋ค.
3. ์ปจํธ๋กค๋ฌ
์ปจํธ๋กค๋ฌ(controller)๋ ํ๋๋ค์ ๊ด๋ฆฌํ๋ ์ญํ ์ ํ๋ฉฐ ReplicaSet, Deployment, StatefulSet, DaemonSet, Job ๋ฑ ๋ค์ํ ๋ชฉ์ ์ ๋ง๋ ์ปจํธ๋กค๋ฌ๊ฐ ์์ต๋๋ค.
- Replication Controller, ReplicaSet, Deployment: ์ค๋ ์๊ฐ๋์ ๊ณ์ ์คํ๋์ด์ผ ํ๋ ํ๋๋ค์ ๊ด๋ฆฌํ ๋
- DaemonSet: ํด๋ฌ์คํฐ์ ์ ์ฒด ๋ ธ๋์ ๊ฐ์ ํ๋๋ฅผ ์คํํ ๋
- StatefulSet: ๋ณดํต stateless ์ฑ์ ์คํํ๋ ๋ฐ ์ฌ์ฉํ๋ ์ปจํ ์ด๋๋ฅผ stateful ์ฑ์ ์คํํ ๋ ์ฌ์ฉํ๋๋ก
- Job: 1ํ์ฑ ์์ ์ ํ ๋ํ๋ฉฐ, ์ฃผ๊ธฐ์ ์ธ ๋ฐฐ์น ์์ ์ ์คํํ ๋๋ cronjob์ ์ฌ์ฉ
3.1. ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ(Replication Controller)๋ ์ง์ ํ ์ซ์๋งํผ์ ํ๋๊ฐ ํญ์ ํด๋ฌ์คํฐ ์์์ ์คํํ๋๋ก ๊ด๋ฆฌํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํธ๋กค๋ฌ์ ๋๋ค. ์ฅ์ ์ ๊ฐ์ ์ด์ ๋ก ํ๋๊ฐ ์ฃฝ๋๋ผ๋ ์ง์ ํ ์ซ์๋งํผ ํ๋๋ฅผ ์คํํ๋๋ก ์กฐ์ ํฉ๋๋ค.
๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ k8s ์ด๊ธฐ๋ถํฐ ์์์ผ๋ ์์ฆ์ ๋น์ทํ ์ญํ ์ ํ๋ ๋ ํ๋ฆฌ์นด์ธํธ๋ฅผ ์ฌ์ฉํ๋ ์ถ์ธ์ ๋๋ค. ๋ํ ์ฑ์ ๋ฐฐํฌ์๋ ๋ํ๋ก์ด๋จผํธ๋ฅผ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
3.2. ๋ ํ๋ฆฌ์นด์ธํธ
๋ ํ๋ฆฌ์นด์ธํธ(ReplicaSet)๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ๋ฐ์ ํ์ผ๋ก '์งํฉ ๊ธฐ๋ฐ์ ์ ๋ ํฐ(set-based selector)'๋ฅผ ์ง์ํฉ๋๋ค. ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์ ๊ฒฝ์ฐ ์ ๋ ํฐ๊ฐ ๋ฑํธ๊ธฐ๋ฐ์ผ๋ก ๋ ์ด๋ธ์ ์ ํํ ๋ ๊ฐ์์ง ๋ค๋ฅธ์ง๋ง ํ์ธํ์ผ๋, ์งํฉ๊ธฐ๋ฐ์ ์ ๋ ํฐ๋ in, notin, exists ๊ฐ์ ์ฐ์ฐ์ ์ง์ํฉ๋๋ค. ์ถ๊ฐ๋ก ๋ ํ๋ฆฌ์นด์ธํธ๋ ๋ ํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ์์ ์ง์ํ๋ rolling-update ์ต์ ์ ์ง์ํ์ง ์์ ํ์ํ ๊ฒฝ์ฐ ๋ํ๋ก์ด๋จผํธ๋ฅผ ์ฌ์ฉํด์ผํฉ๋๋ค.
3.2.1. ๋ ํ๋ฆฌ์นด์ธํธ ์ฌ์ฉํ๊ธฐ
๋ ํ๋ฆฌ์นด์ธํธ๋ฅผ ์ด์ฉํด ํ๋๋ฅผ ๊ด๋ฆฌํ๋ ์ฌ์ฉํ๊ธฐ ์ํ ํ ํ๋ฆฟ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ ์ replicaset/replicaset-nginx.yaml์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
% kubectl apply -f replicaset-nginx.yaml
replicaset.apps/nginx-replicaset created
% kubectl get pods
nginx-replicaset-4v65n 1/1 Running 0 78s
nginx-replicaset-jhd5g 1/1 Running 0 78s
nginx-replicaset-r6hrk 1/1 Running 0 78s
์์ ๋ฅผ ์ดํด๋ณด๋ฉด ํ ํ๋ฆฟ ๋ด Kind๊ฐ ReplicaSet์ธ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์คํ์ํค๋ฉด replicas์ ์ง์ ๋์ด ์๋ ๊ฐ์๋๋ก ํ๋๊ฐ ์คํ๋ฉ๋๋ค. ์คํ๋ ๋ .spec.selector.matchLabels ํ์์ ์ง์ ๋ ๋ผ๋ฒจ๊ณผ ๋์ผํ ๋ผ๋ฒจ์ .spec.template.metadata.labels์ ํ์์์ ์ฐพ์์ ํด๋น ์ปจํ ์ด๋๋ฅผ replicas ์ ์ง์ ๋ ๊ฐ์๋๋ก ์คํํ๋ ๊ตฌ์กฐ์ ๋๋ค.
์ด๋ ํน์ ํ๋๋ฅผ ์ ํํ์ฌ 'kubectl delete pods <pod name>'๋ก ์ง์ฐ๋๋ผ๋ ๋ค์ ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ํ๋์ ๊ฐ์๋ฅผ ์กฐ์ ํ๋ ค๋ฉด ํ ํ๋ฆฟ(*.yaml) ๋ด์ .spec.replicas ํ๋ ๊ฐ์ ์์ ํ ํ 'kubectl apply -f replicaset-nginx.yaml' ํ ํ๋ฆฟ์ ๋ค์ ์คํํด์ผ ํฉ๋๋ค.
3.2.2. ๋ ํ๋ฆฌ์นด์ธํธ์ ํ๋์ ์ฐ๊ด ๊ด๊ณ
ํ ํ๋ฆฟ์ ํ์ฉํ์ฌ ์์ฑํ ๋ ํ๋ฆฌ์นด์ธํธ๊ฐ ์ ์์ ์ผ๋ก ์คํ๋์๋์ง ํ์ธํ๊ธฐ ์ํด์๋ ๋ค์์ ๋ช ๋ น์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
% kubectl get pods,replicaset
NAME READY STATUS RESTARTS AGE
pod/nginx-replicaset-4v65n 1/1 Running 0 21m
pod/nginx-replicaset-jhd5g 1/1 Running 0 22m
pod/nginx-replicaset-r6hrk 1/1 Running 0 21m
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-replicaset 3 3 3 59s
์ฌ๊ธฐ์ DESIRED๋ ๋ ํ๋ฆฌ์นด ์ธํธ ์ค์ ์ ์ง์ ํ ํ๋์ ๊ฐ์์ด๋ฉฐ, CURRENT๋ ํ์ฌ ํด๋ฌ์คํฐ์์ ๋์ํ๋ ์ค์ ํ๋์ ๊ฐ์์ ๋๋ค. ์ ์์ ์ผ๋ก ๋์์ง ๊ฒ์ ํ์ธํ ์ ์์ฃ ? ์ฌ๊ธฐ์ ํ๋๋ฅผ ์ ์ธํ ๋ ํ๋ฆฌ์นด์ธํธ๋ง ์ฃฝ์ผ ์ ์์๊น์? ์ด๋ ํ๋์ ๋ ํ๋ฆฌ์นด์ธํธ์์ ๊ด๊ณ๋ฅผ ํตํด ํ์ธํ ์ ์์ต๋๋ค.
ํ๋๋ ๋ ์ด๋ธ ๊ธฐ์ค์ผ๋ก ๊ด๋ฆฌํ๋ฏ๋ก ๋ ํ๋ฆฌ์นด์ธํธ์ ํ๋๋ ๋์จํ๊ฒ ๊ฒฐํฉ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ๋ ํ๋ฆฌ์นด์ธํธ์ ํ๋๋ฅผ ํ๊บผ๋ฒ์ ์ญ์ ํ ๋๋ kubectl delete replicaset <์ปจํ ์ด๋ ์ด๋ฆ> ๋ช ๋ น์ผ๋ก ์ญ์ ํ์ง๋ง, ๋ ํ๋ฆฌ์นด์ธํธ๋ง ์ญ์ ํ๊ธฐ ์ํด์๋ --cascade=orphan ์ต์ ์ ์ฌ์ฉํ์ฌ์ผ ํฉ๋๋ค.
% kubectl delete replicaset nginx-replicaset --cascade=orphan
replicaset.apps "nginx-replicaset" deleted
% kubectl get pods,replicaset
NAME READY STATUS RESTARTS AGE
pod/nginx-replicaset-4v65n 1/1 Running 0 24m
pod/nginx-replicaset-jhd5g 1/1 Running 0 26m
pod/nginx-replicaset-r6hrk 1/1 Running 0 24m
3.3 ๋ํ๋ก์ด๋จผํธ
๋ํ๋ก์ด๋จผํธ(Deployment)๋ ์ฟ ๋ฒ๋คํฐ์ค์์ stateless ์ฑ์ ๋ฐฐํฌํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ปจํธ๋กค๋ฌ์ ๋๋ค. ์ด๋ ๋จ์ํ ์คํ์์ผ์ผ ํ ํ๋ ๊ฐ์๋ฅผ ์ ์งํ๋ ๊ฒ ๋ฟ๋ง ์๋๋ผ ์ฑ์ ๋ฐฐํฌํ ๋ ๋กค๋ง ์ ๋ฐ์ดํธ, ์ฑ ๋ฐฐํฌ ๋์ค ์ ์ ๋ฉ์ท๋ค๊ฐ ์ฌ๋ฐฐํฌ, ๋ฐฐํฌ ํ ์ด์ ๋ฒ์ ์ผ๋ก ๋กค๋ฐฑ ๊ธฐ๋ฅ๋ ์ง์ํฉ๋๋ค.
๋ํ๋ก์ด๋จผํธ์ ์ฌ์ฉํ๋ ํ ํ๋ฆฟ์ ์์ deployment/deployment-nginx.yaml๋ฅผ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
% kubectl apply -f deployment/deployment-nginx.yaml
deployment.apps/nginx-deployment created
% kubectl get deploy,rs,rc,pods
NAME READY UP-TO-DATE AVAILABLE AGE
deployment.apps/nginx-deployment 3/3 3 3 69s
NAME DESIRED CURRENT READY AGE
replicaset.apps/nginx-deployment-dfcbd5fd6 3 3 3 69s
NAME READY STATUS RESTARTS AGE
pod/nginx-deployment-dfcbd5fd6-jdtrh 1/1 Running 0 69s
pod/nginx-deployment-dfcbd5fd6-s8mx7 1/1 Running 0 69s
pod/nginx-deployment-dfcbd5fd6-x4n5d 1/1 Running 0 69s
์์ ๋ฅผ ์ดํด๋ณด๋ฉด ํ ํ๋ฆฟ ๋ด Kind๊ฐ Deployment์ธ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ์คํ์ํค๋ฉด nginx-deployment๋ผ๋ ๋ํ๋ก์ด๋จผํธ์ ์ด ๋ํ๋ก์ด๋จผํธ๊ฐ ๊ด๋ฆฌํ๋ ๋ ํ๋ฆฌ์นด์ธํธ๋ ์์ฑ๋์์ต๋๋ค. ์ฌ๊ธฐ์ ์์ฑํ์ธ์ ์ํด ์ฌ์ฉ๋ 'kubectl get deploy,rs,rc,pods'์์ deploy๋ ๋ํ๋ก์ด๋จผํธ, rs๋ ๋ฆฌํ๋ฆฌ์นด์ธํธ, pods๋ ํ๋, rc๋ ๋ฆฌํ๋ฆฌ์ผ์ด์ ์ปจํธ๋กค๋ฌ๋ฅผ ์๋ฏธํ๋ฉฐ ๋ฆฌํ๋ฆฌ์ผ๋์ ์ปจํธ๋กค๋ฌ๋ ์ฌ์ฉํ์ง ์๋๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด์ ๋ฃ์์ต๋๋ค.
์ด ์ํ์์ nginx-deployment์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ค์ ์ ๋ณด๋ฅผ ํ์ธํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
% kubectl get deploy nginx-deployment -o=jsonpath="{.spec.template.spec.containers[0].image}{'\n'}"
nginx
nginx ์ด๋ฏธ์ง๋ฅผ ํ์ธํ ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ๋ณ๊ฒฝํ๋ ๋ฐฉ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ 3๊ฐ์ง๊ฐ ์์ต๋๋ค.
1. kubectl set ๋ช ๋ น์ผ๋ก ์ง์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง๋ฅผ ์ง์
% kubectl set image deployment/nginx-deployment nginx-deployment=nginx:1.10.1
deployment.apps/nginx-deployment image updated
2. kubectl edit ๋ช ๋ น์ผ๋ก ํ์ฌ ํ๋์ ์ค์ ์ ๋ณด๋ฅผ ์ฐ ๋ค์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ์์
% kubectl edit deploy nginx-deployment
์์ ๋ช ๋ น์ด๋ฅผ ์คํํ๋ฉด ๊ธฐ๋ณธ editor(e.g. vi ์๋ํฐ)์ ์คํํ๋ ํ ํ๋ฆฟ์ด ๋จ๋ ๊ฒ์ ํ์ธํ ์ ์๊ณ ์ฌ๊ธฐ์ ์์ ํ๋ฉด ๋ฉ๋๋ค(๋ฌผ๋ก , ๊ธฐ์กด์ ์์ฑํ๋ *.yaml ํ์ผ์ ์์ ๋์ง ์์ต๋๋ค.).
3. ์ฒ์ ์ ์ฉํ๋ ํ ํ๋ฆฟ์ ์ปจํ ์ด๋ ์ด๋ฏธ์ง ์ ๋ณด๋ฅผ ์์ ํ ๋ค์ kubectl apply ๋ช ๋ น์ ์คํํด์ ๋ณ๊ฒฝ
์ค์ ํ์ผ๋ก ๋จ๊ธฐ์ ํ์๊ฐ ๊ฐ์ฅ ์ถ์ฒํ๋ ๋ฐฉ๋ฒ์ด๋ฉฐ, ๊ฐ์ฅ ์ฝ๊ณ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ๋๋ค.
3.3.2. ๋ํ๋ก์ด๋จผํธ ๋กค๋ฒกํ๊ธฐ
์ปจํ ์ด๋์ ๋ณ๊ฒฝ ๋ด์ญ์ ๋ค์์ ๋ช ๋ น์ด๋ก ํ์ธํ ์ ์์ผ๋ฉฐ, ํน์ ๋ฒ์ ์ ๋ํ ์ธ๋ถ ์ ๋ณด๋ฅผ ์๊ณ ์ถ๋ค๋ฉด --rivision=<๋ฆฌ๋น์ ์ซ์> ์ต์ ์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
% kubectl rollout history deploy nginx-deployment
deployment.apps/nginx-deployment
REVISION CHANGE-CAUSE
2 <none>
3 <none>
4 <none>
% kubectl rollout history deploy nginx-deployment --revision=3
deployment.apps/nginx-deployment with revision #3
Pod Template:
Labels: app=nginx-deployment
pod-template-hash=748b8dbccc
Containers:
nginx-deployment:
Image: nginx:1.10.1
Port: 80/TCP
Host Port: 0/TCP
Environment: <none>
Mounts: <none>
Volumes: <none>
์ฌ๊ธฐ์ ํน์ ๋ฆฌ๋น์ ์ผ๋ก ์คํ์ค์ธ ํ๋๋ฅผ ๋๋๋ฆฌ๋ ค๋ฉด --to-revision=<๋ฆฌ๋น์ ์ซ์> ์ต์ ๊ณผ ํจ๊ป ๋ค์์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
% kubectl rollout undo deploy nginx-deployment --to-revision=3
deployment.apps/nginx-deployment rolled back
์ด๋ ๊ฒ ๋กค๋ฐฑ์ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ฆฌ๋น์ ๋ง๋ค ๋ฒ์ ์ ๋ณด๋ฅผ ๋ถ์ฌ์ฃผ์ด ๊ด๋ฆฌํ๋ฉด ๋ณด๋ค ์ฝ๊ฒ ํ์ ํ ์ ์๋๋ฐ, ์ด๋ *.yaml ํ์ผ ๋ด์ .metadata.annotations ํ๋๋ฅผ ์ถ๊ฐํ๋ฉด history๋ฅผ ํ์ธํ ๋ CHANGE-CAUSE์ ๋ฒ์ ์ ๋ณด๊ฐ ๊ธฐ์ฌ๋ฉ๋๋ค.
metadata:
name: nginx-deployment
labels:
app: nginx-deployment
annotations:
kubernetes.io/change-cause: version 1.10.1
3.3.3. ํ๋ ๊ฐ์ ์กฐ์ ํ๊ธฐ
์คํ ์ค์ธ ๋ํ๋ก์ด๋จผํธ์ ํ๋ ๊ฐ์๋ฅผ ์กฐ์ ํ๋ ค๋ฉด kubectl scale ๋ช ๋ น์ --replicas ์ต์ ์ผ๋ก ํ๋ ๊ฐ์๋ฅผ ์ง์ ํด์ค ์ ์์ต๋๋ค.
% kubectl scale deploy nginx-deployment --replicas=5
deployment.apps/nginx-deployment scaled
3.3.4. ๋ํ๋ก์ด๋จผํธ ๋ฐฐํฌ ์ ์ง, ๋ฐฐํฌ ์ฌ๊ฐ, ์ฌ์์ํ๊ธฐ
kubectl rollout ๋ช ๋ น์ ์ด์ฉํด์ ์งํ์ค์ธ ๋ฐฐํฌ๋ฅผ pause๋ฅผ ํตํด ์ ์ ๋ฉ์ท๋ค๊ฐ resume์ผ๋ก ๋ค์ ์์ํ ์ ์์ต๋๋ค.
% kubectl rollout pause deployment/nginx-deployment
% kubectl rollout resume deploy/nginx-deployment
pause๋ฅผ ํตํด ๋ฉ์ถ ์ํ์์ set, patch์ ๊ฐ์ ๋ช ๋ น์ผ๋ก ์์ ํ ํ resume์ ํตํด ์ฌ๊ฐํ๋ ๊ตฌ์กฐ์ ๋๋ค.
% kubectl set image deploy/nginx-deployment nginx-deployment=nginx:1.11
deployment.apps/nginx-deployment image updated
% kubectl patch deployment/nginx-deployment -p "{\"metadata\":{\"annotations\":{\"kubernetes.io/change-cause\":\"version 1.11\"}}}"
deployment.apps/nginx-deployment patched
3.3.5. ๋ํ๋ก์ด๋จผํธ ์ํ
๋ฐฐํฌ ์ค์๋ ๋ํ๋ก์ด๋จผํธ ์ํ๊ฐ ๋ณํฉ๋๋ค. ์ฐ์ Progressing ์ํ์๋ค๊ฐ ์ฑ๊ณต์ด๋ฉด Complete, ์คํจ๋ฉด Failed ์ํ๋ก ๋ณํฉ๋๋ค. kubectl rollout status ๋ช ๋ น์ผ๋ก ๋ฐฐํฌ ์งํ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
์ฌ๊ธฐ์ ํ ํ๋ฆฟ์ .spec.progressDeadlineSeconds ํญ๋ชฉ์ด ์์ ๊ฒฝ์ฐ, ์ฌ๊ธฐ์ ์ง์ ๋ ์๊ฐ์ด ์ง๋ฌ์ ๋๊น์ง ๋ฐฐํฌ๋ฅผ ํ์ง ๋ชปํ ๊ฒฝ์ฐ ์ํ๋ฅผ false๋ก ๋ฐ๋๋๋ก ๊ตฌ์ฑํ ์ ์์ต๋๋ค.
3.4. ๋ฐ๋ชฌ์ธํธ
๋ฐ๋ชฌ์ธํธ(Daemonset)๋ ํด๋ฌ์คํฐ ์ ์ฒด ๋ ธ๋์ ํน์ ํ๋๋ฅผ ์คํํ ๋ ์ฌ์ฉํ๋ ์ปจํธ๋กค๋ฌ์ ๋๋ค. ํด๋ฌ์คํฐ ์์ ์๋กญ๊ฒ ๋ ธ๋๊ฐ ์ถ๊ฐ๋์์ ๋ ๋ฐ๋ชฌ์ธํธ๊ฐ ์๋์ผ๋ก ํด๋น ๋ ธ๋์ ํ๋๋ฅผ ์คํ์ํต๋๋ค. ๋ฐ๋๋ก ๋ ธ๋๊ฐ ํด๋ฌ์คํฐ์์ ๋น ์ง๋๋ ํด๋น ๋ ธ๋์ ์๋ค ํ๋๋ ๊ทธ๋๋ก ์ฌ๋ผ์ง ๋ฟ ๋ค๋ฅธ๊ณณ์ผ๋ก ์ฎ๊ฒจ๊ฐ์ ์คํ๋๊ฑฐ๋ ํ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ฏ๋ก ๋ฐ๋ชฌ์ธํธ๋ ๋ณดํต ๋ก๊ทธ ์์ง๊ธฐ๋ฅผ ์คํํ๊ฑฐ๋ ๋ ธ๋๋ฅผ ๋ชจ๋ํฐ๋งํ๋ ๋ชจ๋ํฐ๋ง์ฉ ๋ฐ๋ชฌ ๋ฑ ํด๋ฌ์คํฐ ์ ์ฒด์ ํญ์ ์คํ์์ผ๋์ด์ผ ํ๋ ํ๋์ ์ฌ์ฉํฉ๋๋ค.
3.4.1. ๋ฐ๋ชฌ์ธํธ ์ฌ์ฉํ๊ธฐ
๋ฐ๋ชฌ์ธํธ๋ฅผ ์ด์ฉํด ๋ก๊ทธ์์ง๊ธฐ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํ ํ๋ฆฟ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ ์ daemonset/daemonset.yaml์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
์ฌ๊ธฐ์ .metadata.namespace ํ๋๊ฐ์ผ๋ก kube-system ๋ค์์คํ์ด์ค๋ฅผ ๋ณ๋๋ก ์ค์ ํ์์ผ๋ฉฐ, ๋ฐ๋ชฌ์ธํธ์ ํ๋๋ฅผ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ๋ฒ์ RollingUpdate(๊ธฐ๋ณธ๊ฐ)๋ก ์ค์ ํ์ฌ ํฌํ๋ฆฟ ๋ณ๊ฒฝ์ ๋ฐ๋ก ๋ณ๊ฒฝ์ฌํญ์ ๋ฐ์ํ๋๋ก ํฉ๋๋ค. ์ถ๊ฐ๋ก .spec.updateStrategy.rollingUpdate.maxUnavailable ํ๋๋ก ํ๋ฒ์ ์ญ์ ํ๋ ํ๋ ๊ฐ์๋ฅผ ์ง์ ํ ์ ์์ผ๋ฉฐ, .spec.minReadySeconds ํ๋๋ก ์๋ก ์คํํ๋ ํ๋๊ฐ ์ค๋น์ํ๊ฐ ๋๋ ์ต์์๊ฐ์ ์ค์ ํ ์ ์์ต๋๋ค.
% kubectl apply -f daemonset/daemonset.yaml
daemonset.apps/fluentd-elasticsearch created
% kubectl get daemonset -n kube-system
NAME DESIRED CURRENT READY UP-TO-DATE AVAILABLE NODE SELECTOR AGE
fluentd-elasticsearch 1 1 1 1 1 <none> 14s
kube-proxy 1 1 1 1 1 kubernetes.io/os=linux 67d
3.4.2. ๋ฐ๋ชฌ์ธํธ์ ํ๋ ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ ๋ณ๊ฒฝํ๊ธฐ
'kubectl edit daemonset fluentd-elasticsearch -n kube-system' ๋ช ๋ น์ผ๋ก ์์์ ์คํํ ๋ฐ๋ชฌ์ธํธ์ ์ค์ ์ ์ด์ด ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์์๋ก .spec.template.spec.containers[].env[].value ํ๋๊ฐ์ value01๋ก ๋ฐ๊พธ๊ณ ์ ์ฅํ์์ผ๋ฉฐ, ํ์ฌ ์ ๋ฐ์ดํธ๋ฐฉ์์ด RollingUpdate์ด๋ฏ๋ก ํ๋๋ ์ฆ์ ์ฌ์์๋ฉ๋๋ค. 'kubectl describe daemonset -n kube-system'์ผ๋ก ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํ ์ ์์ต๋๋ค.
% kubectl edit daemonset fluentd-elasticsearch -n kube-system
% kubectl describe daemonset -n kube-system
์ฌ๊ธฐ์ ๋ง์ฝ ์ ๋ฐ์ดํธ ๋ฐฉ์์ด RollingUpdate๊ฐ ์๋ OnDelete๋ผ๋ฉด? ๋ณ๊ฒฝ์ฌํญ์ด ๋ฐ๋ก ์ ์ฉ๋์ง ์๊ณ ๋ฐ๋ชฌ์ธํธ๋ก ์คํํ ํ๋๋ฅผ ์ง์ ์ง์์ผ ํด๋น ๋ ธ๋์ ์๋ก์ด ํฌํ๋ฆฟ๋ฒ์ ์ ํ๋๊ฐ ์คํ๋๋ ๋ฐฉ์์ ๋๋ค.
์ด๋ฅผ ํ ์คํธํ๊ธฐ ์ํด .spec.template.spec.containers[].env[].value ํ๋๊ฐ์ value02๋ก, .spec.updateStrategy.type ํ๋๊ฐ์ OnDelete๋ก ๋ณ๊ฒฝ ํ 'kubectl get daemonset -n kube-system'๋ก ๋ฐ๋ชฌ์ธํธ๋ฅผ ํ์ธํด๋ณด๋ฉด? UP-TO-DATE ํญ๋ชฉ์ด 0์ผ๋ก ๋ณ๊ฒฝ์ ํ์ผ๋ ์ต์ ์ค์ ์ผ๋ก ๋ณ๊ฒฝ๋์ง ์์์ต๋๋ค.
% kubectl delete pods [ํ๋์ด๋ฆ] -n kube-system
์ด๋ ์์ ๊ฐ์ ๋ช ๋ น์ผ๋ก ํด๋นํ๋๋ฅผ ์ง์ ๋ค๊ฐ ๋ค์ 'kubectl describe daemonset -n kube-system'๋ก ํ์ธํด๋ณด๋ฉด ๋ฐ๋ชฌ์ธํธ๊ฐ ์ต์ ์ํ๋ก ๋ณ๊ฒฝ๋์์์ ์ ์ ์๋ค.
3.5. ์คํ ์ดํธํ์ธํธ
์์ ๋ฐฐ์ ๋ 1,2,3์ ์ ์ปจํธ๋กค๋ฌ๋ค์ ๋ชจ๋ ์ํ๊ฐ ์๋(Stateless) ํ๋๋ค์ ๊ด๋ฆฌํ๋ ์ฉ๋์์ผ๋ฉฐ, ์คํ ์ดํธํ์ธํธ(StatefullSets)๋ ์ํ๊ฐ ์๋ ํ๋๋ค์ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
์คํ ์ดํธํ์ธํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ณผ๋ฅจ(volume)์ ์ฌ์ฉํด ํน์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ ํ ํ๋๋ฅผ ์ฌ์์ํ์ ๋ ํด๋น ๋ฐ์ดํฐ๋ฅผ ์ ์งํฉ๋๋ค. ์ฌ๋ฌ ๊ฐ์ ํ๋ ์ฌ์ด์ ์์๋ฅผ ์ง์ ํด ๊ทธ๋๋ก ์คํ๋๋๋ก ํ ์๋ ์์ต๋๋ค. ์ด๋ฐ ๋ฐฉ์์ผ๋ก ์ด๋ ํ ์ํ๊ฐ ์์ด์ผ ํ ๋ ์ฌ์ฉํฉ๋๋ค.
3.5.1. ์คํ ์ดํธํ์ธํธ ์ฌ์ฉํ๊ธฐ
์คํ ์ดํธํ์ธํธ๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํ ํ ํ๋ฆฟ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ ์ statefulset/statefulset.yaml์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค.
ํด๋น ํ ํ๋ฆฟ์ kind๋ Service๋ก 7์ฅ์์ ์ค๋ช ํ ๋ด์ฉ์ ๋๋ค. ์ด๋ .spec.serviceName ํ๋๊ฐ์ผ๋ก ์ค์ ํ ์๋น์ค๋ฅผ ์ ์ํ๋ฉฐ, ์๋น์ค ์ด๋ฆ๊ณผ ์คํ ์ดํธํ์ธํธ์์ ๋ง๋ค์ด์ง ํ๋ ์ด๋ฆ์ ์กฐํฉํ๋ฉด k8s ํด๋ฌ์คํฐ ์์์ ์ฌ์ฉํ๋ ๋๋ฉ์ธ์ ๋ง๋ค ์ ์์ต๋๋ค([ํ๋์ด๋ฆ].[์๋น์ค์ด๋ฆ] ํ์). ์ถ๊ฐ๋ก .spec.template.spec.terminationGracePeriodSeconds ํ๋๋ก ๊ทธ๋ ์ด์คํ์ ๋๊ธฐ์๊ฐ์ ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์ ๊ทธ๋ ์ด์คํ์ด๋? ์คํ์ค์ธ ํ๋ก์ธ์ค๋ฅผ ์ข ๋ฃํ ๋ ๋ฐ๋ก ํ๋๊ฒ์ด ์๋๋ผ ํ๋ ์์ ์ ๋ง๋ฌด๋ฆฌ ํ ์ ์์ข ๋ฃํ๋ ๊ฒ์ ๋๋ค.
% kubectl apply -f statefulset/statefulset.yaml
service/nginx-statefulset-service created
statefulset.apps/web created
% kubectl get svc,statefulset,pods
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 67d
service/nginx-statefulset-service ClusterIP None <none> 80/TCP 2m26s
NAME READY AGE
statefulset.apps/web 3/3 2m26s
NAME READY STATUS RESTARTS AGE
pod/kubernetes-simple-pod 1/1 Running 2 14d
pod/web-0 1/1 Running 0 2m26s
pod/web-1 1/1 Running 0 2m16s
pod/web-2 1/1 Running 0 2m13s
๊ธฐ์กด๊ณผ ๋ค๋ฅด๊ฒ ํ๋์ด๋ฆ์ UUID ํ์์ ์ ๋ฏธ์ฌ๊ฐ ๋ถ๋๊ฒ ์๋๋ผ web- ์ด๋ ์ด๋ฆ ๋ค์ 0,1,2์ฒ๋ผ ์ซ์๊ฐ ์์๋๋ก ๋ถ๋ ๊ฒ์ ํ์ธํ ์ ์์ผ๋ฉฐ, ํ๋๊ฐ ์คํ๋ ๋ ํด๋น ์์๋ก ์คํ๋์ด ์์ ๊ฒ์ด ์ ์ ์คํ๋์ง ์์๋ค๋ฉด ๋ค์ ํ๋๋ ์คํ๋์ง ์์ต๋๋ค. ์ถ๊ฐ๋ก ์ญ์ ๋ ์คํ์ ์ญ์์ด๋ฉฐ, .spec.replicas ํ๋๊ฐ์ ์ค์ด๋ฉด ํฐ ์๋ถํฐ ์ค์ธ ์ซ์ ๊ฐ์๋งํผ ์ญ์ ๋๋ค.
% kubectl edit statefulset webโ
์์ ๋ช ๋ น์ผ๋ก ์คํ์ค์ธ ์คํ ์ดํธํ์ธํธ์ ์ค์ ์์ .spec.replicas ํ๋๊ฐ์ 3์์ 2๋ก ๋ณ๊ฒฝํ๋ฉด web-2 ํ๋๊ฐ ์ฌ๋ผ์ง๋๋ค.
3.5.2. ํ๋๋ฅผ ์์ ์์ด ์คํํ๊ฑฐ๋ ์ข ๋ฃํ๊ธฐ
์คํ ์ดํธํ์ธํธ์ ๊ธฐ๋ณธ๋์์ ์์๋๋ก ํ๋๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ด์ง๋ง .spec.podManagementPolicy ํ๋๋ก ์์๋ฅผ ์์จ ์๋ ์์ต๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ OrderedReady์ด๊ณ ํ๋๋ฅผ ์์๋๋ก ๊ด๋ฆฌํ์ง๋ง, ์ด๋ฅผ Parallel๋ก ๋ณ๊ฒฝํ๋ฉด ํ๋๋ค์ด ์์์์ด ์คํ๋๊ฑฐ๋ ์ข ๋ฃ๋๋๋ก ํ ์ ์์ต๋๋ค. ๊ธฐ์กด ์คํ ์ดํธํ์ธํธ์์ ์ด๋ฅผ ๋ณ๊ฒฝํ ์ ์๋ค๊ณ ํ๋ ์๋ก์ด ์คํ ์ดํธํ์ธํธ๋ฅผ ์ค์ ํ๊ฒ ์ต๋๋ค.
์คํ ์ดํธํ์ธํธ๋ฅผ ์ด์ฉํด ํ๋๋ฅผ ์์ ์์ด ์คํ/์ข ๋ฃ ์ฌ์ฉํ๊ธฐ ์ํ ํ ํ๋ฆฟ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค. ์์ ์ statefulset/statefulset-parallel.yaml์ ์ฐธ๊ณ ํ์๋ฉด ๋ฉ๋๋ค. ์ด๋ฅผ ์คํํด๋ณด๋ฉด ์ด์ ๊ณผ ๋ค๋ฅด๊ฒ ํ๋๊ฐ ํ๊บผ๋ฒ์ ๋ง๋ค์ด์ง๋ฉฐ, replicas๋ฅผ ์กฐ์ ํ๋๋ผ๋ ๋๋ค์ผ๋ก ์ญ์ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
3.5.3. ์คํ ์ดํธํ์ธํธ๋ก ํ๋ ์ ๋ฐ์ดํธํ๊ธฐ
์คํ ์ดํธํ์ธํธ์ ์ ๋ฐ์ดํธ ๋ฐฉ๋ฒ์ .spec.updateStrategy.type ํ๋์์ ์ค์ ํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ ๊ฐ์ RollingUpdate์ด๋ฉฐ ํฌํ๋ฆฟ ๋ณ๊ฒฝ์ ์๋์ผ๋ก ์์ ํ๋ ์ญ์ ํ ์๋ก์ด ํ๋๋ฅผ ์คํํฉ๋๋ค.
web ์คํ ์ดํธํ ์ธํธ์ kubectl edit statefulset web ๋ช ๋ น์ ์คํํด .spec.template.spec.containers[].env[] ํ๊ฒฝ๋ณ์๋ฅผ ์ถ๊ฐํ๊ณ ์ ์ฅํ๋ฉด ํฌํ๋ฆฟ์ ๋ณ๊ฒฝํจ์ ๋ฐ๋ผ ํ๋๋ค์ด ์ฌ์์๋๋ ๊ฑธ ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ .spec.updateStrategy. rollingUpdate.partition ํ๋ ๊ฐ์ ๋ฐ๊พธ๋ฉด ํด๋น ํ๋์ ์ง์ ๋ ๊ฐ๋ณด๋ค ํฐ ๋ฒํธ๋ฅผ ๊ฐ์ง ํ๋๋ค๋ง ์ ๋ฐ์ดํธ๋ฅผ ์ ์ฉ์ํจ๋ค. ๋ง ๊ทธ๋๋ก ํ๋๋ค์ ๋ถํ ํ๋ ์ญํ ์ด๋ฉฐ, ์ด ๊ฐ์ 1๋ก ์ง์ ํ๊ณ .spec.containers[].env[].value ํ๋๊ฐ์ testvalue04๋ก ๋ณ๊ฒฝํด ์ ์ฅํด๋ณด๋ฉด partition ํ๋์ ๊ฐ๋ณด๋ค ํฐ 1, 2๋ฒ ํ๋๋ง ์ ๋ฐ์ดํธ๊ฐ ์ ์ฉ๋ฉ๋๋ค. ๋ค์์ ๋ช ๋ น์ด๋ก ๋ณ๊ฒฝ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
% kubectl get pods -o jsonpath="{range .items[*]}{.metadata.name}{.spec.containers[0].env}{'\n'}{end}"
๋ง์ฝ partition ํ๋ ๊ฐ์ด replicas ํ๋๋ณด๋ค ํฌ๋ค๋ฉด .spec.template ํ๋์ ๋ณ๊ฒฝ์ฌํญ์ด ์์ด๋ ์ ๋ฐ์ดํธํ์ง ์์ต๋๋ค.
% kubectl describe pod web-0
์ ๋ช ๋ น์ผ๋ก ํ๋์ํ๋ฅผ ํ์ธํด๋ณด๋ฉด labels ํญ๋ชฉ์ statefulset.kubernetes.io/pod-name=web-0์ฒ๋ผ ๋ ์ด๋ธ์ด ์ถ๊ฐ๋ ๊ฒ๋ ํ์ธํ ์ ์์ต๋๋ค. ์ด ๋ ์ด๋ธ์ ์ด์ฉํ๋ฉด ์คํ ์ดํธํ์ธํธ๊ฐ ๊ด๋ฆฌํ๋ ์ ์ฒด ํ๋์ค ํน์ ํ๋์๋ง ์๋น์ค๋ฅผ ์ฐ๊ฒฐํ ์๋ ์์ต๋๋ค.
4. ์๋น์ค
์๋น์ค๋ ์ฌ๋ฌ ๊ฐ ํ๋์ ์ ๊ทผํ ์ ์๋ IP ํ๋๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ค์ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ์ง๋ง ๋ณธ์ง์ ์ผ๋ก ๋ก๋๋ฐธ๋ฐ์ ์ญํ ์ ๋๋ค. ์ด์ฅ์์๋ ์๋น์ค์ ๊ฐ๋ , ํ์ , ์ฌ์ฉ ๋ฐฉ๋ฒ๋ค์ ์์๋ด ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ค์ ์๋น์ค๋ฅผ ๋ค๋ฃจ๋ kube-proxy๋ ์๊ฐํฉ๋๋ค.
4.1. ์๋น์ค์ ๊ฐ๋
์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์ ์ปจํธ๋กค๋ฌ๋ฅผ ์ด์ฉํด์ ํ๋๋ฅผ ์คํํ๋ค๋ฉด ํด๋น ํ๋์ ์ ๊ทผํ๋ ๋ฐฉ๋ฒ์ ์์๋ด์ผ ํ ๋์ ๋๋ค. ํ๋๋ ์ปจํธ๋กค๋ฌ๊ฐ ๊ด๋ฆฌํ๋ฏ๋ก ํ๊ตฐ๋ฐ์ ๊ณ ์ ํด์ ์คํ๋์ง ์๊ณ ํด๋ฌ์คํฐ ์์ ์ฎ๊ฒจ ๋ค๋๋๋ค. ์ด ๊ณผ์ ์์ ๋ ธ๋๋ฅผ ์ฎ๊ธฐ๋ฉด์ ํด๋ฌ์คํฐ ๋ด ํ๋์ IP๊ฐ ๋ณ๊ฒฝ๋๊ธฐ๋ ํ๋๋ฐ, ์ด๋ ๊ฒ ๋์ ์ผ๋ก ๋ณํ๋ ํ๋๋ค์ ๊ณ ์ ์ ์ผ๋ก ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ฟ ๋ฒ๋คํฐ์ค์ ์๋น์ค์ ๋๋ค.
์๋น์ค๋ฅผ ์ฌ์ฉํ๋ฉด ํ๋๊ฐ ํด๋ฌ์คํฐ ์ ์ด๋์ ์๋ ๊ณ ์ ์ฃผ์๋ฅผ ์ด์ฉํด ์ ๊ทผํ ์ ์์ต๋๋ค. ํด๋ฌ์คํฐ ์ธ๋ถ์์ ํด๋ฌ์คํฐ ์ ํ๋์ ์ ๊ทผํ ์ ์์ต๋๋ค. '5. ์ธ๊ทธ๋ ์ค(์ฑ ๋ด 8์ฅ)'์์ ์ค๋ช ํ ์ธ๊ทธ๋ ์ค๋ก ์ ๊ทผํ ์ ์์ง๋ง, ์๋น์ค๋ ์ฃผ๋ก L4 ์์ญ์ด๋ฉฐ ์ธ๊ทธ๋ ์ค๋ L7 ์์ญ์์ ํต์ ํ ๋ ์ฌ์ฉํ๋ค๋ ์ฐจ์ด๊ฐ ์์ต๋๋ค.
4.2. ์๋น์ค ํ์
์๋น์ค ํ์ ์๋ ํฌ๊ฒ ๋ค๊ฐ์ง๊ฐ ์์ต๋๋ค.
- ClusterIP:
- ๊ธฐ๋ณธ ์๋น์ค ํ์ ์ด๋ฉฐ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ์์์๋ง ์ฌ์ฉํ ์ ์์ผ๋ฉฐ, ํด๋ฌ์คํฐ ์ธ๋ถ์์๋ ์ด์ฉํ ์ ์์ต๋๋ค.
- ํด๋ฌ์คํฐ ์ ๋ ธ๋๋ ํ๋์์๋ ํด๋ฌ์คํฐ IP๋ฅผ ์ด์ฉํด์ ์๋น์ค์ ์ฐ๊ฒฐ๋ ํ๋์ ์ ๊ทผํฉ๋๋ค.
- NodePort:
- ์๋น์ค ํ๋์ ๋ชจ๋ ๋ ธ๋์ ์ง์ ๋ ํฌํธ๋ฅผ ํ ๋นํฉ๋๋ค.
- ๋ ธ๋์ ์๊ด์์ด ์๋น์ค์ ์ง์ ๋ ํฌํธ๋ฒํธ๋ง ์ฌ์ฉํ๋ฉด ํ๋์ ์ ๊ทผํ ์ ์์ต๋๋ค.
- ๋ ธ๋์ ํฌํธ๋ฅผ ์ฌ์ฉํ๋ฏ๋ก ํด๋ฌ์คํฐ ์ ๋ฟ๋ง ์๋๋ผ ํด๋ฌ์คํฐ ์ธ๋ถ์์๋ ์ ๊ทผํ ์ ์์ต๋๋ค.
- LoadBalancer:
- AWS, GCP ๊ฐ์ ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋ ์๋น์ค, ์คํ์คํ๊ฐ์ ํ๋ผ์ด๋น ํด๋ผ์ฐ๋, ์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ง์ํ๋ ๋ก๋๋ฐธ๋ฐ์ ์ฅ๋น์์ ์ฌ์ฉํฉ๋๋ค.
- ํด๋ผ์ฐ๋์์ ์ ๊ณตํ๋ ๋ก๋๋ฐธ๋ฐ์์ ํ๋๋ฅผ ์ฐ๊ฒฐํ ํ ํด๋น ๋ก๋๋ฐธ๋ฐ์์ IP๋ฅผ ์ด์ฉํด ํด๋ฌ์คํฐ ์ธ๋ถ์์ ํ๋์ ์ ๊ทผํ ์ ์๋๋ก ํด์ค๋๋ค.
- kubectl get service ๋ช ๋ น์ผ๋ก ์๋น์ค ์ํ๋ฅผ ํ์ธํ๋ฉด EXTERNAL -IP ํญ๋ชฉ์ ๋ก๋๋ฐธ๋ฐ์ IP๋ฅผ ํ์ํฉ๋๋ค. ํด๋น ๋ก๋๋ฐธ๋ฐ์ IP๋ฅผ ์ด์ฉํ์ฌ ํด๋ฌ์คํฐ ์ธ๋ถ์์ ํ๋์ ์ ๊ทผํฉ๋๋ค.
- ExternalName:
- ์๋น์ค๋ฅผ .spec.externalName ํ๋์ ์ค์ ํ ๊ฐ๊ณผ ์ฐ๊ฒฐํ๋ฉฐ, ํด๋ฌ์คํฐ ์์์ ์ธ๋ถ์ ์ ๊ทผํ ๋ ์ฃผ๋ก ์ฌ์ฉํฉ๋๋ค.
- ์ด ์๋น์ค๋ก ํด๋ฌ์คํฐ ์ธ๋ถ์ ์ ๊ทผํ๋ฉด ์ค์ ํด๋ CNAME ๊ฐ์ ์ด์ฉํด ์ ๊ทผํ ์ ์์ต๋๋ค.
- ํด๋ฌ์คํฐ ์ธ๋ถ์ ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ๊ฐ์ด๋ฏ๋ก ์ค์ ํ ๋ ์ ๋ ํฐ(spec.selector ํ๋)๊ฐ ํ์์์ต๋๋ค.
4.3. ์๋น์ค ์ฌ์ฉํ๊ธฐ
์๋น์ค ํ ํ๋ฆฟ์ ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ service/service.yaml ๊ณผ ๊ฐ์ต๋๋ค.
apiVersion: v1
kind: Service
metadata:
name: my-service
spec:
type: ClusterIP
clusterIP: 10.0.10.10
selector:
app: MyApp
ports:
- protocol: TCP
port: 80
targetPort: 9376
- .spec.type ํ๋์์ ์๋น์ค ํ์ ์ ์ค์ ํ ์ ์์ต๋๋ค. .spec.type ํ๋ ๊ฐ์ ์ค์ ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ ํ์ ์ธ ClusterIP์ ๋๋ค.
- .spec.clusterIP ํ๋์์ ํด๋ฌ์คํฐ IP๋ฅผ ์ง์ ์ค์ ํ ์ ์์ต๋๋ค. ์ค์ ํ์ง ์์ผ๋ฉด ์๋์ผ๋ก IP ๊ฐ์ด ํ ๋น๋ฉ๋๋ค.
- .spec.selector ํ๋์๋ ์๋น์ค์ ์ฐ๊ฒฐํ ํ๋์ ์ค์ ํ .labels ํ๋ ๊ฐ์ ์ค์ ํฉ๋๋ค.
- .spec.ports[] ํ๋๋ ๋ฐฐ์ด ํํ์ ๋๋ค. ์๋น์ค์์ ํ๊บผ๋ฒ์ ํฌํธ ์ฌ๋ฌ ๊ฐ๋ฅผ ์ธ๋ถ์ ์ ๊ณตํ ๋๋ .spec.ports[] ํ์์ ํ๋ ๊ฐ์ ์ค์ ํ๋ฉด ๋ฉ๋๋ค.
์ง๊ธ๋ถํฐ ์๋น์ค ํ์ ๊ฐ๊ฐ์ ๋ง๋ค๊ณ ์ฌ์ฉํด๋ณด๊ฒ ์ต๋๋ค. ๋จผ์ ๋ค์ ๋ช ๋ น์ผ๋ก ๋ํ๋ก์ด๋จผํธ๋ก ์์ฑํ๋ ์๋น์ค์ ์ฐ๊ฒฐํ ํ๋๋ฅผ ์คํํฉ๋๋ค.
% kubectl create deployment nginx-for-service --image=nginx --replicas=2 --port=80
deployment.apps/nginx-for-service created
nginx ์ปจํ ์ด๋๋ฅผ ์คํํ๋ nginx-for-service๋ผ๋ ์ด๋ฆ์ ํ๋์ ๋๋ค. ํฌํธ ๋ฒํธ๋ 80, ์๋น์ค์์ ์ฌ์ฉํ ๋ ์ด๋ธ์ ํค app, ๊ฐ์ nginx-for-svc๋ก ์ ์ํ์ต๋๋ค.
4.3.1. ClusterIP ํ์ ์๋น์ค ์ฌ์ฉํ๊ธฐ
์๋น์คํ์ ์ด ClustreIP์ธ ์๋น์ค๋ฅผ ๋ง๋๋ ์ค์ ์ service/clusterip.yaml ๊ณผ ๊ฐ์ต๋๋ค.
% kubectl apply -f ./service/clusterip.yaml
service/clusterip-service created
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
clusterip-service ClusterIP 10.104.210.96 <none> 80/TCP 72s
kubernetes ClusterIP 10.96.0.1 <none> 443/TCP 80d
nginx-statefulset-service ClusterIP None <none> 80/TCP 13d
- TYPE ํญ๋ชฉ์ด ClusterIP๊ณ CLUSTER-IP ํญ๋ชฉ์ 10.104.210.96๋ก ํด๋ฌ์คํฐ IP๊ฐ ์์ฑ๋์์ผ๋ฉฐ, PORT๋ 80 ํฌํธ์ ์ฐ๊ฒฐ๋์์ต๋๋ค.
- ๋ํ ClusterIP์ ์ธ๋ถ์์ ์ ๊ทผํ ์ ์์ผ๋ฏ๋ก ์ธ๋ถ IP๊ฐ ์์ผ๋ฏ๋ก EXTERNAL-IP ํญ๋ชฉ์ <none>์ ๋๋ค.
kubectl describe service <NAME>์ผ๋ก ํด๋น ์๋น์ค์ ๋ํด ๋์ฑ ์์ธํ ํ์ธํ ์ ์์ต๋๋ค.
% kubectl describe service clusterip-service
Name: clusterip-service
Namespace: default
Labels: <none>
Annotations: <none>
Selector: app=nginx-for-svc
Type: ClusterIP
IP Family Policy: SingleStack
IP Families: IPv4
IP: 10.104.210.96
IPs: 10.104.210.96
Port: <unset> 80/TCP
TargetPort: 80/TCP
Endpoints: 10.1.0.22:80
Session Affinity: None
Events: <none>
% kubectl run -it --image nicolaka/netshoot testnet -- bash
bash-5.0# curl 10.104.210.96
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
...
4.3.2. NodePort ํ์ ์๋น์ค ์ฌ์ฉํ๊ธฐ
์๋น์คํ์ ์ด NodePort์ธ ์๋น์ค๋ฅผ ๋ง๋๋ ์ค์ ์ service/nodeport.yaml ๊ณผ ๊ฐ์ต๋๋ค.
% kubectl apply -f ./service/nodeport.yaml
service/nodeport-service created
NodePort์ ๊ฒฝ์ฐ ํด๋น ํฌํธ๋ก ์ธ๋ถ์์ ์ ๊ทผ๊ฐ๋ฅํ๋ฉฐ, ํด๋น ํ ํ๋ฆฟ์์๋ .spec.ports[].nodePort: 30080๋ก ํฌํธ๊ฐ ์ค์ ๋์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์น ๋ธ๋ผ์ฐ์ ์์ localhost:30080์ผ๋ก ์ ์ํ๋ฉด nginx ๊ธฐ๋ณธ ํ๋ฉด์ด ๋์ค๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
4.3.3. LoadBalancer ํ์ ์๋น์ค ์ฌ์ฉํ๊ธฐ
์๋น์คํ์ ์ด LoadBalancer์ธ ์๋น์ค๋ฅผ ๋ง๋๋ ์ค์ ์ service/loadbalancer.yaml ๊ณผ ๊ฐ์ต๋๋ค.
% kubectl apply -f ./service/loadbalancer.yaml
service/loadbalancer-service created
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) 80d
loadbalancer-service LoadBalancer 10.104.228.235 localhost 80:30920/TCP 58s
ํ์ฌ ์ค์ตํ๊ฒฝ์ด ๋์ปค ๋ฐ์คํธํฑ์ด๊ธฐ์ ์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์๊ฐ ์์ด EXTERNAL-IP ํญ๋ชฉ์ด localhost๋ก ๋ํ๋ฉ๋๋ค. ๋ง์ฝ ์ธ๋ถ ๋ก๋๋ฐธ๋ฐ์์ ์ฐ๊ณ๋์ด ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ๊ฐ ์ค์ ๋ ์ํ๋ผ๋ฉด ์ค์ ์ธ๋ถ์์ ์ ๊ทผ๊ฐ๋ฅํ IP๊ฐ ๋ํ๋ ๊ฒ์ ๋๋ค.
4.3.3. ExternalName ํ์ ์๋น์ค ์ฌ์ฉํ๊ธฐ
์๋น์คํ์ ์ด ExternalName์ธ ์๋น์ค๋ฅผ ๋ง๋๋ ์ค์ ์ service/externalname.yaml ๊ณผ ๊ฐ์ต๋๋ค.
% kubectl apply -f ./service/externalname.yaml
service/externalname-service created
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
externalname-service ExternalName <none> google.com <none> 15s
ํด๋ฌ์คํฐ ์์์ ์ฌ์ฉํ์ง ์์ผ๋ฏ๋ก CLUSTER-IP ํญ๋ชฉ์ด <none>์ ๋๋ค. ๋ํ EXTERNAL-IP๋ .spec.externalName์์ ์ค์ ํ google.com์ผ๋ก ํ์ธํ ์ ์์ต๋๋ค.
% kubectl run -it --image nicolaka/netshoot testnet -- bash
bash-5.0# curl externalname-service.default.svc.cluster.local
<!DOCTYPE html>
<html lang=en>
<meta charset=utf-8>
<meta name=viewport content="initial-scale=1, minimum-scale=1, width=device-width">
<title>Error 404 (Not Found)!!1</title>
...
ExternalName ํ์ ์๋น์ค์ ํด๋ฌ์คํฐ ๋ด๋ถ ๋๋ฉ์ธ์ externalname-service.default.svc.cluster.local์ด๋ฉฐ, curl๋ก ํด๋น ๋๋ฉ์ธ์ ์ ์๋ณด๋ฉด ์ค์ google.com์ HTML ๋งํฌ์ ์ด ์ถ๋ ฅ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
4.4. ํค๋๋ฆฌ์ค ์๋น์ค
.spec.clusterIP ํ๋ ๊ฐ์ None์ผ๋ก ์ค์ ํ๋ฉด ํด๋ฌ์คํฐ IP๊ฐ ์๋ ์๋น์ค๋ฅผ ๋ง๋ค ์ ์์ผ๋ฉฐ, ์ด๋ฅผ ํค๋๋ฆฌ์ค ์๋น์ค๋ผ ํฉ๋๋ค. ๋ก๋๋ฐธ๋ฐ์ฑ์ด ํ์ ์๊ฑฐ๋ ๋จ์ผ ์๋น์ค IP๊ฐ ํ์์์ ๋ ์ฌ์ฉํฉ๋๋ค.
ํค๋๋ฆฌ์ค ์๋น์ค์ ์ ๋ ํฐ๋ฅผ ์ค์ ํ๋ฉด ์ฟ ๋ฒ๋คํฐ์ค API๋ก ํ์ธํ ์ ์๋ ์๋ํฌ์ธํธ๊ฐ ๋ง๋ค์ด์ง๋๋ค. ์ฌ๊ธฐ์ ์ ๋ ํฐ๊ฐ ์์ผ๋ฉด ์๋ํฌ์ธํธ๊ฐ ๋ง๋ค์ด์ง์ง ์์ผ๋ฉฐ ์ ๋ ํฐ๊ฐ ์๋๋ผ๋ DNS ์์คํ ์ ExternalName ํ์ ์ ์๋น์ค์์ ์ฌ์ฉํ CNAME ๋ ์ฝ๋๊ฐ ๋ง๋ค์ด์ง๋๋ค.
% kubectl apply -f ./service/headless.yaml
service/headless-service created
% kubectl get svc
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
headless-service ClusterIP None <none> 80/TCP 7s
% kubectl describe svc headless-service
...
Endpoints: 10.1.0.22:80
IP ํญ๋ชฉ์ None์ด์ง๋ง Endpoints ํญ๋ชฉ์๋ .spec.selectorํ๋์์ ์ ํํ ์กฐ๊ฑด์ ๋ง๋ ํ๋๋ค์ IP์ ํฌํธ ์ ๋ณด๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
DNS A ๋ ์ฝ๋๊ฐ ๋ง๋ค์ด์ ธ ์๋์ง ํ์ธํ๋ ค๋ฉด nicolaka/netshoot ์ด๋ฏธ๋ฅผ ์ด์ฉํ ํ๋๋ฅผ ๋ง๋ค๊ณ dig <๋๋ฉ์ธ ์ด๋ฆ> ๋ช ๋ น์ ์คํํฉ๋๋ค.
% kubectl run -it --image nicolaka/netshoot testnet -- bash
bash-5.0# dig headless-service.default.svc/cluster.local
4.5. kube-proxy
kube-proxy๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ์๋น์ค๋ฅผ ๋ง๋ค์์ ๋ ํด๋ฌ์คํฐ IP๋ ๋ ธ๋ ํฌํธ๋ก ์ ๊ทผํ ์ ์๊ฒ ๋ง๋ค์ด ์ค์ ์กฐ์์ ํ๋ ์ปดํฌ๋ํธ์ ๋๋ค. ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ ธ๋๋ง๋ค ์คํ๋๋ฉด์ ํด๋ฌ์คํฐ ๋ด๋ถ IP๋ก ์ฐ๊ฒฐํ๋ ค๋ ์์ฒญ์ ์ ์ ํ ํ๋๋ก ์ ๋ฌํฉ๋๋ค.
kube-proxy๊ฐ ๋คํธ์ํฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ userspace, iptables, IPVS๊ฐ ์์ต๋๋ค. ์ด๊ธฐ์ userspace๊ฐ ๊ธฐ๋ณธ ๊ด๋ฆฌ๋ชจ๋์๊ณ ํ์ฌ iptables๊ฐ ๊ธฐ๋ณธ ๊ด๋ฆฌ ๋ชจ๋์ ๋๋ค. ์์ผ๋ก๋ IPVS๋ก ๊ธฐ๋ณธ ๊ด๋ฆฌ ๋ชจ๋๊ฐ ๋ฐ๋ ๊ฒ์ผ๋ก ์์ํฉ๋๋ค.
4.5.1. userspace ๋ชจ๋
- ํด๋ผ์ด์ธํธ์์ ์๋น์ค์ ํด๋ฌ์คํฐ IP๋ฅผ ํตํด ์ด๋ค ์์ฒญ์ ํ๋ฉด iptable์ ๊ฑฐ์ณ์ kube-proxy๊ฐ ์์ฒญ์ ๋ฐ์ต๋๋ค.
- ๊ทธ๋ฆฌ๊ณ ์๋น์ค์ ํด๋ฌ์คํฐ IP๋ ์ฐ๊ฒฐ๋์ด์ผ ํ๋ ์ ์ ํ ํ๋๋ก ์ฐ๊ฒฐํด์ค๋๋ค.
- ์ด๋ ์์ฒญ์ ๋์์ค ๋๋ ๋ผ์ด๋ ๋ก๋น ๋ฐฉ์์ ์ฌ์ฉํฉ๋๋ค.
4.5.2. iptables ๋ชจ๋
- userspace ๋ชจ๋์ ๋ค๋ฅธ ์ ์ kube-proxy๊ฐ iptable๋ฅผ ๊ด๋ฆฌํ๋ ์ญํ ๋ง ํ์ฌ, ์ง์ ํด๋ผ์ด์ธํธ์์ ํธ๋ํฝ์ ๋ฐ์ง ์์ต๋๋ค.
4.5.3. IPVS ๋ชจ๋
- IPVS ๋ชจ๋๋ ๋ฆฌ๋ ์ค ์ปค๋ ์ ๋คํธ์ํฌ ๊ด๋ จ ํ๋ ์์ํฌ์ธ ๋ทํํฐ์ ํฌํจ๋์ด ์๋ L4 ๋ก๋๋ฐธ๋ฐ์ฑ ๊ธฐ์ ์ ๋๋ค. ๋ฐ๋ผ์ IPVS ์ปค๋ ๋ชจ๋์ด ๋ ธ๋์ ์ค์น๋์ด์ผ ํฉ๋๋ค.
- IPVS ๋ชจ๋๋ ์ปค๋ ๊ณต๊ฐ์์ ๋์ํ๊ณ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํด์ ํ ์ด๋ธ๋ก ์ ์ฅํ๊ธฐ ๋๋ฌธ์ iptables ๋ชจ๋๋ณด๋ค ๋น ๋ฅด๊ณ ์ข์ ์ฑ๋ฅ์ ๋ ๋๋ค. ๋ํ ๋ ๋ง์ ๋ก๋๋ฐธ๋ฐ์ฑ ์๊ณ ๋ฆฌ์ฆ์ด ์์ด์ ์ด๋ฅผ ์ด์ฉํ ์ ์์ต๋๋ค.
์ฐธ๊ณ
- ์ ์์ฒ, ํ์์ฉ, ์ ๊ฒฝ๋ก, ๊ณต์ฉ์ค. ใ์ฟ ๋ฒ๋คํฐ์ค ์ ๋ฌธ: 90๊ฐ์ง ์์ ๋ก ๋ฐฐ์ฐ๋ ์ปจํ ์ด๋ ๊ด๋ฆฌ ์๋ํ ํ์คใ. ์ฎ๊ธด์ด(์ญ). ๋์๋ถ์ค(๋์books), 2020.01.
- [Github] kubernetes-book-sample: https://github.com/arisu1000/kubernetes-book-sample
- [Official Docs] Hello Minikube: https://kubernetes.io/docs/tutorials/hello-minikube/
- [Official Docs] : https://kubernetes.io/docs/concepts/overview/working-with-objects/kubernetes-objects/