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를 정리해보겠습니다.
'kubernetes' 카테고리의 다른 글
[kubernetes] 쿠버네티스(kubernetes) service(clusterip)란 (0) | 2021.06.22 |
---|---|
[kubernetes] 쿠버네티스(kubernetes) 디플로이먼트(deployment)란 (0) | 2021.06.21 |
[kubernetes] 쿠버네티스(kubernetes) 팟(pod)이란? (0) | 2021.06.13 |
[kubernetes] 쿠버네티스 시작하기(minikube를 사용한 클러스터 구축) (0) | 2021.06.13 |
[kubernetes] 쿠버네티스(kubernetes) 아키텍쳐 및 동작원리 (0) | 2021.06.09 |
댓글