์ฟ ๋ฒ๋คํฐ์ค๋ ํฌ๊ฒ ์ค๋ธ์ ํธ(object)์ ์ค๋ธ์ ํธ๋ฅผ ๊ด๋ฆฌํ๋ ์ปจํธ๋กค๋ฌ(controller)๋ก ๋๋ ์ ธ ์๋ค.์ค๋ธ์ ํธ์ ์ด๋ค ๊ฒ๋ค์ด ์๊ณ ๊ฐ๊ฐ์ ์ค๋ธ์ ํธ์ ๋ํ ๋ด์ฉ์ ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํด๋ณด์๋ค.
์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ
์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ ์ฟ ๋ฒ๋คํฐ์ค ์์คํ ์์ ์์์ฑ์ ๊ฐ์ง๋ ์ค๋ธ์ ํธ์ด๋ค. ์ค๋ธ์ ํธ๋ฅผ ์์ฑํ๊ฒ ๋๋ฉด ์ฟ ๋ฒ๋คํฐ์ค ์์คํ ์ ์ํ๋ ์ํ๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํด ์ง์์ ์ผ๋ก ์๋ํ๋ค.
์ฟ ๋ฒ๋คํฐ์ค๋ ํด๋ฌ์คํฐ์ ์ํ๋ฅผ ๋ํ๋ด๊ธฐ ์ํด ์ด ์ค๋ธ์ ํธ๋ฅผ ์ด์ฉํ๋ค.
๊ฑฐ์ ๋ชจ๋ ์ฟ ๋ฒ๋คํฐ์ค ์ค๋ธ์ ํธ๋ ์ค๋ธ์ ํธ ๊ตฌ์ฑ์ ๊ฒฐ์ ํด์ฃผ๋ ๋ ๊ฐ์ ์ค์ ๋ ์ค๋ธ์ ํธ ํ๋์ธ status์ spec๋ฅผ ํฌํจํ๋ค.
- status : ์ฟ ๋ฒ๋คํฐ์ค ์์คํ ๊ณผ ์ปดํฌ๋ํธ์ ์ํด ์ ๊ณต๋๊ณ ์ ๋ฐ์ดํธ๋ ์ค๋ธ์ ํธ์ ํ์ฌ ์ํ๋ฅผ ์ค๋ช
- spec : ์ค๋ธ์ ํธ์ ํน์ฑ์ผ๋ก ์ถ๊ตฌํ๋ ์ํ๋ฅผ ์ค๋ช ์ปจํธ๋กค๋ฌ๋ status๊ฐ spec๊ณผ ์ผ์นํ๋๋ก ์ค๋ธ์ ํธ๋ฅผ ์์ฑ/์ญ์ ํ๋ค.
๊ธฐ๋ณธ ์ค๋ธ์ ํธ
์ฟ ๋ฒ๋คํฐ์ค์๋ ์ฟ ๋ฒ๋คํฐ์ค์ ์ํด ๋ฐฐํฌ ๋ฐ ๊ด๋ฆฌ๋๋ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ์ค๋ธ์ ํธ๊ฐ 4๊ฐ์ง ์กด์ฌํ๋ค.
- pod
- service
- volume
- namespace
Pod
ํ๋๋ ์ฟ ๋ฒ๋คํฐ์ค์์ ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ๋ฐฐํฌ ๋จ์๋ก ์ปจํ ์ด๋๋ฅผ ํฌํจํ๋ ๋จ์์ด๋ค. ์ฟ ๋ฒ๋คํฐ์ค์ ํน์ง ์ค ํ๋๋ก ์ปจํ ์ด๋๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ํ๋์ฉ ๋ฐฐํฌํ๋ ๊ฒ์ด ์๋ ํ๋ ๋จ์๋ก ๋ฐฐํฌํ๋ค. ์ด๋ ํ๋๋ ํ๋ ์ด์์ ์ปจํ ์ด๋๋ฅผ ํฌํจํ๋ค.
Pod๋ฅผ ์์ฑํ ๋ Container, Label, Node Schedule์ ๋ํ ๊ฐ๋ ์ด ํ์ํ๋ค.
ํ๋ ๋ด ์ปจํ ์ด๋๋ ์ค๋ณต๋ ํฌํธ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
spec:
containers:
- name: container1
image: tmkube/p8000
ports:
- containerPort: 8000
- name: container2
image: tmkube/p8080
ports:
- containerPort: 8080
์๋ Pod๋ฅผ ์์ฑํ๋ yml ํ์ผ ์์์ด๋ค. ํ๋์ Pod์ containerPort๊ฐ ๋์ผํ๋ค๋ฉด ์์ฑ ์์ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
Label์ ํค-๊ฐ ์์ผ๋ก ๊ตฌ์ฑ๋ ๋ฉํ๋ฐ์ดํฐ์ด๋ค. ๋ผ๋ฒจ์ ํน์ ๋ฆฌ์์ค๋ฅผ ์๋ณํ๊ณ ์กฐ์งํํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
์๋์ ์์ ์์ Service๋ฅผ ์์ฑํ ๋ Pod๋ค์ ๋ฌถ์ด ์์ฑํ๋ ๊ฑธ ๋ณผ ์ ์๋ค.
apiVersion: v1
kind: Service
metadata:
name: svc-1
spec:
selector:
type: web
ports:
- port: 8080
label์ ์ง์ ์ ์๋์ ๊ฐ์ด ํ ์ ์๋ค. ํ๋์ Pod์ Label์ ์ฌ๋ฌ ๊ฐ ์ง์ ๊ฐ๋ฅํ๋ค.
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
type: web
lo: dev
spec:
containers:
- name: container
image: tmkube/init
Pod๋ฅผ ์์ฑํ ๋ ์ด๋ Node์ ์์ฑํ ์ง๋ ์ ํด์ผ ํ๋ค.
์ง์ ์ง์ ํ๋ ๋ฐฉ์๊ณผ ์ฟ ๋ฒ๋คํฐ์ค๊ฐ ์์ ์์๋ฅผ ๊ณ ๋ คํ์ฌ ์๋์ผ๋ก ์ง์ ํด์ฃผ๋ ๋ฐฉ์์ด ์๋ค. ์๋ ์ง์ ์ Node Schedule์ด ์ํํด์ค๋ค.
์ง์ ์ง์ ์ ์์ yml ์ด๋ค. nodeSelector์ hostname์ node์ด๋ฆ์ ์ง์ ํด์ฃผ๋ฉด ๋๋ค.
apiVersion: v1
kind: Pod
metadata:
name: pod-3
spec:
nodeSelector:
hostname: node1
containers:
- name: container
image: tmkube/init
๋ฐ๋ก hostname์ ์ง์ ํ์ง ์๊ณ requests ์ต์ ์ ์ฃผ๋ฉด Node Schedule์ด ๊ฐ Node๋ค์ ๋ฆฌ์์ค ํํฉ์ ํ์ ํ ํ ๊ฐ์ฅ ์ ์ ํ Node์ Pod๋ฅผ ์์ฑํด์ค๋ค.
apiVersion: v1
kind: Pod
metadata:
name: pod-4
spec:
containers:
- name: container
image: tmkube/init
resources:
requests:
memory: 2Gi
limits:
memory: 3Gi
Service
์๋น์ค๋ ํ๋ ์งํฉ์์ ์คํ์ค์ธ ์ปจํ ์ด๋๋ฅผ ๋คํธ์ํฌ ์๋น์ค๋ก ๋ ธ์ถํ๋ ์ถ์ํ ๋ฐฉ๋ฒ์ด๋ค. ํ๋๋ ์ปจํธ๋กค๋ฌ๊ฐ ๊ด๋ฆฌํ๋ฏ๋ก ๊ณ ์ ๋์ด ์์ง ์๊ณ ํด๋ฌ์คํฐ ์์ ์ฎ๊ฒจ ๋ค๋๋ค. ์ด ๊ณผ์ ์์ ๋ ธ๋๋ฅผ ์ฎ๊ฒจ ๋ค๋๋ฉฐ ์คํ๋๊ธฐ๋ ํ๊ณ ํด๋ฌ์คํฐ ์ ํ๋์ IP๊ฐ ๋ณ๊ฒฝ๋๊ณ ํ๋ค.
์ด๋ ๊ฒ ๋์ ์ผ๋ก ๋ณํ๋ ํ๋๋ค์ ๊ณ ์ ์ ์ผ๋ก ์ ๊ทผํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ด ์ฟ ๋ฒ๋คํฐ์ค์ ์๋น์ค์ด๋ค. ์๋น์ค๋ ํ๋์๊ฒ ๊ณ ์ ํ IP ์ฃผ์์ ํ๋ ์งํฉ์ ๋ํ ๋จ์ผ DNS ๋ช ์ ๋ถ์ฌํ์ฌ ํ๋๊ฐ ํด๋ฌ์คํฐ ์ ์ด๋์ ์๋ ๊ณ ์ ์ฃผ์๋ฅผ ํตํด ์ ๊ทผ์ด ๊ฐ๋ฅํ๋ค.
Service์ 3๊ฐ์ง ์ข ๋ฅ๊ฐ ์๋ค.
1. ClusterIP
์ธ๋ถ์์ ์ ๊ทผ์ด ๋ถ๊ฐํ๊ธฐ ๋๋ฌธ์ ์๋น์ค ๋๋ฒ๊น , ์ธ์ฆ๋ ์ฌ์ฉ์ ์ฐ๊ฒฐ ๋ฑ์ ์ฌ์ฉ๋๋ค.
2. NodePort
์ธ๋ถ์์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง Prodํ๊ฒฝ์์ ์ฌ์ฉํ์ง ์๊ณ ์์๋ก ์ฐ๊ฒฐ์ ํ์ฉํ ๋ ์ฌ์ฉํ๋ค. ์ฆ ๋ฐ๋ชจ๋ ์์ ์ฐ๊ฒฐ ์ฉ์ด๋ค.
type์ ์ด๋ค Service์ธ์ง ์ง์ ํด์ฃผ๋ฉด ๋๋ค. ์ฃผ์ํด์ผํ ์ ์ ๋ชจ๋ Node์ ๋์ผํ Port๋ฅผ ํ ๋นํ๋ค.
๋ํ ์ด Service๋ ๋ก๋๋ฐธ๋ฐ์ฑ ๋ํ ์ง์ํ๋ค. ํ์ง๋ง externalTrafficPolicy: Local ์ ์ง์ ํด์ฃผ๋ฉด ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ง์ํ์ง ์๊ณ ์ง์ ํ ๊ณณ์ผ๋ก๋ง ํธ๋ํฝ์ ๋ณด๋ผ ์๋ ์๋ค.
apiVersion: v1
kind: Service
metadata:
name: svc-2
spec:
selector:
app: pod
ports:
- port: 9000
targetPort: 8080
nodePort: 30000
type: NodePort
3. Load Balancer
์ค์ ์ด์ ํ๊ฒฝ์์ ์ด Service๋ฅผ ์ฌ์ฉํ๋ค.
์ธ๋ถ ์ ๊ทผ์ด ๊ฐ๋ฅํ๊ณ ๊ฐ๊ฐ์ ๋ ธ๋์ ๋ก๋๋ฐธ๋ฐ์ฑ์ ์ง์ํ๋ค.
๊ฐ์ธ ์ค์ต ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๊ณ , GCP, AWS, Azure, OpenStack๋ฑ์ ์ด์ฉํ ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค.
Volume
์ปจํ ์ด๋๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ํ๊ฐ ์๋ ์ฑ ์ปจํ ์ด๋๋ฅผ ์ฌ์ฉํ๋ค. ์ํ๊ฐ ์๋ค๋ ๊ฒ์ ์ปจํ ์ด๋ ํน์ ๋ ธ๋์ ๋ฌธ์ ๊ฐ ์์ด ์ปจํ ์ด๋๋ฅผ ์๋ก ์คํํ์ ๋ ๋ค๋ฅธ ๋ ธ๋๋ก ์์ ๋กญ๊ฒ ์ฎ๊ธธ ์ ์๋ค๋ ๋ป์ด๋ค.
์ด๋ ์ปจํ ์ด๋์ ์ฅ์ ์ด๋ค. ํ์ง๋ง ์ปจํ ์ด๋๊ฐ ์คํ๋์ง ์๊ฑฐ๋ ์ญ์ ๋๋ค๋ฉด ํ์ฌ๊น์ง ์ ์ฅํ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ผ์ง๋ค๋ ๋จ์ ์ด ์๋ค.
์ฑ์ ํน์ฑ์ ๋ฐ๋ผ ์ปจํ ์ด๋์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด๋ ๋ฐ์ดํฐ๋ฅผ ๋ณด์กดํด์ผ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๋๋ฐ, ์ด๋ฐ ์ํฉ์์ ์ฌ์ฉํ๋ ๊ฒ์ด ๋ณผ๋ฅจ์ด๋ค. ๋ณผ๋ฅจ์ ์ปจํ ์ด๋๊ฐ ์ฌ์์ํ๋๋ผ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์งํ๋ค.
Volume์ ์ข ๋ฅ์ emptyDir, hostPath, PVC/PV๊ฐ ์๋ค. ๊ทธ๋ฆฌ๊ณ ConfigMap๊ณผ Secret๋ ์๊ฐํ๋ ค ํ๋ค.
emptyDir
ํ๋๊ฐ ๋ ธ๋์์ ์คํ๋๋ ๋์ ์์ฑ๋๋ ์์ ๋ณผ๋ฅจ์ด๋ค. Pod๊ฐ ์ฌ์์ฑ๋๋ฉด ๋ณผ๋ฅจ๋ ์ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ ์ผ์์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋๋ค.
HostPath
ํธ์คํธ ๋ ธ๋์ ํ์ผ ์์คํ ๊ฒฝ๋ก์ ํ๋๋ฅผ ๋ง์ดํธํ๋ค. ํธ์คํธ ๋ ธ๋์ ํน์ ๋๋ ํ ๋ฆฌ์ ์ ๊ทผํด์ผ ํ ๋ ์ฌ์ฉํ๋ค.
ex) ๋ก๊ทธ ํ์ผ ๊ณต์
PVC/PV
ํด๋ฌ์คํฐ ๋ด์์ ๋ ๋ฆฝ์ ์ผ๋ก ๊ด๋ฆฌ๋๋ ์คํ ๋ฆฌ์ง ๋ฆฌ์ค์์๋ค. PVC๋ ํ๋๊ฐ ์์ฒญํ๋ ์คํ ๋ฆฌ์ง ์๊ตฌ ์ฌํญ์ ์ ์ํ๋ค.
ConfigMap
์ค์ ๋ฐ์ดํฐ๋ฅผ ํค-๊ฐ ์์ผ๋ก ์ ์ฅํ๊ณ ํ๋์ ๋ง์ดํธํ๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ ์ ๋ณด๋ฅผ ์ธ๋ถ์์ ๊ด๋ฆฌํ ๋ ์ฌ์ฉํ๋ค. ํ๊ฒฝ ๋ณ์๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
Secret
๋น๋ฐ๋ฒํธ, ํ ํฐ, ํค ๋ฑ์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๊ณ ํ๋์ ๋ง์ดํธํ๋ค. ์ธ์ฝ๋ฉ ๋์ฝ๋ฉ ๊ณผ์ ์ ๊ฑฐ์น๋ค.
Namespace
๋ค์์คํ์ด์ค๋ ์ฟ ๋ฒ๋คํฐ์ค ํด๋ฌ์คํฐ ํ๋๋ฅผ ์ฌ๋ฌ ๊ฐ์ ๋ ผ๋ฆฌ์ ์ธ ๋จ์๋ก ๋๋ ์ ์ฌ์ฉํ๋ ๊ฒ์ด๋ค. ํ๋์ ์๋น์ค๋ฑ์ ๋ค์์คํ์ด์ค ๋ณ๋ก ์์ฑ์ด๋ ๊ด๋ฆฌ๊ฐ ๋ ์ ์๊ณ , ์ฌ์ฉ์ ๊ถํ ์ญ์ ๋ค์์คํ์ด์ค ๋ณ๋ก ๋๋ ์ ๋ถ์ฌํ ์ ์๋ค.
๋์ผํ Namespace๋ผ๋ฉด Pod์ ์ด๋ฆ์ ์ ์ผํด์ผ ํ์ง๋ง ๋ ๊ฐ์ ๋ค๋ฅธ ๋ค์์คํ์ด์ค์์ ๊ฐ๊ฐ ๋์ผํ ์ด๋ฆ์ ํ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๋ค์์คํ์ด์ค๋ณ๋ก ๋ฆฌ์์ค ํ ๋น๋(Resource Quota)๊ณผ ์ ํ(Limit Range)์ ์ค์ ํ ์ ์๋ค. ์ด๋ฅผ ํตํด ๊ฐ ๋ค์์คํ์ด์ค๊ฐ ์ฌ์ฉํ ์ ์๋ CPU, ๋ฉ๋ชจ๋ฆฌ ๋ฑ์ ๋ฆฌ์์ค๋ฅผ ์ ํํ๊ณ ๊ด๋ฆฌํ ์ ์๋ค.
Namespace์ ์์ฑ์ ์๋์ ๊ฐ์ด ํ ์ ์๋ค.
apiVersion: v1
kind: Namespace
metadata:
name: nm-1
์ด๋ ๊ฒ ์์ฑ๋ Namespace๋ Pod์์ฑ ์ ์ง์ ํ์ฌ Pod๋ฅผ ์ด๋ค Namespace์ ๋ฃ์ ์ง ์ค์ ํ ์ ์๋ค.
apiVersion: v1
kind: Pod
metadata:
name: pod-1
namespace: nm-1
labels:
nm: pod1
spec:
containers:
...
ResourceQuota์ LimitRange์ ์ค์ ๋ฐฉ๋ฒ์ ๊ฐ๊ฐ ์๋์ ๊ฐ๋ค.
- ResourceQuota
apiVersion: v1
kind: ResourceQuota
metadata:
name: rq-1
namespace: nm-1
spec:
hard:
requests.memory: 3Gi
limits.memory: 6Gi
- LimitRange
apiVersion: v1
kind: LimitRange
metadata:
name: lr-1
namespace: nm-1
spec:
limits:
- type: Container
min:
memory: 1Gi
max:
memory: 4Gi
defaultRequest:
memory: 1Gi
default:
memroy: 2Gi
maxLimitRequestRatio:
memory: 3