
๐ฏ Kubernetes์ ๋ํด ์ ๋ฆฌํฉ๋๋ค.
์ถ์ฒ: gabia
ํ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ๋ฌ ๊ฐ์ ์์ ์๋น์ค๋ก ๋๋์ด ๊ฐ๋ฐ ๋ฐ ์ด์ํ๋ ์ํคํ ์ฒ ์คํ์ผ์ ๋๋ค.
๊ฐ ์๋น์ค๋ ์์ฒด์ ์ผ๋ก ๋ฐฐํฌ ๋ฐ ํ์ฅ์ด ๊ฐ๋ฅํฉ๋๋ค.
์๋น์ค ๊ฐ ํต์ ์ ๋ณดํต API๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
ํ๋์ ์๋น์ค์ ์ฅ์ ๊ฐ ๋ฐ์ํ๋๋ผ๋, ๋ค๋ฅธ ์๋น์ค๋ ์ํฅ์ ๋ฐ์ง ์๊ณ ๋์ํ ์ ์์ต๋๋ค.
๊ฐ๋ฐ๊ณผ ์ ์ง๋ณด์, ๋ฐฐํฌ๊ฐ ์ ์ฐํ๊ณ ํจ์จ์ ์ ๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ ๊ฐ๊ฐ์ ์๋น์ค๊ฐ ๋ ๋ฆฝ์ ์ผ๋ก ์คํ๋์ด์ผ ํ๋ฏ๋ก, ์ปจํ ์ด๋ ๋ชจ๋ธ๊ณผ ๋งค์ฐ ์ ์ด์ธ๋ฆฝ๋๋ค.
์ปจํ ์ด๋๋ ์๋น์ค๋ฅผ ๊ฒฉ๋ฆฌ๋ ๋จ์๋ก ์คํํ ์ ์๋๋ก ๋์์ค๋๋ค.
์ด๋์๋ ๋์ผํ ํ๊ฒฝ์์ ๋์ํ๊ธฐ ๋๋ฌธ์, ์ผ๊ด์ฑ๊ณผ ์ด์์ฑ์ด ๋ฐ์ด๋ฉ๋๋ค.
๋ฐ๋ผ์ ๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ ๋๋ ์ปจํ ์ด๋ ๊ธฐ๋ฐ์ ์ด์ ํ๊ฒฝ์ด ๋งค์ฐ ํจ๊ณผ์ ์ ๋๋ค.
๋ชจ๋๋ฆฌ์ ์ํคํ ์ฒ (Monolithic Architecture)
๋ชจ๋ ๊ธฐ๋ฅ์ด ํ๋์ ํฐ ์ ํ๋ฆฌ์ผ์ด์ ์์ ํตํฉ๋์ด ์์ผ๋ฉฐ, ํ๋์ ๋ฉ์ด๋ฆฌ๋ก์ ๋์ํฉ๋๋ค.
๋ฐฐํฌ๋ ์ ์ง๋ณด์๊ฐ ์ด๋ ต๊ณ , ํ๋์ ๋ฌธ์ ๊ฐ ์ ์ฒด ์์คํ ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
๋ง์ดํฌ๋ก์๋น์ค ์ํคํ ์ฒ (MSA)
์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ฅ ๋จ์๋ก ๋๋์ด ๊ฐ๊ฐ์ ์๋น์ค๋ฅผ ๋ ๋ฆฝ์ ์ผ๋ก ๊ฐ๋ฐํ๊ณ ๋ฐฐํฌํ ์ ์๋๋ก ๊ตฌ์ฑํฉ๋๋ค.
๊ฐ ์๋น์ค๋ ํน์ ํ ๊ธฐ๋ฅ์ ๋ด๋นํ๋ฉฐ, ์๋ก ์ฐ๊ฒฐ๋์ด ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ฑํฉ๋๋ค.
๐ ๋ฐฐํฌ ๊ตฌ์กฐ์ ๋ณํ ์์ฝ
์ถ์ฒ: https://fullstackdeeplearning.com/
1. Traditional Deployment
- ํ๋์ ์๋ฒ์ ๋ชจ๋ ๊ฑธ ์ฌ๋ฆฌ๋ ๊ตฌ์กฐ
- ๋ชจ๋๋ฆฌ์ ์ํคํ ์ฒ์ ํด๋นํ๋ฉฐ, ํ์ฅ์ฑ๊ณผ ์ ์ฐ์ฑ์ด ๋ถ์กฑํจ
2. Virtualized Deployment
- ๊ฐ์ ๋จธ์ ์ ์ด์ฉํด ๊ฒฉ๋ฆฌ์ฑ์ ํ๋ณด
- ํ์ง๋ง ๊ฐ VM์ด ๋ฌด๊ฑฐ์ ์์ ๋ญ๋น๊ฐ ํผ
3. Container Deployment
- ์ปจํ ์ด๋ ๊ธฐ์ ๋ก ๊ฐ๋ณ๊ณ ๋น ๋ฅธ ์คํ ๊ฐ๋ฅ
- ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ๊ฐ ์ปจํ ์ด๋๋ก ๋ถ๋ฆฌํ์ฌ ์คํํ๋ ๋ฐ ์ ํฉ
4. Kubernetes Deployment
- ์ปจํ ์ด๋๊ฐ ๋ง์์ง๋ฉด์ ์ฌ๋ฌ ๋์ ์๋ฒ์ ๋ถ์ฐ๋์ด ์คํ, ์ด๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๊ณ ์กฐ์จํ๋ ๋๊ตฌ๊ฐ ํ์ํด์ง
- Kubernetes๋ ๋ง์ดํฌ๋ก์๋น์ค ํ๊ฒฝ์์ ์ปจํ ์ด๋๋ฅผ ํจ์จ์ ์ผ๋ก ๋ฐฐ์น, ์คํ, ๋ณต๊ตฌ, ํ์ฅํ ์ ์๋๋ก ๋์์ค
- โจ ์ปจํ ์ด๋๊ฐ ์๊ธฐ ๋๋ฌธ์ ๊ฐ ์๋ฒ(๋ ธ๋)๋ง๋ค Docker์ ๊ฐ์ ์ปจํ ์ด๋ ๋ฐํ์์ด ์ค์น๋์ด ์์ด์ผ ํ๋ฉฐ, Kubernetes๋ ์ด๋ฌํ Docker ํ๊ฒฝ๋ค์ ์ฌ๋ฌ ๊ฐ์ ์์ปค ๋ ธ๋(์ค์ ๋ก ์คํํ๋ ์๋ฒ)๋ก ๋ฌถ์ด ํ๋์ ํด๋ฌ์คํฐ๋ก ๊ตฌ์ฑ๋จ
๐ ๋ง์ดํฌ๋ก์๋น์ค๋ ๊ฐ๋ณ์ ์ผ๋ก ์คํ๋๋ ์ปจํ ์ด๋๊ฐ ๋ง์์ง๊ธฐ ๋๋ฌธ์, ์ด๋ฅผ ํตํฉ์ ์ผ๋ก ๊ด๋ฆฌํด์ค ์ ์๋ '์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ๋๊ตฌ'๊ฐ ๊ผญ ํ์ํฉ๋๋ค. ๊ทธ ์ค ๊ฐ์ฅ ๋ํ์ ์ธ ๋๊ตฌ๊ฐ ๋ฐ๋ก Kubernetes์ ๋๋ค.
์ถ์ฒ: wikimedia
Kubernetes (์ค์ฌ์ k8s)๋ ์ปจํ ์ด๋ ์ค์ผ์คํธ๋ ์ด์ ์๋ฃจ์ , ์ฆ ์ปจํ ์ด๋๋ค์ ์งํํ๊ณ ์กฐ์จํ๋ ๋๊ตฌ์ ๋๋ค.
Docker ์ปจํ ์ด๋๋ค๊ณผ ํจ๊ป ์ฌ์ฉํ๊ธฐ ์ ํฉํฉ๋๋ค.
ํด๋ฌ์คํฐ ๋ด์์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ์คํํ๊ณ ๊ด๋ฆฌํ ์ ์์ด CI/CD ํ์ดํ๋ผ์ธ์์๋ ์ ์ฉํ๊ฒ ์ฐ์ ๋๋ค.
๊ฐ ์ปจํ
์ด๋๋ Pod๋ผ๋ k8s ์ค๋ธ์ ํธ ๋จ์๋ก ์คํ๋ฉ๋๋ค.
ํด๋ฌ์คํฐ(Cluster)๋ ์ฌ๋ฌ ๋์ ์ปดํจํฐ(์๋ฒ)๋ฅผ ํ๋์ฒ๋ผ ๋ฌถ์ด์ ๋์ํ๊ฒ ๋ง๋ ์์คํ
๋จ์๋ก Kubernetes์์๋ ์ปจํ
์ด๋๋ฅผ ๊ด๋ฆฌํ๋ ์๋ฒ๋ค์ ์งํฉ์ ํด๋ฌ์คํฐ๋ผ๊ณ ํฉ๋๋ค.
์ถ์ฒ: Kubernetes
Kubernetes ํด๋ฌ์คํฐ๋ ํฌ๊ฒ ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์์ต๋๋ค.
1๏ธโฃ ๋ง์คํฐ ๋ ธ๋ (์ปจํธ๋กค ํ๋ ์ธ)
API Server (api)
kubectl ๋ฑ ์ธ๋ถ์์ ์ค๋ ์์ฒญ์ ๋ฐ์๋ค์ด๋ ํด๋ฌ์คํฐ์ ์
๊ตฌ์
๋๋ค.
๋ชจ๋ ๋ช ๋ น์ ์ด๊ณณ์ ํตํด ํด๋ฌ์คํฐ ๋ด๋ถ ์ปดํฌ๋ํธ๋ก ์ ๋ฌ๋ฉ๋๋ค.
๐ค
kubectl๋ ๋ฌด์์ผ๊น?์ฌ์ฉ์๊ฐ ํด๋ฌ์คํฐ๋ฅผ ์กฐ์ํ๊ธฐ ์ํด ์ฌ์ฉํ๋ CLI ๋๊ตฌ์ ๋๋ค.
etcd
ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ์ ์ฅํ๋ Key-Value ์ ์ฅ์์ ๋๋ค.
์ด๋ค Pod๊ฐ ์ด๋์ ์๋์ง, ๋ ธ๋ ์ํ ๋ฑ ๋ชจ๋ ์ ๋ณด๊ฐ ์ฌ๊ธฐ์ ๊ธฐ๋ก๋ฉ๋๋ค.
๐ค
Pod๋ ๋ฌด์์ผ๊น?
Pod๋ ํ๋ ์ด์์ ์ปจํ ์ด๋๋ฅผ ๊ฐ์ธ๊ณ ์๋ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก, ๊ฐ์ ๋คํธ์ํฌ ๊ณต๊ฐ(IP)๊ณผ ์คํ ๋ฆฌ์ง๋ฅผ ๊ณต์ ํฉ๋๋ค.
Pod๋ ์์ปค ๋ ธ๋(Node) ์์์ ์คํ๋ฉ๋๋ค.kubelet์ดPod๋ฅผ ์คํ์ํค๋ ์ญํ ์ ํ๋ ์ปจํธ๋กค๋ฌ์ด๊ธฐ ๋๋ฌธ์,Pod๋kubelet๋ฐ์์ ์ค์ ๋ก ๋์๊ฐ๊ณ ์๋ ์คํ ์ ๋์ ๋๋ค.
๐งช ์ ๊ทธ๋ฅ ์ปจํ ์ด๋๊ฐ ์๋๋ผ
Pod์ผ๊น?Kubernetes๋ Docker ์ปจํ ์ด๋๋ง ์ง์ ๋ค๋ฃจ์ง ์๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ์ปจํ ์ด๋๋ฅผ ํ๋์ ๋ ผ๋ฆฌ์ ๋จ์์ธ Pod์ผ๋ก ๋ฌถ์ด ํด๋ฌ์คํฐ ๋ด์์ ํจ์จ์ ์ผ๋ก ๋ฐฐํฌํ๊ณ ์ด์ํฉ๋๋ค.
Controller Manager (c-m)
Cloud Controller Manager (c-c-m)
Scheduler (sched)
2๏ธโฃ (์์ปค) ๋ ธ๋
์ปจํ ์ด๋ ๋ฐํ์(CRI; Container Runtime Interface)
kubelet
kube-proxy (k-proxy)
์ปจํ ์ด๋ ๋ฐธ๋ฐ์ฑ
Pod์ ๋ถํ ๊ท ๋ฑํ๋ฅผ ์๋์ผ๋ก ์ํํฉ๋๋ค. ๋ช ๊ฐ์ ์์ฉ์ ๋ณต์ ํ ์ง ์ค์ ๋ง ํ๋ฉด, Kubernetes๊ฐ ์์์ ์ ์ ํ๊ฒ ๋ถ์ฐ ๋ฐฐ์นํฉ๋๋ค.ํธ๋ํฝ ๋ก๋ ๋ฐธ๋ฐ์ฑ
Pod)์ด ์ฌ๋ฌ ๊ฐ์ผ ๊ฒฝ์ฐ, ์ธ๋ถ ๋๋ ๋ด๋ถ์์ ๋ค์ด์ค๋ ์์ฒญ์ ์๋์ผ๋ก ๋ถ์ฐ์์ผ ์๋น์ค์ ์์ ์ฑ์ ์ ์งํฉ๋๋ค.๋์ ์ํ ์ค์ผ์ผ๋ง
Pod ์๋ฅผ ์๋์ผ๋ก ํ์ฅํ๊ฑฐ๋ ์ถ์ํฉ๋๋ค. ์ด๋ฅผ ํตํด ์์คํ
์์์ ํจ์จ์ ์ผ๋ก ํ์ฉํ ์ ์์ต๋๋ค.์ค๋ฅ ๋ณต๊ตฌ
Pod๋ ๋
ธ๋์ ์ฅ์ ๊ฐ ๋ฐ์ํ์ ๊ฒฝ์ฐ, Kubernetes๋ ์ด๋ฅผ ๊ฐ์งํ๊ณ ์๋์ผ๋ก ์๋ก์ด Pod ๋ฅผ ์์ฑํ์ฌ ๋ณต๊ตฌํฉ๋๋ค.๋กค๋ง ์ ๋ฐ์ดํธ
์คํ ๋ฆฌ์ง ์ค์ผ์คํธ๋ ์ด์
Pod์ ํ์ํ ๋ณผ๋ฅจ์ ์๋์ผ๋ก ์ฐ๊ฒฐํด์ค๋๋ค.์๋น์ค ๋์ค์ปค๋ฒ๋ฆฌ
Pod์ IP๋ ๋์ ์ผ๋ก ๋ฐ๋๊ธฐ ๋๋ฌธ์, ์์ฒด DNS๋ฅผ ์ด์ฉํด ์์ ์ ์ธ ์ ์ ์ฃผ์๋ฅผ ์ ๊ณตํฉ๋๋ค.์ฌ์ฉ์๊ฐ kubectl์ ํตํด API ์๋ฒ์ Pod ์์ฑ์ ์์ฒญํฉ๋๋ค.
API ์๋ฒ๋ ์์ฒญ์ ๋ฐ์ etcd์ ์ํ๋ฅผ ๊ธฐ๋กํ๊ณ , ํด๋ฌ์คํฐ ์ํ๋ฅผ ์ต์ ์ผ๋ก ์ ์งํ๋ ค๊ณ ํฉ๋๋ค.
์ปจํธ๋กค๋ฌ ๋งค๋์ ๊ฐ Pod๋ฅผ ์์ฑํ๊ณ , ๊ทธ ์ ๋ณด๋ฅผ API ์๋ฒ์ ์ ๋ฌํฉ๋๋ค. (์์ง ์ด๋ค ๋
ธ๋์ ์คํ๋ ์ง๋ ์ ํด์ง์ง ์์)
์ค์ผ์ค๋ฌ๊ฐ Pod๋ฅผ ์คํํ ์ ์ ํ ์์ปค ๋
ธ๋๋ฅผ ์ ํํฉ๋๋ค.
ํด๋น ๋
ธ๋์ kubelet์ด ์ปจํ
์ด๋ ๋ฐํ์(CRI)์ ์์ฒญํ์ฌ Pod๋ฅผ ์์ฑํ๊ณ ์คํํฉ๋๋ค.
๐ก Kubernetes๋ ์ ์ฐจํ์ด ์๋๋ผ ์ ์ธํ ๊ตฌ์กฐ๋ฅผ ๋ฐ๋ฆ ๋๋ค. ์ํ๋ ์ํ๋ฅผ ์ ์ธํ๋ฉด, ํ์ฌ ์ํ์ ๋น๊ตํ์ฌ ์ด๋ฅผ ์ง์์ ์ผ๋ก ๋ง์ถ๊ธฐ ์ํด ๋์ํฉ๋๋ค.
โ๏ธ ๊ด๊ณ ๊ตฌ์กฐ
Node โโโ Pod A โ โโโ Container 1 โ โโโ Container 2 โโโ Pod B โ โโโ Container 3 โโโ Pod C โโโ Container 4
์ถ์ฒ: ๊ฐ์ธ๋ธ๋ก๊ทธ https://blog.taehun.dev/from-zero-to-hero-mlops-tools-3-1
Namespace
Deployment
Pod์ ์ ์ธ, ๋ฐฐํฌ, ์
๋ฐ์ดํธ, ๋ณต์ ๋ฑ์ ์๋ํํ๊ธฐ ์ํ ์ปจํธ๋กค๋ฌ์
๋๋ค.
๋ด๋ถ์ ์ผ๋ก ReplicaSet์ ์ด์ฉํด Pod ์๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ๋ฒ์ ๋ณ๊ฒฝ ์ ๋กค๋ง ์
๋ฐ์ดํธ๋ฅผ ์ง์ํฉ๋๋ค.
ReplicaSet
ํน์ ์์ Pod๋ฅผ ํญ์ ์ ์งํด์ฃผ๋ ์ปจํธ๋กค๋ฌ์ ๋๋ค.
์๋ฅผ ๋ค์ด 3๊ฐ์ Pod๊ฐ ์ค์ ๋์ด ์์ ๋, ํ๋๊ฐ ์ฃฝ์ผ๋ฉด ์๋์ผ๋ก ์๋ก ์์ฑํฉ๋๋ค.
Volume
Pod๊ฐ ์์ฑ๋ ๋ Pod์ ๋ง์ดํธ๋๋ ์ ์ฅ ๊ณต๊ฐ์ผ๋ก, ์ปจํ
์ด๋ ๊ฐ ๋ฐ์ดํฐ ๊ณต์ ๋ฑ์ ์ฌ์ฉ๋ฉ๋๋ค.Service
์ฌ๋ฌ Pod ์์ ์๋ ๋คํธ์ํฌ ์ ๊ทผ ์ง์ ์
๋๋ค.
Pod๋ IP๊ฐ ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์, ์์ ์ ์ธ ์ ๊ทผ์ ์ํด ๊ณ ์ ๋ ์๋ํฌ์ธํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
์๋น์ค์ ๋ค๋ฅธ ํํ๋ค


์ถ์ฒ: ๊ฐ์ธ๋ธ๋ก๊ทธ ExternalName
Ingress
์ธ๋ถ ์ฌ์ฉ์์ HTTP/HTTPS ์์ฒญ์ Service๋ก ๋ผ์ฐํ ํด์ฃผ๋ ์ญํ ์ ํฉ๋๋ค.
์ธ๋ถ์์ ํ๋์ IP๋ก ์ฌ๋ฌ ์๋น์ค์ ์ ๊ทผํ ์ ์๋๋ก ํ๊ธฐ ์ํ ์ง์
์ง์ ์
๋๋ค.
์ถ์ฒ: geeksforgeeks
๋ก์ปฌ ํ๊ฒฝ ๊ตฌ์ถ
kubeadm, Docker Desktop ๋ฑ์ ํตํด ๊ฐ๋จํ ํ
์คํธ์ฉ ํด๋ฌ์คํฐ๋ฅผ ๊ตฌ์ฑํ ์ ์์ต๋๋ค.ํผ๋ธ๋ฆญ ํด๋ผ์ฐ๋ ์๋น์ค
Amazon AWS EKS (Elastic Kubernetes Services)
GCP GKE (Google Kubernetes Engine)
Microsoft AKS (Azuer Kubernetes Service)
์จํ๋ ๋ฏธ์ค ์ค์นํ ์๋ฃจ์
SUSE Rancher
RedHat OpenShift
Docker Desktop > Settings > Kubernetes > Enable Kubernetes โ
ํ ๊ธ์ ํ์ฑํํฉ๋๋ค.kubectl get nodes ๋ช
๋ น์ด ์คํ โ ๋
ธ๋๊ฐ ์ ๋ฑ๋ก๋์๋์ง ํ์ธํฉ๋๋ค.์ฟ ๋ฒ๋คํฐ์ค์์ Pod๋ฅผ ์ง์ ์คํํด๋ณด๊ณ , Deployment๋ฅผ ํตํด ๊ด๋ฆฌํ๋ฉฐ, Service๋ก ์ธ๋ถ์ ๋ ธ์ถํ๋ ์ ์ฒด ํ๋ฆ์ ์ค์ตํฉ๋๋ค.
1๏ธโฃ ์ ์ฒด ๋ค์์คํ์ด์ค์์ Pod ์กฐํ
kubectl get pods --all-namespaces
2๏ธโฃ ๊ฐ๋ณ Pod ์์ฑ
kubectl run nginx-pod --image=nginx
nginx ์ด๋ฏธ์ง๋ฅผ ์ฌ์ฉํด์ nginx-pod๋ผ๋ ๋จ์ผ Pod๋ฅผ ์คํํฉ๋๋ค.๐ก ์ด ๋ช ๋ น์ด๋ Deployment ์์ด ๋จ์ผ Pod๋ง ์ง์ ์คํํฉ๋๋ค. ์ค๋ฌด๋ณด๋ค๋ ์ค์ต์ด๋ ํ ์คํธ์ฉ์ผ๋ก ์์ฃผ ์ฌ์ฉ๋ฉ๋๋ค.
3๏ธโฃ Deployment ์์ฑ
kubectl create deployment dpy-nginx --image=nginx
kubectl get deployment -o wide
nginx ์ด๋ฏธ์ง๋ฅผ ๊ธฐ๋ฐ์ผ๋ก dpy-nginx๋ผ๋ Deployment๋ฅผ ์์ฑํฉ๋๋ค.
-o wide ์ต์
์ IP, ๋
ธ๋ ๋ฑ ์ถ๊ฐ ์ ๋ณด๊น์ง ๊ฐ์ด ๋ณด์ฌ์ค๋๋ค.

4๏ธโฃ Replica ๊ฐ์ ์กฐ์
kubectl scale deployment dpy-nginx --replicas=3
kubectl get pods -o wide
dpy-nginx Deployment๋ฅผ Pod 3๊ฐ๋ก ํ์ฅํ์์ต๋๋ค.
get pods๋ก ํ์ธํ๋ฉด 3๊ฐ์ ๋์ผํ Pod๊ฐ ์๊ธด ๊ฑธ ๋ณผ ์ ์์ต๋๋ค.

5๏ธโฃ ๋จ์ผ Pod์ Service ๋ ธ์ถ
kubectl expose pod nginx-pod --type=NodePort --name=pod-svc --port=80
kubectl get svc
type=NodePort : ์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณ ์ ํฌํธ๋ฅผ ๋ง๋ค์ด์ค๋๋ค.
kubectl get svc๋ก ์๋น์ค IP ๋ฐ ํฌํธ ํ์ธํฉ๋๋ค.

6๏ธโฃ ์ธ๋ถ์์ ์ ์ (curl)
curl localhost:30425
7๏ธโฃ Deployment์๋ Service ๋ ธ์ถ
kubectl expose deployment dpy-nginx --type=NodePort --name=dpy-svc --port=80
kubectl get services

Deployment ์ ์ฒด๋ฅผ ์ธ๋ถ์ ๋ ธ์ถํฉ๋๋ค.
์ฌ๋ฌ Pod ์ค ํ๋์๊ฒ ๋ผ์ฐํ ํด์ฃผ๋ ๋ก๋ ๋ฐธ๋ฐ์ฑ ์ญํ ์ ํฉ๋๋ค.
8๏ธโฃ ์ธ๋ถ์์ ์ ์ (curl)
curl localhost:30760
๐ก
dpy-nginxDeployment์ ์ฐ๊ฒฐ๋ 3๊ฐ์ Pod ์ค ํ๋๋ก ์๋์ผ๋ก ์์ฒญ์ ๋ถ์ฐ(๋ก๋ ๋ฐธ๋ฐ์ฑ) ํฉ๋๋ค.
9๏ธโฃ ์๋น์ค ์ญ์
kubectl delete service pod-svc dpy-svc
pod-svc์ dpy-svc๋ฅผ ์ญ์ ํฉ๋๋ค.
์ง๊ธ๊น์ง๋ kubectl ๋ช
๋ น์ด๋ฅผ ํตํด ์ง์ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํด๋ดค์ต๋๋ค.
ํ์ง๋ง ์ค๋ฌด ํ๊ฒฝ์ด๋ ๋ณต์กํ ์๋น์ค์์๋ ์ด๋ฐ ๋ฐฉ์์ผ๋ก ํ๋ํ๋ ์ ๋ ฅํ๋ ๊ฒ์ด ๋นํจ์จ์ ์ด๊ณ , ๋ณ๊ฒฝ ์ถ์ ๋ ์ด๋ ต์ต๋๋ค.
๊ทธ๋์ Kubernetes์์๋ ๋งค๋ํ์คํธ ํ์ผ์ ํตํด ๋ฆฌ์์ค๋ฅผ ์ ์ธ์ (Declarative)์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐฉ์์ ๋ ๋ง์ด ์ฌ์ฉํฉ๋๋ค.
์ค๋ธ์ ํธ(Pod, Deployment, Service ๋ฑ)์ ๋ํ ์ค์ ์ ํ์ผ๋ก ๊ธฐ๋กํ ๊ฒ์ ๋๋ค.
YAML (Yet Another Markup Language ๋๋ YAML Ain't Markup Language) ํ์์ผ๋ก ์์ฑ๋ฉ๋๋ค.
์ค๋ธ์ ํธ๊ฐ ์ด๋ค ์ํ๋ก ์กด์ฌํด์ผ ํ๋์ง(=์๋ํ ์ํ, desired state)๋ฅผ ๊ธฐ์ ํฉ๋๋ค. ์ด ์ค์ ๋ถ๋ถ์ ์ค๋ธ์ ํธ ์คํ(spec)์ด๋ผ๊ณ ๋ถ๋ฆ ๋๋ค.
์ค๋ธ์ ํธ๋ฅผ ์์ฑ, ์์ , ์ญ์ ํ ์ ์์ผ๋ฉฐ ๋์ผํ ๋งค๋ํ์คํธ๋ฅผ ๋ฐ๋ณต ์ ์ฉํ๊ฑฐ๋ ๋ค๋ฅธ ๋งค๋ํ์คํธ ํ์ผ์ ํตํด ์ํ๋ฅผ ๋ฐ๊พธ๋ ๊ฒ๋ ๊ฐ๋ฅํฉ๋๋ค.
๋ณต์กํ ๋ฆฌ์์ค๋ฅผ ๋ช ๋ น์ด๋ก ์ผ์ผ์ด ์ ๋ ฅํ๊ธฐ๋ณด๋ค, ํ์ผ๋ก ๊ด๋ฆฌํ๋ฉด ์๋ํ์ ์ ์ง๋ณด์์ ํจ์ฌ ์ ๋ฆฌํฉ๋๋ค.
kubectl apply -f <๋งค๋ํ์คํธ ํ์ผ>
๐ค
kubectl create -f๋ฅผ ์ฌ์ฉํ์ง ์๋ ์ด์ ๋ ๋ญ๊น?
kubectl apply๋ ๋จ์ํ ๋ฆฌ์์ค๋ฅผ ์์ฑํ๋ ๋ฐ ๊ทธ์น์ง ์๊ณ , ์ด๋ฏธ ์กด์ฌํ๋ ๋ฆฌ์์ค๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋ ๋ณ๊ฒฝ๋ ๋ด์ฉ๋ง ๋ฐ์ํ๋ ๊ธฐ๋ฅ๊น์ง ํฌํจํ๊ณ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
kubectl create๋ ์ค๋ธ์ ํธ๋ฅผ ํ ๋ฒ๋ง ์์ฑํ๋ ๋ช ๋ น์ด๋ก, ์ด๋ฏธ ๋์ผํ ๋ฆฌ์์ค๊ฐ ์กด์ฌํ๋ฉด ์๋ฌ๊ฐ ๋ฐ์ํฉ๋๋ค.
apiVersion: app/v1
kind: Deployment
metadata:
name: nginx-deployment
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: nginx-service
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
Flask ์ฑ์ ์ปจํ ์ด๋๋ก ๊ตฌ์ฑํ๊ณ Kubernetes์ ๋ฐฐํฌํ ๋ค, NodePort ์๋น์ค๋ฅผ ํตํด ์ธ๋ถ์์ ๋ค์ด์ค๋ ์์ฒญ์ ์ฌ๋ฌ ๊ฐ์ ํ๋์ ์๋ ๋ถ์ฐ(๋ก๋๋ฐธ๋ฐ์ฑ)ํ๋ ๊ณผ์ ์ ์ค์ตํฉ๋๋ค.
๐ค ๋ก๋๋ฐธ๋ฐ์ฑ์ด๋?
๋ก๋๋ฐธ๋ฐ์ฑ์ด๋ ๋ง์ ์์ฒญ์ด ๋ค์ด์ฌ ๋, ํ ๊ณณ์ ๋ชฐ๋ฆฌ์ง ์๋๋ก ์ฌ๋ฌ ์๋ฒ(Pod)๋ก ๋ฒ๊ฐ์๊ฐ๋ฉฐ ๋๋ ์ฃผ๋ ๊ธฐ์ ์ ๋๋ค.
์ถ์ฒ: medium
๐ค ์ ํ์ํ ๊ฑธ๊น?
1. ํธ๋ํฝ ๋ถ์ฐ
์ฌ์ฉ์๊ฐ ๋ง์์ง์๋ก ํ ์๋ฒ๊ฐ ๊ฐ๋นํ๊ธฐ ํ๋ค๊ธฐ ๋๋ฌธ์ ๋๋๊ฒ ๋ฉ๋๋ค.2. ๊ณ ๊ฐ์ฉ์ฑ (High Availability)
ํ๋์ ํ๋๊ฐ ์ฃฝ๋๋ผ๋ ๋๋จธ์ง๊ฐ ์ด์์ ์๋ต์ด ๊ฐ๋ฅํ๊ฒ ๋ฉ๋๋ค.3. ์ค์ผ์ผ๋ง ์ ์ฐ์ฑ
ํน์ ๊ธฐ๋ฅ(์: ๊ฒฐ์ )๋ง ํธ๋ํฝ ๋ง์ผ๋ฉด ๊ทธ ํ๋๋ง ๋๋ฆฌ๋ฉด ๋๋ ์ฅ์ ์ด ์์ต๋๋ค.
1๏ธโฃ Flask ์ ํ๋ฆฌ์ผ์ด์ ๊ตฌ์ฑ
from flask import Flask
import socket
app = Flask(__name__)
hostname = socket.gethostname()
ipv4 = socket.gethostbyname(hostname)
message = f'<p>Hostname: {hostname}</p><p>IPv4 Address: {ipv4}</p>\n'
@app.route('/')
def root():
return message
Flask
2๏ธโฃ Nginx๋ก ํ๋ก์ ์ค์
server {
listen 80;
server_name localhost;
access_log /var/log/nginx/access.log main;'
location / {
proxy_pass http://127.0.0.1:5000;
}
}
service nginx start
/flaskapp/venv/bin/flask --app app run --host 0.0.0.0
3๏ธโฃ Dockerfile ๊ตฌ์ฑ
FROM nginx:latest
RUN apt update
RUN apt install -y python3-full
RUN apt install -y procps
WORKDIR /flaskapp
RUN python3 -m venv /flaskapp/venv
COPY requirements.txt requirements.txt
RUN /flaskapp/venv/bin/pip install -r requirements.txt
COPY app.py app.py
COPY site.conf /etc/nginx/sites-available/flaskapp.conf
RUN ln -s /etc/nginx/sites-available/flaskapp.conf /etc/nginx/conf.d
RUN mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak
COPY start.sh start.sh
RUN chmod 777 start.sh
ENTRYPOINT ["/flaskapp/start.sh"]
apiVersion: apps/v1
kind: Deployment
metadata:
name: dpy-hname
labels:
app: hostname
spec:
replicas: 3
selector:
matchLabels:
app: hostname
template:
metadata:
labels:
app: hostname
spec:
containers:
- name: hname
image: ๊ณ์ ์ด๋ฆ/hostname:latest
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: svc-hname
spec:
type: NodePort
selector:
app: hostname
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
๐ค ์ NodePort๋ฅผ ์ฌ์ฉํ ๊น?
Flask ์ฑ์ k8s Pod ๋ด๋ถ์์ ์คํ๋๊ธฐ ๋๋ฌธ์ ํด๋ฌ์คํฐ ๋ด๋ถ์์๋ง ์ ๊ทผ์ด ๊ฐ๋ฅํฉ๋๋ค.
๊ทธ๋ฌ๋ฏ๋ก
curl์ด๋ ์ธ๋ถ ๋ธ๋ผ์ฐ์ ์ ์์ฒญ์ ๋ณด๋ด๋ ค๋ฉด ๋ด๋ถ๋ก ํธ๋ํฝ์ ๋ฐ์์ฃผ๋NodePortํ์ ์Service๋ฅผ ์ฌ์ฉํด ๋ ธ๋์ ํน์ ํฌํธ๋ฅผ ๊ฐ๋ฐฉํ๊ณ , ๊ทธ ํฌํธ๋ก ๋ค์ด์จ ์์ฒญ์ ๋ด๋ถ Pod๋ก ๋ผ์ฐํ ํ ์ ์๋๋ก ๊ตฌ์ฑํ๋ ๊ฒ์ ๋๋ค.
4๏ธโฃ DockerHub ์ ๋ก๋
deployment.yaml ์์ ์์ฑํ image๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ์ํด์ DockerHub์ ์
๋ก๋ํฉ๋๋ค. docker build -t hostname:latest .

docker tag hostname:latest ๊ณ์ ์ด๋ฆ/hostname:latest
docker push ๊ณ์ ์ด๋ฆ/hostname:latest

5๏ธโฃ Kubernetes์ ๋ฐฐํฌ
kubectl apply -f deployment.yaml
kubectl apply -f service.yaml
kubectl get pods -o wide

6๏ธโฃ curl๋ก ํ ์คํธ
curl localhost:30000
curl localhost:30000
curl localhost:30000
curl localhost:30000
curl localhost:30000

[ ์ฌ์ฉ์ (curl or ๋ธ๋ผ์ฐ์ ) ]
โ
http://localhost:30000
โ
[ Kubernetes NodePort ์๋น์ค (30000) ]
โ
[ ์ฌ๋ฌ ํ๋ ์ค ํ๋ ์ ํ (๋ก๋๋ฐธ๋ฐ์ฑ) ]
โ
[ Nginx (80) โ Flask (5000) ]
โ
[ HTML ์๋ต: Hostname & IP ์ถ๋ ฅ ]
์ฟ ๋ฒ๋คํฐ์ค์์ ์๋์ผ๋ก ์ํํธ์จ์ด๋ฅผ ์ ๋ฐ์ดํธํ๊ณ , ํ์ํ๋ฉด ๋๋๋ฆด ์ ์๊ฒ ์ฐ์ตํ๋ ์ค์ต์ ๋๋ค.
- kubectl rollout undo deployment <๋ํ๋ก์ด๋จผํธ ์ด๋ฆ>
- kubectl rollout undo deployment <๋ํ๋ก์ด๋จผํธ ์ด๋ฆ> --to-revision=<๋ฆฌ๋น์ ๋ฒํธ> : ํน์ ์์ ์ผ๋ก ๋๋ฆฌ๋ ๊ฑฐ
apiVersion: apps/v1
kind: Deployment
metadata:
name: dpy-nginx
labels:
app: nginx
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.17.0
ports:
- containerPort: 80
apiVersion: v1
kind: Service
metadata:
name: svc-nginx
spec:
type: NodePort
selector:
app: nginx
ports:
- name: http
protocol: TCP
port: 80
targetPort: 80
nodePort: 30000
1๏ธโฃ ์ด๊ธฐ ๋ฐฐํฌ (nginx:1.17.0)
kubectl apply -f rollout.yaml
rollout.yaml ํ์ผ์ ์ ์ฉํด์ Deployment ๋ฆฌ์์ค๋ฅผ ์์ฑํฉ๋๋ค.kubectl apply -f rollout.yaml --record
--record ์ต์
์ ์ฃผ๋ฉด, ๋ช
๋ น ์คํ ์ด๋ ฅ์ด revision์ ๋จ๊ฒจ์ ธ ๋ฌด์์ ํ๋์ง ์ถ์ ํ ์ ์์ต๋๋ค.kubectl rollout status deployment dpy-nginx
kubectl rollout history deployment dpy-nginx

2๏ธโฃ nginx ๋ฒ์ ๋ค์ด๊ทธ๋ ์ด๋ (1.16.0)
kubectl delete deployment dpy-nginx
# rollout.yaml ํ์ผ์์ nginx:1.16.0 ์ผ๋ก ์ด๋ฏธ์ง ๋ฒ์ ์์
kubectl apply -f rollout.yaml
3๏ธโฃ ์๋ ์ ๋ฐ์ดํธ (๋ฒ์ ์ ๊ทธ๋ ์ด๋)
kubectl set image deployment dpy-nginx nginx=nginx:1.17.0
set image ๋ช
๋ น์ผ๋ก ์ค์๊ฐ์ผ๋ก ๋ฐฐํฌ ์ค์ธ Deployment์ ์ด๋ฏธ์ง๋ฅผ ์
๋ฐ์ดํธํฉ๋๋ค.kubectl annotate deployment dpy-nginx kubernetes.io/change-cause="์ค๋ช
"
kubectl rollout history deployment dpy-nginx

4๏ธโฃ ๋๋๋ฆฌ๊ธฐ
kubectl rollout undo deployment dpy-nginx
kubectl rollout undo deployment dpy-nginx --to-revision=<๋ฒํธ>
- ํน์ revision ๋ฒํธ(
kubectl rollout history)๋ก ์ ํํ ์ง์ ํด์ ๋๋๋ฆด ์๋ ์์ต๋๋ค.
5๏ธโฃ ๋ฒ์ ํ์ธํ๊ธฐ
curl -I --silent localhost:30000 | grep Server
-I : ํค๋๋ง ์กฐํํฉ๋๋ค. (HTTP ์๋ต ๋ณธ๋ฌธ์ ์ ์ธ)
--silent : ์งํ ์ํ ์ถ๋ ฅ ์จ๊น๋๋ค.
grep Server : Server: ๊ฐ ํฌํจ๋ ์ค๋ง ์ถ๋ ฅํฉ๋๋ค.

์ฟ ๋ฒ๋คํฐ์ค Horizontal Pod Autoscaler (HPA)๋ฅผ ์ฌ์ฉํด์ CPU ์ฌ์ฉ๋ฅ ์ ๋ฐ๋ผ ์๋์ผ๋ก Pod ์๋ฅผ ๋๋ ธ๋ค ์ค์ด๋ ๋์ ์ค์ผ์ผ๋ง์ ์ค์ตํฉ๋๋ค.
๐ค HPA(Horizontal Pod Autoscaler)๋?
ํด๋ฌ์คํฐ ๋ด ๋ถํ๋์ ๋ฐ๋ผ Deployment์ Pod ์๋ฅผ ์๋์ผ๋ก ์กฐ์ ํ๋ Kubernetes์ ๊ธฐ๋ฅ์ ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก CPU ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๊ธฐ์ค์ผ๋ก ํ๋จํ๋ฉฐ, metrics-server๋ก๋ถํฐ ๋ฆฌ์์ค ์ฌ์ฉ๋ ์ ๋ณด๋ฅผ ์ ๋ฌ๋ฐ์ ๋์ผํ ๊ธฐ๋ฅ์ ์ํํ๋ Pod์ ์๋ฅผ ๋์ ์ผ๋ก ์กฐ์ ํฉ๋๋ค.
apiVersion: v1
kind: ServiceAccount
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
rbac.authorization.k8s.io/aggregate-to-admin: "true"
rbac.authorization.k8s.io/aggregate-to-edit: "true"
rbac.authorization.k8s.io/aggregate-to-view: "true"
name: system:aggregated-metrics-reader
rules:
- apiGroups:
- metrics.k8s.io
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
rules:
- apiGroups:
- ""
resources:
- nodes/metrics
verbs:
- get
- apiGroups:
- ""
resources:
- pods
- nodes
verbs:
- get
- list
- watch
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server-auth-reader
namespace: kube-system
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: Role
name: extension-apiserver-authentication-reader
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: metrics-server:system:auth-delegator
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:auth-delegator
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
labels:
k8s-app: metrics-server
name: system:metrics-server
roleRef:
apiGroup: rbac.authorization.k8s.io
kind: ClusterRole
name: system:metrics-server
subjects:
- kind: ServiceAccount
name: metrics-server
namespace: kube-system
---
apiVersion: v1
kind: Service
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
ports:
- name: https
port: 443
protocol: TCP
targetPort: https
selector:
k8s-app: metrics-server
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
k8s-app: metrics-server
name: metrics-server
namespace: kube-system
spec:
selector:
matchLabels:
k8s-app: metrics-server
strategy:
rollingUpdate:
maxUnavailable: 0
template:
metadata:
labels:
k8s-app: metrics-server
spec:
containers:
- args:
- --cert-dir=/tmp
- --kubelet-insecure-tls
- --secure-port=4443
- --kubelet-preferred-address-types=InternalIP,ExternalIP,Hostname
- --kubelet-use-node-status-port
- --metric-resolution=15s
image: registry.k8s.io/metrics-server/metrics-server:v0.6.4
imagePullPolicy: IfNotPresent
livenessProbe:
failureThreshold: 3
httpGet:
path: /livez
port: https
scheme: HTTPS
periodSeconds: 10
name: metrics-server
ports:
- containerPort: 4443
name: https
protocol: TCP
readinessProbe:
failureThreshold: 3
httpGet:
path: /readyz
port: https
scheme: HTTPS
initialDelaySeconds: 20
periodSeconds: 10
resources:
requests:
cpu: 100m
memory: 200Mi
securityContext:
allowPrivilegeEscalation: false
readOnlyRootFilesystem: true
runAsNonRoot: true
runAsUser: 1000
volumeMounts:
- mountPath: /tmp
name: tmp-dir
nodeSelector:
kubernetes.io/os: linux
priorityClassName: system-cluster-critical
serviceAccountName: metrics-server
volumes:
- emptyDir: {}
name: tmp-dir
---
apiVersion: apiregistration.k8s.io/v1
kind: APIService
metadata:
labels:
k8s-app: metrics-server
name: v1beta1.metrics.k8s.io
spec:
group: metrics.k8s.io
groupPriorityMinimum: 100
insecureSkipTLSVerify: true
service:
name: metrics-server
namespace: kube-system
version: v1beta1
versionPriority: 100
apiVersion: apps/v1
kind: Deployment
metadata:
name: php-apache
spec:
selector:
matchLabels:
run: php-apache
template:
metadata:
labels:
run: php-apache
spec:
containers:
- name: php-apache
image: registry.k8s.io/hpa-example
ports:
- containerPort: 80
resources:
limits:
cpu: 500m
requests:
cpu: 200m
---
apiVersion: v1
kind: Service
metadata:
name: php-apache
labels:
run: php-apache
spec:
ports:
- port: 80
selector:
run: php-apache
1๏ธโฃ Metrics ์๋ฒ ์ค์น
kubectl apply -f metrics.yaml
kubectl get pods --all-namespaces

2๏ธโฃ ์น ์ ํ๋ฆฌ์ผ์ด์
๋ฐฐํฌ (php-apache)
kubectl apply -f php-apache.yaml
3๏ธโฃ Horizontal Pod Autoscaler ์ค์
kubectl autoscale deployment php-apache --cpu-percent=50 --min=1 --max=10
CPU ์ฌ์ฉ๋ฅ ์ด 50%๋ฅผ ๋์ผ๋ฉด Pod๋ฅผ ์๋์ผ๋ก ๋๋ฆฌ๊ณ ,
๋ฎ์์ง๋ฉด ์ค์ด๋ ์ค์ ์
๋๋ค.
Pod ์๋ ์ต์ 1๊ฐ, ์ต๋ 10๊ฐ๋ก ์ ํ๋ฉ๋๋ค.
4๏ธโฃ ๋ถํ ์์ฑ (load generator)
kubectl run -it load-gen --rm --image=busybox --restart=Never -- /bin/sh -c "while sleep 0.01; do wget -q -O- http://php-apache; done"
busybox ์ปจํ
์ด๋๋ฅผ ์คํํด์ php-apache ์๋น์ค์ ์ง์์ ์ผ๋ก HTTP ์์ฒญ์ ๋ณด๋ด๋ ์ญํ ์
๋๋ค.
0.01์ด ๊ฐ๊ฒฉ์ผ๋ก ๊ณ์ ์์ฒญํด์ CPU ์ฌ์ฉ๋์ ์ธ์์ ์ผ๋ก ์ฌ๋ฆฌ๋ ๋ชฉ์ ์ ๋๋ค.

5๏ธโฃ HPA ์ํ ํ์ธ
kubectl get hpa

Kubernetes ํด๋ฌ์คํฐ์์ PersistentVolume(PV)์ PersistentVolumeClaim(PVC)์ ์ฌ์ฉํด
๋ก์ปฌ ์ ์ฅ์๋ฅผ ๋ง์ดํธํ๊ณ , nginx ์น ์๋ฒ๋ฅผ ํตํด HTML ํ์ผ์ ์๋น์คํ๋ ๊ณผ์ ์ ์ค์ตํฉ๋๋ค.
๐ค ๋ณผ๋ฅจ์ด ์ค์ํ ์ด์ ๋ ๋ญ๊น?
์ปจํ ์ด๋๋ ์ฌ์์ํ๋ฉด ๋ด๋ถ์ ์๋ ํ์ผ์ด ๋ ์๊ฐ๊ธฐ ๋๋ฌธ์ ๋ณผ๋ฅจ์ ๋ฐ์ดํฐ๋ฅผ ์๊ตฌ ์ ์ฅํ๋ ๋ฐฉ์์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค.
Pod๊ฐ ์ฌ์ฉํ ์ ์๋๋ก ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ์ ๋ฏธ๋ฆฌ ๋ฑ๋ก๋ ์ ์ฅ ๊ณต๊ฐ์
๋๋ค.
Pod๋ ์ด ์ ์ฅ์์ ์ง์ ์ ๊ทผํ์ง ์๊ณ PVC(PersistentVolumeClaim)๋ฅผ ํตํด ๊ฐ์ ์ ์ผ๋ก ์ฐ๊ฒฐํฉ๋๋ค.Pod์ด ์ฌ์ฉํ ์คํ ๋ฆฌ์ง๋ฅผ ์์ฒญํ๋ ๊ฐ์ฒด์ ๋๋ค.
pod : node = pvc : pv
์ํ๋ ์ ์ฅ ์ฉ๋๊ณผ ์ ๊ทผ ๋ฐฉ์์ ์ง์ ํ ์ ์์ต๋๋ค.
apiVersion: v1
kind: PersistentVolume
metadata:
name: task-pv-volume
labels:
type: local
spec:
storageClassName: manual
capacity:
storage: 10Gi
accessModes:
- ReadWriteOnce
hostPath:
path: "/c/Users/MSI/Downloads/2-05 (1)/2-05/pv/data"
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: task-pv-claim
spec:
storageClassName: manual
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
apiVersion: apps/v1
kind: Deployment
metadata:
name: nginx
spec:
selector:
matchLabels:
run: nginx
template:
metadata:
labels:
run: nginx
spec:
volumes:
- name: task-pv-storage
persistentVolumeClaim:
claimName: task-pv-claim
containers:
- name: nginx
image: nginx
ports:
- containerPort: 80
volumeMounts:
- mountPath: "/run/desktop/mnt/host/c/Users/MSI/pv/data"
---
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
run: nginx
spec:
type: NodePort
selector:
run: nginx
ports:
- port: 80
nodePort: 30000
1๏ธโฃ ๋ก์ปฌ ๋๋ ํ ๋ฆฌ ์ค๋น
mkdir data
cd data
cat > index.html
<p>Hello from k8s Storage!</p>
data ๋๋ ํ ๋ฆฌ๋ฅผ ๋ง๋ค๊ณ , nginx๊ฐ ์๋น์คํ HTML ํ์ผ(index.html)์ ์ง์ ์์ฑํฉ๋๋ค.2๏ธโฃ PersistentVolume ์์ฑ
kubectl apply -f pv-volume.yaml
kubectl get pv
pv-volume.yaml์ ์ด์ฉํด ๋ก์ปฌ ๋์คํฌ๋ฅผ Kubernetes์ PV ๋ฆฌ์์ค๋ก ๋ฑ๋กํฉ๋๋ค.3๏ธโฃ PersistentVolumeClaim ์์ฑ
kubectl apply -f pv-claim.yaml
kubectl get pvc
PVC๋ Pod๊ฐ ์คํ ๋ฆฌ์ง๋ฅผ ์ฌ์ฉํ๊ณ ์ ํ ๋ ๋ด๋ ์์ฒญ์์ ๋๋ค.
get pvc๋ก ๋ฐ์ธ๋ฉ ์ํ๋ฅผ ํ์ธํด์ PVC๊ฐ PV์ ์ ์ฐ๊ฒฐ๋์๋์ง ์ฒดํฌํฉ๋๋ค.
Bound์ด๋ฉด ์ฐ๊ฒฐ์ด ๋ ๊ฒ์
๋๋ค.4๏ธโฃ Deployment & Service ์์ฑ
kubectl apply -f deployment.yaml
kubectl get svc
5๏ธโฃ ์น ์ ์ ํ ์คํธ
curl localhost:30000
curl๋ก nginx ์๋น์ค์ ์ ์ํฉ๋๋ค.6๏ธโฃ Pod ๋ด๋ถ ์ ๊ทผ + ํ์ผ ์์ฑ ์ค์ต
kubectl get pods
kubectl exec -it <์ด๋ฆ> -- /bin/bash
cd /usr/share/nginx/html
cat > tmp.txt
This file is being created inside a container.
exit
tmp.txt ํ์ผ์ ๋ง๋ค์ด์, ์ ๋ง๋ก ํธ์คํธ ๋๋ ํ ๋ฆฌ์ ๊ณต์ ๋๊ณ ์๋์ง ํ์ธํ๋ ๊ณผ์ ์
๋๋ค.
๋์์ cat tmp.txt ๋ก ํ์ธํ๊ฑฐ๋ ๋ก์ปฌ ํด๋์ ํ์ผ์ด ๋ณด์ด๋ฉด ์ฑ๊ณตํ ๊ฒ์
๋๋ค.
k8s ์์์๋ ๊ฐ๋ ์ด ๋ง์ ๋งํผ, ์ค์ ์ค์ต๊ณผ ํจ๊ป ๋ณํํด์ ์ตํ๋ฉด์ ์ดํด๋ฅผ ํด์ผํ๋๋ฐ ์์ง์ ์ด๋ ค์ด ๊ฒ ๊ฐ๋ค.