Post

[Kubernetes] ReplicaSet

๐Ÿ“Œ ๊ฐœ์š”

ํ•œ ์ค„ ์š”์•ฝ: ์ง€์ •ํ•œ ์ˆ˜์˜ Pod๊ฐ€ ํ•ญ์ƒ ์‹คํ–‰๋˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ๋ฆฌ์†Œ์Šค

ํ•ต์‹ฌ ๋™์ž‘:

1
2
3
4
5
6
replicas: 3 ์„ค์ •
    โ†“
ReplicaSet์ด ํ•ญ์ƒ 3๊ฐœ Pod ์œ ์ง€
    โ†“
Pod 1๊ฐœ ์ฃฝ์œผ๋ฉด โ†’ ์ž๋™์œผ๋กœ ์ƒˆ Pod ์ƒ์„ฑ
Pod 1๊ฐœ ์ˆ˜๋™ ์ถ”๊ฐ€๋˜๋ฉด โ†’ ์ž๋™์œผ๋กœ 1๊ฐœ ์‚ญ์ œ

์‹ค๋ฌด ์‚ฌ์šฉ:

  • โŒ ReplicaSet ์ง์ ‘ ์ƒ์„ฑ (๋น„๊ถŒ์žฅ)
  • โœ… Deployment๋ฅผ ํ†ตํ•ด ๊ฐ„์ ‘ ๊ด€๋ฆฌ (๊ถŒ์žฅ)

๐Ÿ— Deployment์™€์˜ ๊ด€๊ณ„

๊ณ„์ธต ๊ตฌ์กฐ

1
2
3
4
5
Deployment (๋ฐฐํฌ ๊ด€๋ฆฌ)
    โ†“ ์ƒ์„ฑ/๊ด€๋ฆฌ
ReplicaSet (Pod ์ˆ˜ ๊ด€๋ฆฌ)
    โ†“ ์ƒ์„ฑ/๊ด€๋ฆฌ
Pod (์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ)

Deployment vs ReplicaSet

๊ธฐ๋ŠฅDeploymentReplicaSet
๋กค๋ง ์—…๋ฐ์ดํŠธโœ… ์ง€์›โŒ ๋ถˆ๊ฐ€๋Šฅ
๋กค๋ฐฑโœ… ์ง€์›โŒ ๋ถˆ๊ฐ€๋Šฅ
Pod ์ˆ˜ ๋ณด์žฅโœ… (RS ํ†ตํ•ด)โœ… ์ง€์›
์ด๋ ฅ ๊ด€๋ฆฌโœ… ์ง€์›โŒ ๋ถˆ๊ฐ€๋Šฅ
์ง์ ‘ ์‚ฌ์šฉโœ… ๊ถŒ์žฅโŒ ๋น„๊ถŒ์žฅ

์‹ค๋ฌด ๊ถŒ์žฅ:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# โŒ ReplicaSet ์ง์ ‘ ์ƒ์„ฑ (ํ•˜์ง€ ๋งˆ์„ธ์š”)
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: my-app-rs
spec:
  replicas: 3
  # ...

# โœ… Deployment ์‚ฌ์šฉ (๊ถŒ์žฅ)
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  # Deployment๊ฐ€ ReplicaSet ์ž๋™ ์ƒ์„ฑ

๐Ÿ”„ ReplicaSet ์ƒ์„ฑ ์‹œ์ 

์ƒˆ ReplicaSet์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒฝ์šฐ

Deployment์˜ template.spec ๋‚ด์šฉ์ด ๋ฐ”๋€Œ๋ฉด ์ƒˆ ReplicaSet์ด ์ƒ์„ฑ๋ฉ๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ์ƒˆ RS ์ƒ์„ฑ์ด์œ 
์ด๋ฏธ์ง€ ๋ณ€๊ฒฝโœ…Pod spec ๋ณ€๊ฒฝ
ํ™˜๊ฒฝ๋ณ€์ˆ˜ ๋ณ€๊ฒฝโœ…Pod spec ๋ณ€๊ฒฝ
Requests/Limits ๋ณ€๊ฒฝโœ…Pod spec ๋ณ€๊ฒฝ
Volume ๋ณ€๊ฒฝโœ…Pod spec ๋ณ€๊ฒฝ
Command/Args ๋ณ€๊ฒฝโœ…Pod spec ๋ณ€๊ฒฝ
replicas ๋ณ€๊ฒฝโŒ๊ธฐ์กด RS ์ˆ˜์ •
metadata.labels ๋ณ€๊ฒฝโŒPod spec ๋ฌด๊ด€

์˜ˆ์‹œ: ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ

1
2
3
4
5
6
7
8
9
10
11
12
# ์ดˆ๊ธฐ Deployment
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.21  # ๋ฒ„์ „ 1

์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ:

1
kubectl set image deployment/web-app nginx=nginx:1.22

๊ฒฐ๊ณผ:

1
2
๊ธฐ์กด: web-app-7d4b5c8f9d (nginx:1.21) โ†’ 0/3
์ƒˆ๋กœ: web-app-5f6g7h8i9j (nginx:1.22) โ†’ 3/3

์˜ˆ์‹œ: replicas ๋ณ€๊ฒฝ

1
kubectl scale deployment web-app --replicas=5

๊ฒฐ๊ณผ:

1
๊ธฐ์กด: web-app-7d4b5c8f9d โ†’ 5/5 (์ƒˆ RS ์ƒ์„ฑ ์•ˆ ํ•จ)

๐Ÿš€ ๋กค๋ง ์—…๋ฐ์ดํŠธ ๋™์ž‘

์—…๋ฐ์ดํŠธ ํ๋ฆ„

1
2
3
4
5
6
7
8
9
1. Deployment template.spec ๋ณ€๊ฒฝ
    โ†“
2. ์ƒˆ ReplicaSet ์ƒ์„ฑ (0/3)
    โ†“
3. ์ƒˆ ReplicaSet Pod ํ•˜๋‚˜์”ฉ ๋Š˜์–ด๋‚จ (1/3, 2/3, 3/3)
    โ†“
4. ๊ธฐ์กด ReplicaSet Pod ํ•˜๋‚˜์”ฉ ์ค„์–ด๋“ฆ (2/3, 1/3, 0/3)
    โ†“
5. ๊ธฐ์กด ReplicaSet์€ 0/3์œผ๋กœ ๋ณด์กด (์‚ญ์ œ ์•ˆ ํ•จ!)

๋‹จ๊ณ„๋ณ„ ์ƒํƒœ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
์ดˆ๊ธฐ ์ƒํƒœ:
ReplicaSet-v1 (nginx:1.21): 3/3
ReplicaSet-v2 (nginx:1.22): ์—†์Œ

์—…๋ฐ์ดํŠธ ์‹œ์ž‘:
ReplicaSet-v1: 3/3
ReplicaSet-v2: 0/3 (์ƒ์„ฑ)

์ง„ํ–‰ ์ค‘ (1):
ReplicaSet-v1: 2/3
ReplicaSet-v2: 1/3

์ง„ํ–‰ ์ค‘ (2):
ReplicaSet-v1: 1/3
ReplicaSet-v2: 2/3

์—…๋ฐ์ดํŠธ ์™„๋ฃŒ:
ReplicaSet-v1: 0/3 (๋ณด์กด โœ…)
ReplicaSet-v2: 3/3

์‹ค์‹œ๊ฐ„ ํ™•์ธ

1
2
3
4
5
6
7
8
9
10
# ์—…๋ฐ์ดํŠธ ์ง„ํ–‰ ์ƒํ™ฉ ๋ชจ๋‹ˆํ„ฐ๋ง
kubectl rollout status deployment web-app -n default

# ReplicaSet ๋ณ€ํ™” ์‹ค์‹œ๊ฐ„ ํ™•์ธ
watch kubectl get rs -n default

# ์ถœ๋ ฅ ์˜ˆ์‹œ:
NAME                DESIRED   CURRENT   READY   AGE
web-app-7d4b5c8f9d  0         0         0       10m  # ๊ตฌ๋ฒ„์ „
web-app-5f6g7h8i9j  3         3         3       2m   # ์‹ ๋ฒ„์ „

๐Ÿ”™ ๊ธฐ์กด ReplicaSet ๋ณด์กด ์ด์œ 

๋กค๋ฐฑ์„ ์œ„ํ•œ ๋ณด์กด

๊ธฐ์กด ReplicaSet์„ 0/3 ์ƒํƒœ๋กœ ๋ณด์กดํ•˜๋Š” ์ด์œ ๋Š” ๋กค๋ฐฑ ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

1
2
3
4
5
6
๋ฐฐํฌ ์ด๋ ฅ:
Revision 1: ReplicaSet-v1 (nginx:1.21) โ†’ 0/3 ๋ณด์กด
Revision 2: ReplicaSet-v2 (nginx:1.22) โ†’ 0/3 ๋ณด์กด
Revision 3: ReplicaSet-v3 (nginx:1.23) โ†’ 3/3 ํ˜„์žฌ
    โ†“
๋กค๋ฐฑ ๊ฐ€๋Šฅ!

๋กค๋ฐฑ ๋ช…๋ น์–ด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# ํžˆ์Šคํ† ๋ฆฌ ํ™•์ธ
kubectl rollout history deployment web-app -n default

# ์ถœ๋ ฅ:
REVISION  CHANGE-CAUSE
1         <none>
2         kubectl set image deployment/web-app nginx=nginx:1.22
3         kubectl set image deployment/web-app nginx=nginx:1.23

# ํŠน์ • ๋ฒ„์ „ ์ƒ์„ธ ํ™•์ธ
kubectl rollout history deployment web-app -n default --revision=2

# ๋ฐ”๋กœ ์ด์ „ ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ (Revision 2)
kubectl rollout undo deployment web-app -n default

# ํŠน์ • ๋ฒ„์ „์œผ๋กœ ๋กค๋ฐฑ (Revision 1)
kubectl rollout undo deployment web-app -n default --to-revision=1

๋กค๋ฐฑ ๋™์ž‘

1
2
3
4
5
6
7
8
9
10
11
๋กค๋ฐฑ ์‹คํ–‰ (Revision 3 โ†’ Revision 2)
    โ†“
๊ธฐ์กด ReplicaSet-v2 (0/3) Pod ๋‹ค์‹œ ๋Š˜์–ด๋‚จ
ReplicaSet-v2: 0/3 โ†’ 1/3 โ†’ 2/3 โ†’ 3/3
    โ†“
ํ˜„์žฌ ReplicaSet-v3 (3/3) Pod ์ค„์–ด๋“ฆ
ReplicaSet-v3: 3/3 โ†’ 2/3 โ†’ 1/3 โ†’ 0/3 (๋ณด์กด)
    โ†“
๋กค๋ฐฑ ์™„๋ฃŒ
ReplicaSet-v2: 3/3 (ํ™œ์„ฑ)
ReplicaSet-v3: 0/3 (๋ณด์กด)

โš™๏ธ ๋ณด์กด ๊ฐœ์ˆ˜ ์ œํ•œ

revisionHistoryLimit

๊ธฐ๋ณธ์ ์œผ๋กœ ์ตœ๊ทผ 10๊ฐœ์˜ ReplicaSet์„ ๋ณด์กดํ•ฉ๋‹ˆ๋‹ค.

1
2
3
4
5
6
7
8
apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 3
  revisionHistoryLimit: 10  # ๊ธฐ๋ณธ๊ฐ’
  # ...

๋™์ž‘:

1
2
3
Revision 1~10: ๋ณด์กด
Revision 11 ์ƒ์„ฑ โ†’ Revision 1 ์ž๋™ ์‚ญ์ œ (์˜ค๋ž˜๋œ ๊ฒƒ๋ถ€ํ„ฐ)
Revision 12 ์ƒ์„ฑ โ†’ Revision 2 ์ž๋™ ์‚ญ์ œ

๊ฐ’ ์กฐ์ •:

1
2
3
4
5
6
7
8
# ์ ๊ฒŒ ๋ณด์กด (๋””์Šคํฌ ์ ˆ์•ฝ)
revisionHistoryLimit: 3

# ๋งŽ์ด ๋ณด์กด (๋กค๋ฐฑ ์˜ต์…˜ ํ™•๋Œ€)
revisionHistoryLimit: 20

# ๋ณด์กด ์•ˆ ํ•จ (๋กค๋ฐฑ ๋ถˆ๊ฐ€, ๋น„๊ถŒ์žฅ)
revisionHistoryLimit: 0

๐Ÿ” ReplicaSet ํ™•์ธ

๊ธฐ๋ณธ ๋ช…๋ น์–ด

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# ReplicaSet ๋ชฉ๋ก
kubectl get rs -n default

# ์ถœ๋ ฅ:
NAME                DESIRED   CURRENT   READY   AGE
web-app-7d4b5c8f9d  0         0         0       1h   # ๊ตฌ๋ฒ„์ „ (๋ณด์กด)
web-app-5f6g7h8i9j  3         3         3       10m  # ์‹ ๋ฒ„์ „ (ํ™œ์„ฑ)

# ReplicaSet ์ƒ์„ธ ์ •๋ณด
kubectl describe rs web-app-5f6g7h8i9j -n default

# Deployment์™€ ์—ฐ๊ฒฐ๋œ ReplicaSet ํ™•์ธ
kubectl get rs -n default -l app=web-app

# ReplicaSet์ด ๊ด€๋ฆฌํ•˜๋Š” Pod ํ™•์ธ
kubectl get pods -n default -l app=web-app

ReplicaSet ์ •๋ณด ๋ถ„์„

1
2
3
4
5
6
7
8
# ReplicaSet์˜ Pod Template Hash ํ™•์ธ
kubectl get rs web-app-5f6g7h8i9j -n default -o yaml | grep pod-template-hash

# Deployment์—์„œ ํ˜„์žฌ ํ™œ์„ฑ ReplicaSet ํ™•์ธ
kubectl get deployment web-app -n default -o jsonpath='{.spec.selector}'

# ํŠน์ • ReplicaSet์˜ ์†Œ์œ ์ž ํ™•์ธ (Deployment)
kubectl get rs web-app-5f6g7h8i9j -n default -o jsonpath='{.metadata.ownerReferences[0].name}'

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

ReplicaSet ์ง์ ‘ ์ˆ˜์ • ๊ธˆ์ง€

1
2
3
4
5
6
7
8
9
# โŒ ReplicaSet ์ง์ ‘ ์ˆ˜์ •ํ•˜์ง€ ๋งˆ์„ธ์š”
kubectl edit rs web-app-5f6g7h8i9j

# ์ด์œ :
# - Deployment๊ฐ€ ๋‹ค์‹œ ๋ฎ์–ด์”€
# - ๋ณ€๊ฒฝ์‚ฌํ•ญ ์œ ์ง€ ์•ˆ ๋จ

# โœ… Deployment๋ฅผ ์ˆ˜์ •ํ•˜์„ธ์š”
kubectl edit deployment web-app

ReplicaSet ์ง์ ‘ ์‚ญ์ œ ์ฃผ์˜

1
2
3
4
5
6
7
8
9
# โŒ ํ™œ์„ฑ ReplicaSet ์‚ญ์ œ (Pod ์ „๋ถ€ ์‚ญ์ œ๋จ!)
kubectl delete rs web-app-5f6g7h8i9j

# Deployment๊ฐ€ ์ฆ‰์‹œ ์ƒˆ ReplicaSet ์ƒ์„ฑ
# โ†’ ๋ชจ๋“  Pod ์žฌ์ƒ์„ฑ โ†’ ์„œ๋น„์Šค ์ค‘๋‹จ!

# โœ… ๊ตฌ๋ฒ„์ „(0/3) ReplicaSet ์‚ญ์ œ๋Š” ๊ฐ€๋Šฅ
kubectl delete rs web-app-7d4b5c8f9d
# โ†’ ๋กค๋ฐฑ ๋ถˆ๊ฐ€๋Šฅํ•ด์ง

์ˆ˜๋™์œผ๋กœ ์ƒ์„ฑํ•œ Pod ๋ฌธ์ œ

1
2
3
4
5
# ReplicaSet๊ณผ ๋™์ผํ•œ Label์„ ๊ฐ€์ง„ Pod ์ˆ˜๋™ ์ƒ์„ฑ
kubectl run manual-pod --image=nginx --labels=app=web-app

# ReplicaSet์ด ๊ฐ์ง€ โ†’ ์ฆ‰์‹œ ์‚ญ์ œ!
# ์ด์œ : replicas=3์ธ๋ฐ Pod๊ฐ€ 4๊ฐœ โ†’ 1๊ฐœ ์‚ญ์ œ

๐Ÿ“ ์š”์•ฝ

ํ•ต์‹ฌ ๊ฐœ๋…

1
2
3
4
5
6
7
8
9
ReplicaSet:
- ์ง€์ •ํ•œ ์ˆ˜์˜ Pod ํ•ญ์ƒ ์œ ์ง€
- Pod ์žฅ์•  ์‹œ ์ž๋™ ์žฌ์ƒ์„ฑ
- Deployment๊ฐ€ ์ž๋™ ์ƒ์„ฑ/๊ด€๋ฆฌ

Deployment โ†’ ReplicaSet โ†’ Pod:
- Deployment: ๋ฐฐํฌ ๊ด€๋ฆฌ (๋กค๋ง ์—…๋ฐ์ดํŠธ, ๋กค๋ฐฑ)
- ReplicaSet: Pod ์ˆ˜ ๋ณด์žฅ
- Pod: ์‹ค์ œ ์ปจํ…Œ์ด๋„ˆ

์ƒˆ ReplicaSet ์ƒ์„ฑ ์กฐ๊ฑด

1
2
3
4
5
6
7
8
โœ… ์ƒ์„ฑ:
- template.spec ๋ณ€๊ฒฝ (์ด๋ฏธ์ง€, ํ™˜๊ฒฝ๋ณ€์ˆ˜, ๋ฆฌ์†Œ์Šค, Volume ๋“ฑ)
- rollout restart ์‹คํ–‰ ์‹œ

โŒ ๋ฏธ์ƒ์„ฑ:
- replicas ๋ณ€๊ฒฝ
- metadata.labels ๋ณ€๊ฒฝ
- rollout undo (๊ธฐ์กด RS์˜ replicas๋ฅผ 0 โ†’ n์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ๊ฒƒ)

๋กค๋ฐฑ ๋ฉ”์ปค๋‹ˆ์ฆ˜

1
2
3
4
5
6
7
8
๊ธฐ์กด ReplicaSet 0/3 ๋ณด์กด:
- ๋กค๋ฐฑ์„ ์œ„ํ•œ ์ด๋ ฅ ๊ด€๋ฆฌ
- revisionHistoryLimit: 10 (๊ธฐ๋ณธ๊ฐ’)
- ์˜ค๋ž˜๋œ ๊ฒƒ๋ถ€ํ„ฐ ์ž๋™ ์‚ญ์ œ

๋กค๋ฐฑ ๋ช…๋ น์–ด:
kubectl rollout undo deployment <name>
kubectl rollout undo deployment <name> --to-revision=2

๊ถŒ์žฅ ์‚ฌํ•ญ

1
2
3
4
5
6
7
8
9
โœ… DO:
- Deployment ์‚ฌ์šฉ
- Deployment๋กœ ์ˆ˜์ •
- ๊ตฌ๋ฒ„์ „ RS๋Š” ์ž๋™ ๊ด€๋ฆฌ์— ๋งก๊น€

โŒ DON'T:
- ReplicaSet ์ง์ ‘ ์ƒ์„ฑ
- ReplicaSet ์ง์ ‘ ์ˆ˜์ •
- ํ™œ์„ฑ ReplicaSet ์‚ญ์ œ

๐Ÿ”— ๊ด€๋ จ ๋ฌธ์„œ

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.