π κ°μ
ν μ€ μμ½: Deployment, DaemonSet λ±μ Podλ₯Ό μμ νκ² κ΅μ²΄νλ Rolling Update λ©μ»€λμ¦
ν΅μ¬ κ°λ
:
- Pod μ¬μμ: Pod μμ ν μ¬μμ± (IP λ³κ²½, AGE μ΄κΈ°ν)
- 컨ν
μ΄λ μ¬μμ: Podλ μ μ§, 컨ν
μ΄λλ§ μ¬μμ (RESTARTS μ¦κ°)
- Rollout: spec λ³κ²½ μ μμ°¨μ μΌλ‘ Podλ₯Ό μμ νκ² κ΅μ²΄
π Pod μ¬μμ vs 컨ν
μ΄λ μ¬μμ
Pod μ¬μμ (Pod μμ ν μ¬μμ±)
1
2
3
4
5
6
7
| kubectl delete pod <pod-name>
β
Pod μμ ν μμ
β
μ Pod μμ± (μλ‘μ΄ IP, μλ‘μ΄ AGE)
β
kubectl get pods β AGEκ° μ§§μμ§
|
νΉμ§:
- Pod IP λ³κ²½
- AGE μ΄κΈ°ν
- RESTARTS 0μΌλ‘ μ΄κΈ°ν
- μλ‘μ΄ λ¦¬μμ€ ν λΉ
λ°μ μμΈ:
kubectl delete pod- λ
Έλ μ₯μ
- Deployment μ΄λ―Έμ§ λ³κ²½
kubectl rollout restart
컨ν
μ΄λ μ¬μμ (Podλ μ μ§)
1
2
3
4
5
6
7
| 컨ν
μ΄λ νλ‘μΈμ€ λΉμ μ μ’
λ£ (OOMKill, Crash λ±)
β
Podλ κ·Έλλ‘ μ μ§
β
컨ν
μ΄λλ§ μ¬μμ
β
kubectl get pods β AGE κ·Έλλ‘, RESTARTS μ¦κ°
|
νΉμ§:
- Pod IP μ μ§
- AGE μ μ§
- RESTARTS μ«μ λμ μ¦κ°
- λμΌν 리μμ€ μ¬μ¬μ©
λ°μ μμΈ:
- OOMKilled (λ©λͺ¨λ¦¬ μ΄κ³Ό)
- CrashLoopBackOff (νλ‘μΈμ€ λΉμ μ μ’
λ£)
- Liveness Probe μ€ν¨
- 컨ν
μ΄λ μλ¬
λΉκ΅ν
| νλͺ© | Pod μ¬μμ | 컨ν
μ΄λ μ¬μμ |
|---|
| AGE | λ³κ²½λ¨ (μ΄κΈ°ν) | κ·Έλλ‘ μ μ§ |
| IP | λ³κ²½λ¨ | κ·Έλλ‘ μ μ§ |
| RESTARTS | 0μΌλ‘ μ΄κΈ°ν | λμ μ¦κ° |
| μμΈ | kubectl delete, λ
Έλ μ₯μ , rollout | OOMKill, Crash, Probe μ€ν¨ |
| νμΈ | kubectl get pods β AGE νμΈ | kubectl get pods β RESTARTS νμΈ |
π― Rollout λ©μ»€λμ¦
κΈ°λ³Έ μ리
1
2
3
4
5
6
7
| spec λ³κ²½ κ°μ§ (μ΄λ―Έμ§ λ³κ²½, annotation λ³κ²½ λ±)
β
updateStrategyμ λ°λΌ μμ°¨μ μΌλ‘ Pod κ΅μ²΄
β
μ Pod Running νμΈ ν λ€μ Pod κ΅μ²΄
β
λͺ¨λ Pod κ΅μ²΄ μλ£
|
rollout restart λμ
1
| kubectl rollout restart daemonset -n kube-system calico-node
|
λ΄λΆ λμ:
1
2
3
4
5
6
7
8
9
10
11
12
| 1. DaemonSet annotationμ μ¬μμ μκ° μΆκ°
kubectl.kubernetes.io/restartedAt: "2025-02-19T21:00:00"
β
2. spec λ³κ²½μΌλ‘ μΈμ β Rolling Update νΈλ¦¬κ±°
β
3. updateStrategyμ λ°λΌ μμ°¨ μ¬μμ
β
4. κ° Pod:
- κΈ°μ‘΄ Pod μμ
- μ Pod μμ±
- Running νμΈ
- λ€μ Podλ‘ μ§ν
|
π§ updateStrategy
Deployment
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| apiVersion: apps/v1
kind: Deployment
metadata:
name: web-app
spec:
replicas: 5
strategy:
type: RollingUpdate # κΈ°λ³Έκ°
rollingUpdate:
maxUnavailable: 1 # λμμ λ΄λ¦΄ μ μλ Pod μ
maxSurge: 1 # μΆκ°λ‘ μ¬λ¦΄ μ μλ Pod μ
template:
spec:
containers:
- name: nginx
image: nginx:1.21
|
λμ μμ (replicas: 5 β μ΄λ―Έμ§ λ³κ²½):
1
2
3
4
| 1. μ Pod 1κ° μμ± (maxSurge=1) β μ΄ 6κ°
2. μ Pod Running νμΈ
3. κΈ°μ‘΄ Pod 1κ° μμ (maxUnavailable=1) β μ΄ 5κ°
4. λ°λ³΅ β λͺ¨λ Pod κ΅μ²΄ μλ£
|
DaemonSet (calico-node)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| apiVersion: apps/v1
kind: DaemonSet
metadata:
name: calico-node
namespace: kube-system
spec:
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1 # λμμ μ¬μμν λ
Έλ μ
maxSurge: 0 # DaemonSetμ λ
ΈλλΉ 1κ°λΌ Surge μμ
template:
spec:
containers:
- name: calico-node
image: calico/node:v3.20
|
DaemonSet νΉμ§:
- λ
ΈλλΉ Pod 1κ°λ§ μ€ν
maxSurge: 0 (μΆκ° Pod λΆκ°)maxUnavailable: 1 β ν λ²μ 1κ° λ
Έλμ© μ¬μμ
updateStrategy νμ
| type | λμ | μ¬μ© μκΈ° |
|---|
| RollingUpdate | μμ°¨μ μΌλ‘ νλμ© κ΅μ²΄ (κΈ°λ³Έκ°) | μΌλ°μ μΈ μ
λ°μ΄νΈ |
| OnDelete | μ§μ μμ ν λλ§ κ΅μ²΄ (μλ X) | μλ μ μ΄ νμ μ |
π» Rollout λͺ
λ Ήμ΄
κΈ°λ³Έ λͺ
λ Ήμ΄
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| # μ¬μμ (annotation λ³κ²½ λ°©μ)
kubectl rollout restart deployment web-app -n default
kubectl rollout restart daemonset calico-node -n kube-system
# μ§ν μν© νμΈ
kubectl rollout status deployment web-app -n default
# Waiting for deployment "web-app" rollout to finish: 2 out of 5 new replicas have been updated...
# deployment "web-app" successfully rolled out
# μΌμ μ€μ§ (λ¬Έμ λ°μ μ)
kubectl rollout pause deployment web-app -n default
# μ¬κ°
kubectl rollout resume deployment web-app -n default
# νμ€ν 리 νμΈ
kubectl rollout history deployment web-app -n default
# REVISION CHANGE-CAUSE
# 1 <none>
# 2 kubectl set image deployment/web-app nginx=nginx:1.22
# μ΄μ λ²μ μΌλ‘ λ‘€λ°±
kubectl rollout undo deployment web-app -n default
# νΉμ revisionμΌλ‘ λ‘€λ°±
kubectl rollout undo deployment web-app -n default --to-revision=1
|
μ€μκ° λͺ¨λν°λ§
1
2
3
4
5
6
7
8
| # Rollout μ§ν μν© μ€μκ° νμΈ
watch kubectl get pods -n default
# DaemonSet λ
Έλλ³ μν
kubectl get daemonset -n kube-system calico-node -o wide
# μ΄λ²€νΈ νμΈ
kubectl get events -n default --sort-by='.lastTimestamp' | grep web-app
|
π 컨ν
μ΄λ μ¬μμ μμΈ λΆμ
μ¬μμ μμΈ νμΈ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
| # μ¬μμ μμΈ νμΈ
kubectl describe pod <pod-name> -n <namespace> | grep -A 10 "Last State"
# μΆλ ₯ μμ:
# Last State: Terminated
# Reason: OOMKilled
# Exit Code: 137
# Started: Wed, 19 Feb 2025 10:00:00 +0900
# Finished: Wed, 19 Feb 2025 10:05:00 +0900
# μ΄μ 컨ν
μ΄λ λ‘κ·Έ νμΈ
kubectl logs <pod-name> -n <namespace> --previous
# RESTARTS λμ Pod μ°ΎκΈ°
kubectl get pods -A --sort-by='.status.containerStatuses[0].restartCount' | tail -10
|
μ£Όμ μ¬μμ μμΈ
| μμΈ | μ¦μ | νμΈ λ°©λ² | μ‘°μΉ |
|---|
| OOMKilled | λ©λͺ¨λ¦¬ μ΄κ³Ό | Reason: OOMKilled / Exit Code: 137 | Memory Limit μ¦κ° |
| CrashLoopBackOff | νλ‘μΈμ€ λΉμ μ μ’
λ£ | Reason: Error / Exit Code: 1 | λ‘κ·Έ νμΈ, μ½λ μμ |
| Liveness Probe μ€ν¨ | ν¬μ€μ²΄ν¬ μ€ν¨ | Liveness probe failed | Probe μ€μ νμΈ |
| λ
Έλ 리μμ€ λΆμ‘± | μ¬λ¬ Pod λμ μ¬μμ | kubectl top nodes | λ
Έλ 리μμ€ νμΈ |
λλ²κΉ
μμ
1
2
3
4
5
6
7
8
| # OOMKilled νμΈ
kubectl describe pod my-app-123 -n default | grep -i oom
# 리μμ€ μ¬μ©λ νμΈ
kubectl top pod my-app-123 -n default
# μ΄λ²€νΈ νμΈ
kubectl get events -n default --field-selector involvedObject.name=my-app-123
|
β οΈ μ£Όμμ¬ν
Rollout κ΄λ ¨
1. maxUnavailable λ무 ν¬κ² μ€μ
1
2
3
4
5
6
7
| # β μν
rollingUpdate:
maxUnavailable: 5 # replicas 5κ° μ€ 5κ° λ΄λ¦Ό β μλΉμ€ μ€λ¨
# β
μμ
rollingUpdate:
maxUnavailable: 1 # μ΅μ κ°μ©μ± 보μ₯
|
2. Probe λ―Έμ€μ μ λ¬Έμ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
| # β Probe μμ
spec:
containers:
- name: app
image: myapp:1.0
# readinessProbe μμ β μ Podκ° μ€λΉ μ λλλ° νΈλν½ λ°μ
# β
Probe μ€μ
spec:
containers:
- name: app
image: myapp:1.0
readinessProbe:
httpGet:
path: /health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
|
3. DaemonSet maxUnavailable
1
2
3
4
5
| # β μν (λ
Έλ 3κ° ν΄λ¬μ€ν°)
maxUnavailable: 3 # λͺ¨λ λ
Έλ λμ μ¬μμ β calico-node μ 체 μ€λ¨
# β
μμ
maxUnavailable: 1 # ν λ²μ 1κ° λ
Έλμ©
|
컨ν
μ΄λ μ¬μμ κ΄λ ¨
1. RESTARTS κ³μ μ¦κ°
1
2
3
4
5
6
| # μμΈ νμ
kubectl describe pod <pod-name> | grep -A 10 "Last State"
# CrashLoopBackOff β μ½λ λ¬Έμ
# OOMKilled β λ©λͺ¨λ¦¬ λΆμ‘±
# Liveness probe failed β Probe μ€μ λ¬Έμ
|
2. λ©λͺ¨λ¦¬ λΆμ‘± ν΄κ²°
1
2
3
4
5
6
7
8
9
| # νμ¬ μ¬μ©λ νμΈ
kubectl top pod <pod-name>
# Memory Limit μ¦κ°
resources:
requests:
memory: "256Mi"
limits:
memory: "1Gi" # 512Mi β 1Giλ‘ μ¦κ°
|
π μμ½
Pod vs 컨ν
μ΄λ μ¬μμ
1
2
3
4
5
6
7
8
9
| Pod μ¬μμ:
- Pod μμ ν μ¬μμ±
- IP λ³κ²½, AGE μ΄κΈ°ν, RESTARTS 0
- μμΈ: kubectl delete, rollout, λ
Έλ μ₯μ
컨ν
μ΄λ μ¬μμ:
- Pod μ μ§, 컨ν
μ΄λλ§ μ¬μμ
- IP μ μ§, AGE μ μ§, RESTARTS μ¦κ°
- μμΈ: OOMKill, Crash, Probe μ€ν¨
|
Rollout ν΅μ¬
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| λμ:
1. spec λ³κ²½ κ°μ§ (μ΄λ―Έμ§, annotation)
2. updateStrategyμ λ°λΌ μμ°¨ κ΅μ²΄
3. μ Pod Running νμΈ ν λ€μ μ§ν
λͺ
λ Ήμ΄:
kubectl rollout restart <type> <name>
kubectl rollout status <type> <name>
kubectl rollout pause / resume <type> <name>
kubectl rollout undo <type> <name>
kubectl rollout undo <type> <name> --to-revision=N
μμ μ€μ :
- maxUnavailable: 1 (μ΅μ κ°μ©μ± μ μ§)
- readinessProbe νμ
- DaemonSetμ maxUnavailable: 1 κΆμ₯
|
π κ΄λ ¨ λ¬Έμ
Comments powered by Disqus.