์ฟ ๋ฒ๋คํฐ์ค๋ฅผ ์ฒ์ ๋ฐฐ์ธ ๋ ์ ์ผ ํท๊ฐ๋ฆฌ๋ ๊ฐ๋ ์ด ๋ฐ๋ก Pod(ํ๋)์ ๋๋ค. Docker ์ปจํ ์ด๋๋ ๋ญ๊ฐ ๋ค๋ฅธ ๊ฑฐ์ง? ๋ผ๊ณ ์๊ฐํ๊ธฐ ์ฌ์ด๋ฐ, ์ฟ ๋ฒ๋คํฐ์ค๋ ์ปจํ ์ด๋๋ฅผ ์ง์ ๊ด๋ฆฌํ์ง ์์ต๋๋ค. ์ปจํ ์ด๋๋ฅผ ํ๋๋ผ๋ ๊ป์ง๋ก ๊ฐ์ธ์ ๋ค๋ฃจ์ฃ . ์ด๋ฒ ์ค์ต์ ํ๋๋ฅผ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ๋ง๋ค๊ณ , ๋ด๋ถ๋ฅผ ์ง์ ๋ค์ฌ๋ค๋ณด๊ณ , ์๋ช ์ฃผ๊ธฐ๋ฅผ ๊ด์ฐฐํ ๊ธฐ๋ก์ ๋๋ค.
๐ฏ ์ด๋ฒ ์ค์ต์์ ๋ค๋ฃฌ ๊ฒ๋ค
- ๋ช ๋ นํ(Imperative) vs ์ ์ธํ(Declarative) ๋ฐฉ์ ๋น๊ต
- Resource Quota ์ค์ (
requests/limits) kubectl describe๋ก ํ๋ ์ํ ์ถ์ kubectl exec๋ก ์ปจํ ์ด๋ ๋ด๋ถ ์ ์- ํ๋์ ์ํ ๋ณํ ๊ด์ฐฐ (
ContainerCreatingโRunning)
๐ ๋ฐฉ๋ฒ 1: ๋ช ๋ นํ (Imperative) โ ๋น ๋ฅธ ํ ์คํธ์ฉ
์ผํ์ฑ ํ ์คํธ์ ์ด ๋ฐฉ๋ฒ์ด ๋น ๋ฆ ๋๋ค. CLI ๋ช ๋ น์ด ํ ์ค๋ก ๋ฐ๋ก ๋์๋๋ค.
# ํ๋ ์์ฑ
kubectl run nginx-pod --image=nginx:1.21
# ์ํ ํ์ธ
kubectl get pods
# ์์ธ ์ ๋ณด (Events ํญ๋ชฉ์ด ํต์ฌ)
kubectl describe pod nginx-pod
# ๋ก๊ทธ ํ์ธ
kubectl logs nginx-pod
# ์ปจํ
์ด๋ ๋ด๋ถ ์ ์ (SSH ๊ฐ์ ๋๋)
kubectl exec -it nginx-pod -- /bin/bash
# ์ญ์
kubectl delete pod nginx-pod
kubectl describe์ Events ํญ๋ชฉ์ ๋ณด๋ฉด ํ๋๊ฐ ์ด๋ค ๋
ธ๋์ ์ค์ผ์ค๋ง๋๋์ง, ์ด๋ฏธ์ง๋ฅผ ์ธ์ ๋ค์ด๋ก๋ํ๋์ง ์ ๋ถ ์ถ์ ํ ์ ์์ต๋๋ค. ํ๋๊ฐ ์ด์ํ๋ฉด ๊ฐ์ฅ ๋จผ์ ์ด๊ฑธ ๋ด์ผ ํฉ๋๋ค.
๐ ๋ฐฉ๋ฒ 2: ์ ์ธํ (Declarative) โ ์ค๋ฌด ํ์ค โญ
์ค๋ฌด์์๋ YAML ํ์ผ์ ์์ฑํด์ “์ด ์ํ๋ฅผ ์ ์งํด์ค”๋ผ๊ณ ์ฟ ๋ฒ๋คํฐ์ค์ ์ ๋ฌํฉ๋๋ค. ํ์ ๊ด๋ฆฌ๋ ๋๊ณ , ํ์๊ณผ ๊ณต์ ๋ ์ฝ์ต๋๋ค.
# nginx-pod.yaml
apiVersion: v1
kind: Pod
metadata:
name: nginx-pod
labels:
app: nginx
spec:
containers:
- name: nginx
image: nginx:1.21
ports:
- containerPort: 80
resources: # ์์ ๊ด๋ฆฌ (์ค์!)
requests: # "์ต์ ์ด๋งํผ์ ์์ด์ผ ์ผํฉ๋๋ค"
memory: "64Mi"
cpu: "100m" # 1 CPU์ 10%
limits: # "์ด ์ด์์ ์ ๋ ์ ๋ฉ๋๋ค"
memory: "128Mi"
cpu: "200m"
Resource ์ค์ ์ด ์ ์ค์ํ๊ฐ? requests๊ฐ ์์ผ๋ฉด ์ค์ผ์ค๋ฌ๊ฐ ์ด๋ ๋
ธ๋์ ๋ฐฐ์นํ ์ง ํ๋จ์ ๋ชป ํฉ๋๋ค. limits๊ฐ ์์ผ๋ฉด ํ๋์ ํ๋๊ฐ ๋
ธ๋ ์์์ ๋
์ํ๋ค๊ฐ ๋ค๋ฅธ ํ๋๋ค์ ์ฃฝ์ผ ์ ์์ต๋๋ค. ์ฒ์๋ถํฐ ์ต๊ด์ฒ๋ผ ๋ฃ์ด๋๋ ๊ฒ ๋ง์ต๋๋ค.
# ํ๋ ์์ฑ
kubectl apply -f nginx-pod.yaml
# ๋
ธ๋ ํ ๋น ํ์ธ (-o wide ์ต์
์ด ํต์ฌ)
kubectl get pods -o wide
-o wide ์ต์
์ ์ฐ๋ฉด ํ๋์ IP์ฃผ์์ ์ด๋ ๋
ธ๋์ ๋ฐฐ์น๋๋์ง๊ฐ ๋ณด์
๋๋ค. ์ค์ผ์ค๋ฌ๊ฐ ์์ ์ฌ์ ๋ฅผ ๊ณ์ฐํด์ ์๋์ผ๋ก ๋ฐฐ์ ํ ๊ฒฐ๊ณผ์
๋๋ค.
๐ ํ๋ ์๋ช ์ฃผ๊ธฐ ๊ด์ฐฐ
ContainerCreating โ Running
ํ๋๋ฅผ ์ฒ์ ์์ฑํ๋ฉด ๊ณง๋ฐ๋ก Running์ด ๋์ง ์์ต๋๋ค.
- ContainerCreating โ ์์ปค ๋ ธ๋๊ฐ ์ด๋ฏธ์ง๋ฅผ ๋ ์ง์คํธ๋ฆฌ์์ ๋ค์ด๋ก๋ ์ค
- Running โ ์ด๋ฏธ์ง ๋ค์ด๋ก๋ ์๋ฃ, ํ๋ก์ธ์ค ์์
์ด๋ฏธ์ง๊ฐ ๋
ธ๋์ ์ด๋ฏธ ์บ์๋ผ ์์ผ๋ฉด ๋ช ์ด, ์ฒ์ ๋ฐ์ผ๋ฉด ๋คํธ์ํฌ ์๋์ ๋ฐ๋ผ 10~30์ด ๊ฑธ๋ฆฝ๋๋ค. kubectl describe์ Events์์ Pulling image "nginx:1.21" ๋ฉ์์ง๋ก ํ์ธํ ์ ์์ต๋๋ค.
๐จ ์ฝ์ง ํฌ์ธํธ
โ ๏ธ ContainerCreating ์ํ๊ฐ ๊ณ์ ์ ์ง๋๋ค๋ฉด?
์ฒ์์ ์ ๊น ๋นํฉํ๋๋ฐ, ์ด๊ฑด ์ฌ์ค ์ ์์
๋๋ค. ์ด๋ฏธ์ง๋ฅผ ๋ค์ด๋ก๋ํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๊ฒ๋ฟ์
๋๋ค. kubectl describe pod nginx-pod๋ก Events๋ฅผ ํ์ธํด๋ณด๋ฉด ํ์ฌ ๋ฌด์จ ๋จ๊ณ์ธ์ง ์ ์ ์์ต๋๋ค.
์ง์ง ๋ฌธ์ ์ํฉ์ด๋ผ๋ฉด ImagePullBackOff๋ ErrImagePull ๊ฐ์ ์๋ฌ๊ฐ ํ์๋ฉ๋๋ค.
๐ก ๋ช ๋ นํ vs ์ ์ธํ, ์ธ์ ๋ญ ์ฐ๋?
| ์ํฉ | ๋ฐฉ๋ฒ |
|---|---|
| ๋น ๋ฅธ ํ ์คํธ, ๋๋ฒ๊น | ๋ช
๋ นํ (kubectl run) |
| ์ค์ ์๋น์ค ๋ฐฐํฌ, ํ ํ์ | ์ ์ธํ (kubectl apply -f) |
| CI/CD ํ์ดํ๋ผ์ธ | ์ ์ธํ (YAML ํ์ผ์ Git์ผ๋ก ๊ด๋ฆฌ) |
์ ์ธํ์ด ์ข์ ์ด์ ๋ “ํ์ฌ ์ํ๋ ์ํ๋ฅผ ์ฝ๋๋ก ์ ์”ํ ์ ์๊ธฐ ๋๋ฌธ์
๋๋ค. ํ๋๊ฐ ์ฃฝ์ด๋ ๋ค์ kubectl applyํ๋ฉด ์์๋ณต๊ตฌ๋ฉ๋๋ค.
โ ์ ๋ฆฌ
ํ๋ ํ๋๋ฅผ ์ง์ ๋ค๋ค๋ณด๋, ์ฟ ๋ฒ๋คํฐ์ค๊ฐ “์ปจํ ์ด๋๋ฅผ ์ด๋์ ์ผ๋ง๋ ์ด๋ป๊ฒ ๋ฐฐ์นํ ์ง”๋ฅผ ์ ๋ถ ์์์ ํด์ค๋ค๋ ๊ฑธ ์ค๊ฐํ์ต๋๋ค. ๊ทธ๋ฐ๋ฐ ํ๋๋ ํผ์์ ์๊ฐ ์น์ ๊ฐ ์ ๋ฉ๋๋ค. ํ๋๊ฐ ์ฃฝ์ผ๋ฉด ๊ทธ๋ฅ ๋์ ๋๋ค.
๋ค์ ๊ธ์์๋ ํ๋๋ฅผ “๊ตฐ๋จ” ๋จ์๋ก ๊ด๋ฆฌํ๊ณ , ์ฃฝ์ผ๋ฉด ์๋์ผ๋ก ์ด์๋๋ Deployment๋ฅผ ๋ค๋ฃน๋๋ค.