[K8s] 레플리카셋(ReplicaSet) 구성·생성·편집·삭제하기

BeomHwan Roh
11 min readJun 19, 2023

--

지난 포스트

레플리카셋(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.labelsspec.selector.matchLables , spec.template.metadata.labels 의 차이가 헷갈릴 수 있습니다. metadata.labels는 레플리카셋에 붙는 라벨로 다른 워크로드가 이 레플리카셋을 참조할 때 사용할 수 있습니다.

반면에 spec.selector.matchLables 는 레플리카셋이 직접 파드를 참조하기 위해 지정한 파드의 라벨입니다. 여기에서 레플리카셋의 특징이 나오는데, 이미 파드가 생성된 경우에도 spec.selector에 일치한 파드는 레플리카셋의 구성원으로 편입될 수 있다는 것입니다. 이 경우 레플리카셋이 파드의 통제권을 갖게 되므로 파드 상태에 따라 삭제되거나 교체될 수 있습니다.

tier: frontend 라벨을 가진 original-pod 파드가 frontend 레플리카셋 생성시 편입된 모습.

spec.template.metadata.labels는 복제될 파드에 붙는 라벨로 레플리카셋이 selector를 이용해 spec.template의 파드를 특정할 수 있습니다. 따라서 spec.selector.matchLables 에 지정된 라벨 정보와 spec.template.metadata.labels 의 라벨 정보가 일치해야 합니다.

selector.matchLables의 라벨 정보와 template.metadata의 라벨 정보가 일치하지 않는 경우 레플리카셋 생성 오류를 출력한다.

레플리카셋 생성하기

레플리카셋은 파드와 달리 kubectl 명령어 도구의 옵션으로 직접 생성할 수 없습니다. 따라서 위에서 알아본 YAML 구성 파일을 이용해 생성합니다. 생성 방식의 명령적 접근법과 선언적 접근법의 차이는 지난 포스트에서 다뤘으므로 생략합니다.

# YAML 구성 파일을 이용한 레플리카셋 생성

# 명령적 접근법
kubectl create -f nginx-rs.yaml

# 선언적 접근법
kubectl apply -f nginx-rs.yaml
레플리카셋이 생성되면 자동으로 spec.template에서 지정한 복제 파드가 생성된다.

생성된 레플리카셋은 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에 지정한 개수만큼 파드가 실행되는 것을 안정적으로 유지하기 위해 노력합니다. 레플리카셋의 복제 파드 중 하나를 임의로 제거하면 레플리카셋 컨트롤러는 이를 감지해 바로 파드를 생성해 복제 파드의 개수를 맞춥니다.

frontend 레플리카셋의 복제 파드 중 frontend-mklbn 복제 파드를 제거했으나, 곧바로 frontend-m972v 복제 파드가 새로 생성된 모습.

이는 레플리카셋이 생성되면서 파드 집합에 편입된 기존 파드에도 예외 없는데, 편입된 기존 파드를 삭제해도 레플리카셋은 그저 복제 파드의 개수를 유지시키기 위해 곧바로 spec.template에 지정한 새로운 복제 파드를 생성합니다.

frontend 레플리카셋에 편입된 original-pod 파드를 삭제한 모습. frontend 레플리카셋은 곧바로 새 파드를 생성한다.

파드 개수 변경하기

레플리카셋의 장점이 복제 파드를 유연하게 생성, 제거 할 수 있다는 것인 만큼 실행중인 레플리카셋의 복제 파드 개수를 사용자가 직접 변경할 수 있습니다. 복제 파드의 개수를 변경하는 방법은 kubectl scale 명령어 또는 kubectl edit 명령어를 이용한 명령적 접근법과 kubectl apply를 이용한 선언적 접근법이 있습니다.

kubectl scale 방법은 명령줄 위에서 복제 파드의 개수를 변경할 수 있습니다. --replicas 옵션을 이용해 지정한 복제 파드 개수만큼 레플리카셋이 자동으로 파드를 생성하거나 제거합니다.

# 레플리카셋의 복제 파드 개수를 N개로 변경
kubectl scale rs {레플리카셋 이름} --replicas=N

# Example
kubectl scale rs frontend --replicas=4
kubectl scale 명령어를 이용해 frontend 레플리카셋의 복제 파드를 3개에서 4개로 변경한 모습.

kubectl edit 방법은 실행 중인 레플리카셋의 YAML 구성에 직접 진입해 구성 요소를 편집하는 방법입니다. 명령어 입력하면 vi 편집기에 진입하고 익숙한 YAML 형식을 볼 수 있습니다. 이 중 spec.replicas 필드의 수치를 변경하면 레플리카셋의 복제 파드 개수가 변경됩니다.

vi 편집기의 편집 모드는 i로 진입하고, 편집을 마치면 esc 버튼으로 편집 모드를 빠져나간 후 :wq 명령어로 저장하고 편집기에서 나옵니다.

# 레플리카셋의 YAML 구성 편집하기
kubectl edit rs {레플리카셋 이름}

# Example
kubectl edit rs frontend
kubectl edit rs frontend 명령어로 vi 편집 화면에 진입한 모습. spec.replicas 수치를 변경하면 레플리카셋의 복제 파드 개수가 변경된다.

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
nginx-rs.yaml 파일의 spec.replicas 수치를 4로 변경하고 kubectl apply 명령어로 이를 적용한 모습.

레플리카셋 삭제하기

실행 중인 레플리카셋을 중지하고 삭제하기 위해서는 파드를 삭제할 때와 마찬가지로 kubectl delete 명령어를 이용합니다.

# 레플리카셋 삭제하기
kubectl delete rs {레플리카셋 이름}

# Example
kubectl delete rs frontend
레플리카셋 삭제하기.

참고자료

--

--