본문 바로가기
kubernetes

[kubernetes] 쿠버네티스(kubernetes) 레플리카셋(replicaset)이란

by devjh 2021. 6. 21.
반응형

1. 레플리카셋이란?

쿠버네티스에서 가장 유명한 특징중 하나는 "pod이 죽었을때 다시 복구해준다" 입니다.

 

replica로 시작하는 녀석들 덕분입니다

 

pod을 복구해주는 resource는 대표적으로 레플리케이션 컨트롤러(replication-controller)와 레플리카셋(replicaset)이 있습니다.

 

해당 resource를 감시하는 컨트롤러가 pod에 변화가 생겼는지를 감지하고, pod이 죽었을때 다시 복구해줍니다.

 

deployment때문에 단독으로 replicaset을 사용하는일은 거의 없지만 매우 중요한 resource이니 정리해보겠습니다.

 

2.  레플리케이션 컨트롤러(replication-controller) vs 레플리카셋(replicaset)

레플리케이션 컨트롤러는 레플리카셋의 하위호환입니다.

낮은 쿠버네티스 버전에서 레플리케이션 컨트롤러를 사용했다지만 현재는 사용할 이유가 없어졌습니다.

 

차이점으로는 레플리케이션 컨트롤러는 관리할 pod를 selector를 직접 사용해서 선택하고, 레플리카셋은 matchlabels를 사용하여 관리합니다.

 

이름만 들어도 selector보다는 matchlabel이 뭔가 더 풍부한 느낌입니다. 

 

matchlabel이 생기면서 여러개의 pod를 취급할 수 있어졌으며 라벨의 key만 갖고있어도, 일치하지 않는 라벨까지도 관리할 수 있게되었습니다.

 

3. replicaset의 구성

레플리카셋을 만들때는 세가지가 필요합니다.

 

(1) 내가 관리할 pod을 선택하기위한 matchlabels

(2) 내가 관리할 pod의 복제본 수

(3) 내가 관리할 pod의 명세

 

yaml파일에서 세가지를 확인해보며 replicaset을 생성해보겠습니다.

 

4. replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myrs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: myHelloWorld
  template:
    metadata:
      labels:
        app: myHelloWorld
    spec:
      containers:
      - name: myapp
        image: jaeho310/helloworld:1

항상 그래왔듯이 kubernetes의 yaml파일은 크게 apiVersion, kind, metadata, spec으로 구성되어있습니다.

 

(3)번(내가 관리할 pod의 명세) 부터 찾아보면 spec.template 에 있습니다.

spec.templete은 apiversion과 kind만 없어진 pod입니다, 

단 metadata의 labels의 key, value는 정확히 하고 가야합니다.(app: myHelloworld는 그냥 key와 value입니다)

 

(2)번(내가 관리할 pod의 복제본 수)

spec.replicas: 3 입니다.

복제본(pod)은 3개 만든다는 얘기입니다.

 

(1)번(내가 관리할 pod을 선택하기위한 matchlabels)은

selector.matchlabels입니다. pod에서 만들어줬던 label과 동일하게 만들어줘서 이 pod을 관리할꺼라고 명시해줍니다.

 

나머지는 크게 중요하지 않습니다.

kind는 내가 replicaset을 쓰니까 replicaset이고 metadata에는 이름, 라벨, 네임스페이스 등이 들어가는데 현재는 name만 적었습니다.

apiVersion정도만 정리하면 replicaset의 apiversion은 apps/v1 입니다. replication-controller는 v1(core/v1)입니다.

레플리카셋이 추가로 나오면서 apiversion이 변경된거일뿐 큰 의미는 없습니다.

 

5. 확인하기

(1) apply 명령어를 사용하여 yaml을 적용합니다.

$ kubectl apply -f myreplicaset.yaml
replicaset.apps/myrs created

(2) 조회해서 pod 확인하기

$ kubectl get all
NAME             READY   STATUS    RESTARTS   AGE
pod/myrs-rftgd   1/1     Running   0          21s
pod/myrs-sdcws   1/1     Running   0          21s
pod/myrs-ww7cb   1/1     Running   0          21s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8d

NAME                   DESIRED   CURRENT   READY   AGE
replicaset.apps/myrs   3         3         3       22s

replicaset 한개와 pod가 세개 생겼습니다.

pod의 이름은 replicaset의 이름뒤에 -hash로 이어 붙습니다.

 

(3) pod을 지우고 조회하기

$ kubectl delete pod myrs-rftgd
pod "myrs-rftgd" deleted

$ kubectl get all
NAME             READY   STATUS    RESTARTS   AGE
pod/myrs-cwjbb   1/1     Running   0          20s
pod/myrs-sdcws   1/1     Running   0          2m57s
pod/myrs-ww7cb   1/1     Running   0          2m57s

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8d

NAME                   DESIRED   CURRENT   READY   AGE
replicaset.apps/myrs   3         3         3       2m57s

 지워졌다는 로그는 나왔지만 hash값이 변한 하나의 pod이 새로 생겨서 pod의 숫자는 그대로 3개입니다.

 

(4) replicaset의 동작 확인하기

$ kubectl get event
# or
$ kubectl describe replicaset myrs

둘중 하나의 명령어로 확인합니다.

Events:
  Type    Reason            Age    From                   Message
  ----    ------            ----   ----                   -------
  Normal  SuccessfulCreate  4m58s  replicaset-controller  Created pod: myrs-rftgd
  Normal  SuccessfulCreate  4m58s  replicaset-controller  Created pod: myrs-ww7cb
  Normal  SuccessfulCreate  4m58s  replicaset-controller  Created pod: myrs-sdcws
  Normal  SuccessfulCreate  2m21s  replicaset-controller  Created pod: myrs-cwjbb

pod을 지우자마자 replicaset-controller(replicaset을 관찰하는 녀석)가 pod을 다시 만들어준걸 확인할 수 있습니다.

 

(5) replicaset 지우기

# replicaset은 rs로 줄여서 씁니다.
$ kubectl delete rs myrs
replicaset.apps "myrs" deleted

$ kubectl get all
NAME             READY   STATUS        RESTARTS   AGE
pod/myrs-cwjbb   0/1     Terminating   0          18m
pod/myrs-sdcws   1/1     Terminating   0          20m
pod/myrs-ww7cb   0/1     Terminating   0          20m

NAME                 TYPE        CLUSTER-IP   EXTERNAL-IP   PORT(S)   AGE
service/kubernetes   ClusterIP   10.96.0.1    <none>        443/TCP   8d

replicaset을 지우면 pod도 같이 사라지는걸 확인할 수 있습니다.


 

이제 pod을 단독으로 쓸 일은 없어졌습니다. 

pod을 자동으로 생성, 복구해주는 replicaset을 사용하면 됩니다.

 

사실 앞에서도 언급했지만 replicaset도 단독으로 잘 쓰지 않습니다.(pod은 나중에 네트워크나 컨테이너 테스트할 때 자주 쓰지만 replicaset은 거의 안씁니다 ㅋㅋㅋㅋ)

deployment라는 더 좋은 resource가 있습니다.

 

다음게시글에서는 deployment를 정리해보겠습니다.

반응형

댓글