07. ReplicaSet

2021. 4. 5. 12:55ใ†๐ŸŽฏ OpenSource/K8S

Replication Controller์™€ ReplicaSet ๋ชจ๋‘ ์‹คํ–‰ ์ค‘์ธ pod ๋ชฉ๋ก์„ ์ง€์†์ ์œผ๋กœ ๋ชจ๋‹ˆํ„ฐ๋งํ•˜์—ฌ ๊ด€๋ฆฌํ•˜๋Š” pod ๋“ค์˜ ์‹ค์ œ ์ˆ˜๊ฐ€ ์˜๋„ํ•˜๋Š” ์ˆ˜์™€ ๋™์ผํ•˜๋„๋ก ๋ณด์žฅํ•˜๋Š” ์ฟ ๋ฒ„๋„คํ‹ฐ์Šค์˜ ๋ฆฌ์†Œ์Šค์ด๋‹ค.

ํ•˜์ง€๋งŒ Replication Controller๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ์ถ”์„ธ์ด๋ฉฐ, ์œ ์‚ฌํ•œ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜์ง€๋งŒ ์ข€๋” ๋‚˜์€ ReplicaSet์„ ๊ฑฐ์˜ ์‚ฌ์šฉํ•œ๋‹ค.

 

 

4.3.1 Replication Controller์™€ ReplicaSet ๋น„๊ต

๋‘ ๋ฆฌ์†Œ์Šค๋Š” ๋™์ผํ•˜๊ฒŒ ๋„์ž‘ํ•˜์ง€๋งŒ ReplicaSet์„ ์ด์š”ํ•˜๋ฉด ์ข€ ๋” ์ •๊ตํ•œ pod selector๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

Replication Controller : ํŠน์ • ๋ ˆ์ด๋ธ”์ด ์žˆ๋Š” pod๋งŒ ํ•„ํ„ฐ๋ง

ReplicaSet : ํŠน์ • ๋ ˆ์ด๋ธ”์ด ์—†๊ฑฐ๋‚˜ ๋ ˆ์ด๋ธ”์˜ ๊ฐ’๊ณผ ์ƒ๊ด€์—†์ด ํŠน์ • ๋ ˆ์ด๋ธ”์˜ key๋ฅผ ๊ฐ–๋Š” pod ํ•„ํ„ฐ๋ง ๊ฐ€๋Šฅ

 

ReplicationController๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ReplicaSet์— ์ข€ ๋” ์ง‘์ค‘ํ•ด์„œ ์•Œ์•„๋ณด๊ธฐ๋กœ ํ•œ๋‹ค.

 

4.3.2 ReplicaSet ๋™์ž‘ ์›๋ฆฌ

  • ๊ธฐ์กด pod๊ฐ€ ์‚ฌ๋ผ์ง€๋ฉด ์ƒˆ pod๋ฅผ ์‹œ์ž‘ํ•ด ์˜๋„ํ•˜๋Š” ์ˆ˜์˜ pod๋ฅผ ์œ ์ง€ํ•œ๋‹ค.
  • ํด๋Ÿฌ์Šคํ„ฐ ๋…ธ๋“œ์— ์žฅ์• ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ReplicaSet์œผ๋กœ ๊ด€๋ฆฌํ•˜๋Š” pod๋“ค์— ๋Œ€ํ•œ ๋ณต์ œ๋ณธ ์ƒ์„ฑ
  • ์ˆ˜๋™, ์ž๋™์œผ๋กœ pod ์ˆ˜ํ‰ ํ™•์žฅ์ด ๊ฐ„ํŽธํ•ด์ง

 

4.3.2 ReplicaSet ์ƒ์„ฑํ•˜๊ธฐ

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    matchLabels:
      app: kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
  • match Selector : replicaset์œผ๋กœ ๊ด€๋ฆฌํ•  pod๋ฅผ ์ง€์ •ํ•œ๋‹ค. ์—ฌ๊ธฐ์— ๋ช…์‹œ๋œ label ์„ ๊ฐ€์ง„ pod๋ฅผ ๋Œ€์ƒ์œผ๋กœ ์—ฌ๊ธฐ๊ฒŒ ๋œ๋‹ค.
  • replicas : ์‹คํ–‰ํ•  ํŒŒ๋“œ์˜ ์˜๋„ํ•˜๋Š”(desired) ์ˆ˜๋ฅผ ์ง€์ •ํ•œ๋‹ค.
  • pod template : ์ƒˆ๋กœ์šด pod replica๋ฅผ ์ƒ์„ฑํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค. ๋Œ€์ƒ์ด ๋˜๋Š” pod์— ๋Œ€ํ•œ ๋ช…์„ธ์ด๋‹ค

   ๐Ÿ”น MatchExpressions ์‚ฌ์šฉํ•˜์—ฌ ์…€๋ ‰ํ„ฐ์— ํ‘œํ˜„์‹ ์‚ฌ์šฉํ•˜๊ธฐ

apiVersion: apps/v1beta2
kind: ReplicaSet
metadata:
  name: kubia
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
         - kubia
  template:
    metadata:
      labels:
        app: kubia
    spec:
      containers:
      - name: kubia
        image: luksa/kubia
  • In : ๋ ˆ์ด๋ธ” ๊ฐ’์ด ์ง€์ •๋œ ๊ฐ’ ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜
  • NotIn : ๋ ˆ์ด๋ธ” ๊ฐ’์ด ์ง€์ •๋œ ๊ฐ’๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š์Œ
  • Exists : ์ง€์ •๋œ key๋ฅผ ๊ฐ€์ง„ label์„ ํฌํ•จํ•˜๋Š” pod
  • DoesNotExist: Pod์— ์ง€์ •๋œ key๋ฅผ ๊ฐ€์ง„ label์ด ํฌํ•จ๋˜์ง€ ์•Š์•„์•ผ ํ•จ

 

4.3.3 ReplicaSet ์ƒ์„ฑ ๋ฐ ํ™•์ธ

root@master001:~/k8s_in_action/kubernetes-in-action/Chapter04# kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
kubia   3         3         3       9s


root@master001:~/k8s_in_action/kubernetes-in-action/Chapter04# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
kubia-8qdbg   1/1     Running   0          77s
kubia-qd5nf   1/1     Running   0          77s
kubia-sqlbh   1/1     Running   0          77s

replica 3์œผ๋กœ ์„ค์ •ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— kubia๋ผ๋Š” pod์— ๋Œ€ํ•ด ๋ณต์ œ๋ณธ 3๊ฐœ๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค.

์ด์ œ ๊ณ ์˜๋กœ ํ•˜๋‚˜์˜ pod๋ฅผ ์‚ญ์ œํ•œ๋‹ค.

์‚ญ์ œ๋œ pod๊ฐ€ terminating ์ƒํƒœ์— ๋„์ž…๋จ๊ณผ ๋™์‹œ์— ์ƒˆ๋กœ์šด pod๊ฐ€ ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•œ๋‹ค.

root@master001:~# kubectl delete pod kubia-8qdbg
pod "kubia-8qdbg" deleted

root@master001:~# kubectl get pods
NAME          READY   STATUS        RESTARTS   AGE
kubia-8qdbg   1/1     Terminating   0          41m
kubia-qd5nf   1/1     Running       0          41m
kubia-sqlbh   1/1     Running       0          41m
kubia-tlxg6   1/1     Running       0          20s

root@master001:~# kubectl get pods
NAME          READY   STATUS    RESTARTS   AGE
kubia-qd5nf   1/1     Running   0          43m
kubia-sqlbh   1/1     Running   0          43m
kubia-tlxg6   1/1     Running   0          2m1s

 

 

4.3.4 ReplicaSet์˜ ์„ธ๋ถ€ ์ •๋ณด ํ™•์ธํ•˜๊ธฐ

root@master001:~# kubectl describe rs kubia
Name:         kubia
Namespace:    default
Selector:     app=kubia
Labels:       <none>
Annotations:  <none>
Replicas:     3 current / 3 desired
Pods Status:  3 Running / 0 Waiting / 0 Succeeded / 0 Failed
Pod Template:
  Labels:  app=kubia
  Containers:
   kubia:
    Image:        luksa/kubia
    Port:         <none>
    Host Port:    <none>
    Environment:  <none>
    Mounts:       <none>
  Volumes:        <none>
Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  46m    replicaset-controller  Created pod: kubia-qd5nf
  Normal  SuccessfulCreate  46m    replicaset-controller  Created pod: kubia-8qdbg
  Normal  SuccessfulCreate  46m    replicaset-controller  Created pod: kubia-sqlbh
  Normal  SuccessfulCreate  4m50s  replicaset-controller  Created pod: kubia-tlxg6
  • Replicas/current : ํ˜„์žฌ ๋™์ž‘ํ•˜๋Š” pod ์ˆ˜
  • Replicas/desired : ์œ ์ง€ํ•˜๊ณ ์ž ํ•˜๋Š” pod ์ˆ˜
  • Pods Status : Pod์˜ ์ƒํƒœ๋ณ„ ์ธ์Šคํ„ด์Šค ์ˆ˜
  • Events : ReplicaSet๊ณผ ๊ด€๋ จ๋œ ์ด๋ฒคํŠธ

 

4.3.5 ์ˆ˜ํ‰ pod ์Šค์ผ€์ผ๋ง

kubectl ๋ช…๋ น์–ด๋กœ scale up/down

root@master001:~# kubectl scale rs kubia --replicas=10
replicaset.apps/kubia scaled

kubectl edit์œผ๋กœ ์˜ค๋ธŒ์ ํŠธ ์ •์˜ ์ˆ˜์ •

root@master001:~# kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
kubia   10        10        10      98m

root@master001:~# kubectl edit rs kubia
spec:
  replicas: 2
  selector:
    matchLabels:
      app: kubia
      ..
replicaset.apps/kubia edited

root@master001:~# kubectl get rs
NAME    DESIRED   CURRENT   READY   AGE
kubia   2         2         2       99m

 

 

4.3.6 pod ์œ ์ง€ํ•˜๋ฉฐ replicaset ์‚ญ์ œํ•˜๊ธฐ

kubectl delete ๋ช…๋ น์— ์˜ต์…˜์—†์ด ์‚ฌ์šฉํ•˜๋ฉด ReplicaSet๊ณผ ์—ฐ๊ด€ ๋˜์–ด ๊ด€๋ฆฌ๋˜๋Š” pod ๊นŒ์ง€ ๋ชจ๋‘ ์‚ญ์ œ๋œ๋‹ค.

์ด๋•Œ cacscade ์˜ต์…˜์œผ๋กœ pod ๋Š” ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋‹ค.

root@master001:~# kubectl delete rs kubia --cascade=false
warning: --cascade=false is deprecated (boolean value) and can be replaced with --cascade=orphan.
replicaset.apps "kubia" deleted

root@master001:~# kubectl get rs
No resources found in default namespace.

root@master001:~# kubectl get po
NAME          READY   STATUS    RESTARTS   AGE
kubia-qd5nf   1/1     Running   0          108m
kubia-sqlbh   1/1     Running   0          108m