[k8s] RelicaSet(레플리카셋) 정리
ReplicaSet
레플리카셋은 클러스터 안에서 움직이는 파드의 수를 유지하는 장치입니다. 클러스터의 파드의 실행을 항상 안정적으로 유지하는 것을 목표로 명시된 파드 개수에 대한 가용성을 보증하는데 사용됩니다. 만약 애플리케이션 오류나 노드 장애 등으로 파드가 정지된 경우 레플리카셋이 자동으로 새로운 파드를 시작합니다.
레플리카셋은 labelSelector의 조건에 따라 파드를 검색하여 가동 중인 파드의 수가 매니페스트 파일의 replicas의 수와 일치하는지 아닌지를 확인합니다. 만약 가동중인 파드의 수가 부족한 경우 새로 파드를 추가하고, 파드의 수가 많을 때는 여분의 파드를 정지시킵니다. 따라서 가동 중인 애플리케이션의 파드 수를 변경하고 싶을 때는 레플리카셋의 replicas의 값을 수정하기만 하면 됩니다.
ReplicaSet 구성 예시
# replicaset-nginx.yaml
# [1] 기본 항목
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: nginx-replicaset
# [2] ReplicaSet 스펙
spec:
replicas: 3 # Pod의 수
selector: # Pod 템플릿의 검색 조건
matchLabels:
app: nginx-replicaset
# [3] Pod 템플릿
template:
metadata:
labels:
app: nginx-replicaset
env: prod
# [4] Pod 스펙
spec:
containers:
- image: nginx
name: nginx-replicaset
ports:
- containerPort: 80
▪︎ [1] 기본항목
먼저 API 버전이나 리플리카셋의 이름 등 기본 항목을 설정합니다.
필드 | 데이터형 | 설명 | 예시 |
apiVersion | 문자열 | API 버전, 존재하지 않는 값을 설정하면 오류가 발생 | apps/v1 |
kind | 문자열 | 쿠버네티스 리소스의 종류 | ReplicaSet |
metadata | Object | 레플리카셋의 이름이나 Label과 같은 메타데이터 | name: photoview-rs |
spec | PodSpec | 레플리카셋의 상세 정보를 설정 | - |
▪︎ [2] 레플리카셋 spec
[spec] 필드에는 레플리카셋의 상세 정보를 설정합니다. 클러스터 안에서 작동시키고 싶은 파드의 수를 replicas로 설정합니다. 그리고 실제로 클러스터 안에서 파드의 수가 부족할 때에 어떤 파드를 새로 시작시킬지 그 템플릿을 정합니다.
필드 | 데이터형 | 설명 |
replicas | 정수 | 클러스터 안에서 가동시킬 파드의 수, 기본값은 1 |
selector | LabelSelector | 어떤 파드를 가동시킬지에 대한 셀렉터, 파드의 Template에 설정된 라벨과 일치해야 한다. |
template | PodTemplateSpec | 실제로 클러스터 안에서 움직이는 파드의 수가 replicas에 설정된 파드의 수를 만족시키지 않을 때 새로 작성되는 파드의 템플릿 |
▪︎ [3] Pod 템플릿
[template] 필드에는 레플리카셋이 어떤 파드를 실행할지에 관한 정보를 설정합니다. 따라서 template 필드 하위에 다시 spec, metadata를 설정하는 필드가 존재합니다. 앞에서도 얘기했지만 [2]의 Selector에서 지정한 조건과 맞는 것을 만들 필요가 있습니다.
필드 | 데이터형 | 설명 |
metadata | Object | 템플릿의 이름이나 Label과 같은 데이터 |
spec | PodSpec | 파드의 상세 정보를 설정 |
▪︎ [4] Pod spec
spec.template 하위의 [spec] 필드에는 Pod의 상세 정보를 설정합니다. 특히 .spec.template.spec.containers[] 필드의 하위에 .name, .image, .ports[], .containerPort 필드를 이용해 컨테이너의 구체적인 명세를 설정합니다.
위의 예시에서는 컨테이너의 이름을 nginx-replicaset, 사용할 컨테이너 이미지는 nginx, 해당 컨테이너의 포트 번호는 80번으로 설정했습니다.
ReplicaSet 사용해보기
레플리카셋 생성
위의 코드를 replicaset-nginx.yaml로 저장하고 다음과 같이 명령어를 입력합니다. 정상적으로 생성이되면 kubectl get pods 명령어를 이용하여 현재 파드 정보를 확인합니다.
kubectl apply -f replicaset-nginx.yaml
kubectl get pods
.spec.replicas를 3으로 설정했으므로 nginx-replicaset-kk8jg, nginx-replicaset-n4f87, nginx-replicaset-pxx84라는 파드가 실행된 것을 알 수 있습니다. 파드의 이름은 레플리카셋의 이름에 임의의 문자를 붙인 형태로 생성됩니다.
이 상태에서 파드 1개를 임의로 삭제해보겠습니다. 그리고 다시 kubectl get pods 명령을 실행합니다.
kubectl delete pod [파드명]
nginx-replicaset-kk8jg 파드를 삭제하여 파드가 2개가 되어서 레플리카셋이 파드 개수를 3개로 유지하려고 nginx-replicaset-knltt라는 파드 1개를 추가로 실행하는 것을 확인할 수 있습니다.
파드 개수를 조정하려면 replicaset-nginx.yaml 안 .spec.replicas 필드 값을 원하는 숫자로 수정한 후 다시 kubectl apply 명령어를 실행하면 됩니다.
레플리카셋 정보 확인
다음 명령어를 이용하면 레플리카셋과 파드의 정보를 한꺼번에 확인할 수도 있습니다.
kubectl get replicaset,pods
레플리카셋의 상태 항목 중 DESIRED와 CURRENT의 의미는 다음과 같습니다.
- DESIRED : 레플리카셋 설정에 지정한 파드 개수
- CURRENT : 레플리카셋을 이용해 현재 클러스터에서 동작하는 실제 파드 개수
레플리카셋 삭제
레플리카셋을 삭제할 때는 다음과 같이 명령어를 입력합니다. 파드와 레플리카셋은 결합되어 있기 때문에 레플리카셋을 삭제할 경우 파드도 함께 삭제됩니다.
kubectl delete replicaset [레플리카셋 name]
이 때 --cascade=false 옵션을 사용하면 레플리카셋이 관리하는 파드에 영향을 끼치지 않고 레플리카셋만 삭제할 수 있습니다.
ReplicaSet 더 알아보기
ReplicationController란?
ReplicationController는 레플리카셋과 매우 비슷한 기능을 갖고 있는 리소스입니다. 오래된 버전의 쿠버네티스에서 사용했지만 지금은 보다 유연하게 셀렉터를 지정할 수 있는 레플리카셋을 보통 사용합니다.
ReplicaSet의 한계
레플리카셋은 지정한 수의 파드가 항상 실행되고 있다는 것을 보증하는 장치이지만 버전 관리를 하는 장치는 가지고 있지 않습니다. 실제로 프로젝트에서 이용할 때는 레플리카셋의 상위 레벨의 개념으로 만들어진 디플로이먼트(Deployment)를 이용하는 것이 좋습니다. 디플로이먼트를 사용하면 롤링 업데이트를 할 수 있습니다.
ReplicaSet의 동작
클러스터 안에서 파드를 정한 수 만큼 실행시켜 두려면 클러스터의 상태를 항상 감시하여 제어하는 장치가 필요할 것입니다. 이 역할을 컨트롤러라고 부릅니다. 컨트롤러의 기본적인 움직임은 다음과 같습니다.
- 클러스터(X)의 현재 상태를 확인
- 클러스터(Y)가 본래 되어 있어야 할 상태를 확인
- X == Y
- true : 아무 것도 하지 않는다.
- false : 컨테이너를 시작/재시작 또는 중지
쿠버네티스는 이 처리를 반복함으로써 클러스터의 상태를 확인하고 원래의 모습, 즉 매니페스트에 정의된 상태로 되어 있는 지를 감시하고 본연의 모습이 되도록 자동으로 복구합니다.
또한 실제로 파드를 작성 및 삭제하는 것은 노드 상의 kubelet이 컨테이너 런타임(Docker)에게 지시를 내려 수행합니다.
Kubernetes의 ReplicaSet에 대하여 알아보았습니다.
참고