[K8s] 레플리카셋(ReplicaSet) 구성·생성·편집·삭제하기
지난 포스트
레플리카셋(ReplicaSet)이란
파드는 컨테이너로 이루어진 그룹입니다. 클러스터 위에 동일한 여러 개의 파드를 실행해 트래픽을 분산하고, 혹시 모를 파드 실행 오류 상황에도 실행되고 있는 다른 복제 파드 덕분에 서비스가 중지되지 않는 등 위험을 분산할 수 있습니다. 하나의 파드 구성 YAML 파일을 이용해 사용자가 직접 동일한 복제 파드들을 컨트롤 할 수도 있겠지만, 쿠버네티스에는 이를 자동화하는 기능을 이미 갖추고 있습니다.
레플리카셋(ReplicaSet)은 파드(Pod) 집합의 실행을 안정적으로 유지하는데 목적을 갖춘 쿠버네티스 워크로드입니다. 레플리카셋은 사용자가 지정한 개수만큼 복제 파드를 생성해주고 복제 컨트롤러를 이용해 해당 개수의 복제 파드가 정상 실행 중인지 항상 감시합니다. 파드 하나에 문제가 생겨 다운되면 이를 감지해 새 파드를 바로 생성해줍니다.
YAML 구성하기
레플리카셋도 파드와 마찬가지로 YAML 구성 파일을 이용해 관리할 수 있습니다. 레플리카셋의 YAML 구성 예시는 아래와 같습니다.
# nginx-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: k8s-example-app
tier: frontend
spec:
replicas: 3
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx:latest
apiVersion
: 쿠버네티스의 common API인apps/v1
을 지정합니다.kind
: 오브젝트 종류를 명시하는 항목으로ReplicaSet
으로 지정합니다. 대소문자 표기에 주의합니다.metadata
: 레플리카셋의 정보를 입력하는 항목입니다.metadata.name
: 레플리카셋 조회 명령 입력시 보이는 이름입니다.metadata.labels
: 다른 워크로드가 이 레플리카셋을 참조할 때 selector로 특정하기 위한 라벨입니다.spec.replica
: 복제 파드의 개수를 지정합니다.spec.selector
: 레플리카셋이 복제할 파드를 참조하기 위한 selector입니다.spec.template
: 레플리카셋이 복제할 파드의 정보를 입력하는 필드입니다.
# Pod 구성 파일
apiVersion: v1
kind: Pod
### 여기서 부터 ##
metadata:
name: original-pod
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx:latest
## 여기까지 레플리카셋의 spec.template의 하위 필드로 들어간다고 볼 수 있습니다. ##
metadata.labels
와 spec.selector.matchLables
, spec.template.metadata.labels
의 차이가 헷갈릴 수 있습니다. metadata.labels
는 레플리카셋에 붙는 라벨로 다른 워크로드가 이 레플리카셋을 참조할 때 사용할 수 있습니다.
반면에 spec.selector.matchLables
는 레플리카셋이 직접 파드를 참조하기 위해 지정한 파드의 라벨입니다. 여기에서 레플리카셋의 특징이 나오는데, 이미 파드가 생성된 경우에도 spec.selector
에 일치한 파드는 레플리카셋의 구성원으로 편입될 수 있다는 것입니다. 이 경우 레플리카셋이 파드의 통제권을 갖게 되므로 파드 상태에 따라 삭제되거나 교체될 수 있습니다.
spec.template.metadata.labels
는 복제될 파드에 붙는 라벨로 레플리카셋이 selector를 이용해 spec.template
의 파드를 특정할 수 있습니다. 따라서 spec.selector.matchLables
에 지정된 라벨 정보와 spec.template.metadata.labels
의 라벨 정보가 일치해야 합니다.
레플리카셋 생성하기
레플리카셋은 파드와 달리 kubectl 명령어 도구의 옵션으로 직접 생성할 수 없습니다. 따라서 위에서 알아본 YAML 구성 파일을 이용해 생성합니다. 생성 방식의 명령적 접근법과 선언적 접근법의 차이는 지난 포스트에서 다뤘으므로 생략합니다.
# YAML 구성 파일을 이용한 레플리카셋 생성
# 명령적 접근법
kubectl create -f nginx-rs.yaml
# 선언적 접근법
kubectl apply -f nginx-rs.yaml
생성된 레플리카셋은 kubectl get
명령어로 확인할 수 있고 kubectl describe
명령어로 상세 정보를 확인할 수 있습니다.
# 클러스터에 실행중인 레플리카셋 보기
kubectl get replicasets
kubectl get rs # 축약형
# 레플리카셋 상세 정보 조회하기
kubectl describe rs {레플리카셋 이름}
# Example
kubectl describe rs frontend
# YAML 형식으로 조회하기
kubectl get rs {레플리카셋 이름} -o=yaml
# Example
kubectl get rs frontend -o=yaml
레플리카셋은 구성 파일의 spec.replicas
에 지정한 개수만큼 파드가 실행되는 것을 안정적으로 유지하기 위해 노력합니다. 레플리카셋의 복제 파드 중 하나를 임의로 제거하면 레플리카셋 컨트롤러는 이를 감지해 바로 파드를 생성해 복제 파드의 개수를 맞춥니다.
이는 레플리카셋이 생성되면서 파드 집합에 편입된 기존 파드에도 예외 없는데, 편입된 기존 파드를 삭제해도 레플리카셋은 그저 복제 파드의 개수를 유지시키기 위해 곧바로 spec.template
에 지정한 새로운 복제 파드를 생성합니다.
파드 개수 변경하기
레플리카셋의 장점이 복제 파드를 유연하게 생성, 제거 할 수 있다는 것인 만큼 실행중인 레플리카셋의 복제 파드 개수를 사용자가 직접 변경할 수 있습니다. 복제 파드의 개수를 변경하는 방법은 kubectl scale
명령어 또는 kubectl edit
명령어를 이용한 명령적 접근법과 kubectl apply
를 이용한 선언적 접근법이 있습니다.
kubectl scale
방법은 명령줄 위에서 복제 파드의 개수를 변경할 수 있습니다. --replicas
옵션을 이용해 지정한 복제 파드 개수만큼 레플리카셋이 자동으로 파드를 생성하거나 제거합니다.
# 레플리카셋의 복제 파드 개수를 N개로 변경
kubectl scale rs {레플리카셋 이름} --replicas=N
# Example
kubectl scale rs frontend --replicas=4
kubectl edit
방법은 실행 중인 레플리카셋의 YAML 구성에 직접 진입해 구성 요소를 편집하는 방법입니다. 명령어 입력하면 vi 편집기에 진입하고 익숙한 YAML 형식을 볼 수 있습니다. 이 중 spec.replicas
필드의 수치를 변경하면 레플리카셋의 복제 파드 개수가 변경됩니다.
vi 편집기의 편집 모드는
i
로 진입하고, 편집을 마치면esc
버튼으로 편집 모드를 빠져나간 후:wq
명령어로 저장하고 편집기에서 나옵니다.
# 레플리카셋의 YAML 구성 편집하기
kubectl edit rs {레플리카셋 이름}
# Example
kubectl edit rs frontend
kubectl apply
방법은 로컬에 저장된 .yaml
파일을 변경하고 변경 사항을 적용하는 선언적 접근법입니다. 기존에 레플리카셋을 생성하기 위해 사용했던 YAML 파일의 spec.replicas
필드 수치를 변경하고 이를 적용하기 위해 다음의 명령어를 입력합니다.
# nginx-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: frontend
labels:
app: k8s-example-app
tier: frontend
spec:
replicas: 4 # 여기를 변경합니다
selector:
matchLabels:
tier: frontend
template:
metadata:
labels:
tier: frontend
spec:
containers:
- name: nginx
image: nginx:latest
# 수정한 YAML 파일 적용하기
kubectl apply -f {레플리카셋 YAML 파일.yaml}
#Example
kubectl apply -f nginx-rs.yaml
레플리카셋 삭제하기
실행 중인 레플리카셋을 중지하고 삭제하기 위해서는 파드를 삭제할 때와 마찬가지로 kubectl delete
명령어를 이용합니다.
# 레플리카셋 삭제하기
kubectl delete rs {레플리카셋 이름}
# Example
kubectl delete rs frontend
참고자료
- “레플리카셋”. Kubernetes documents. https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/.
- “kubectl scale”. Kubernetes Reference Documentation. https://jamesdefabia.github.io/docs/user-guide/kubectl/kubectl_scale/.
- jee-9. “Kubernetes Replica Set(레플리카셋)에 대하여…”. Velog: Fly me to the 🌙. 2022년 2월 4일. https://velog.io/@jee-9/Kubernetes-Replica-Set레플리카셋에-대하여.
- Nirsa. “[Kubernetes] 쿠버네티스 레플리카셋(replicaset) 개념 (파드 개수 유지, 파드 독립, 레플리카셋만 삭제)”. Tistory. 2020년 2월 17일. https://nirsa.tistory.com/136.