-
레플리카셋(Replicaset) 이란?
레플리카셋은 실행되는 파드 개수에 대한 가용성을 보증 하며 지정한 파드 개수만큼 항상 실행될 수 있도록 관리 합니다. 즉 5개의 파드를 항상 실행 하도록 설정하면 이후 파드 1개가 삭제될 경우 다시 파드 1개가 실행되어 5개를 유지할 수 있도록 해줍니다.
-
레플리카셋이 정말 파드의 개수를 유지해주는지 확인
아래 코드를 입력 후 파일로 저장하여 레플리카셋을 사용해볼 수 있습니다. 이 코드들을 보면 레이블을 기준으로 식별하여 어떤 파드를 관리할지 선택 합니다.
저는 경로를 "/root/kubespray/inventory/test/replicaset"에 test-replicaset.yaml 로 저장 하였습니다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: test-replicaset
spec:
template:
metadata:
name: test-replicaset
labels:
app: test-replicaset
spec:
containers:
- name: test-replicaset
image: nginx
ports:
- containerPort: 80
replicas: 3
selector:
matchLabels:
app: test-replicaset
- apiVersion apps/v1 → 쿠버네티스의 apps/v1 API를 사용 합니다.
- kind: ReplicaSet → ReplicaSet의 작업으로 명시 합니다.
- metadata.name → Replicaset 이름을 설정 합니다.
- spec.template.metadata → 어떤 파드를 실행할지에 대한 정보를 하위에 설정 합니다.
- spec.template.metadata.name → 생성될 파드의 이름을 지정 합니다.
- spec.template.metadata.labels.app:test-replicaset → 식별하는 레이블이 앱 컨테이너이며 test-replicaset 으로 식별
- spec.spec → 이 하위의 옵션들은 컨테이너에 대한 설정을 합니다. 위 코드에선 컨테이너 명, 이미지, 포트를 지정 했습니다.
- replicas → 파드의 개수를 몇개 유지할 것 인지 설정 합니다. 기본값은 1 입니다.
- selector → 어떤 레이블의 파드를 선택하여 관리할지에 대한 설정 입니다. 앱 컨테이너의 test-replicaset 레이블을 식별하여 해당되는 파드들을 관리하며, 이 필드가 없을 경우 spec.template.metadata.labels.app 에 적은 내용들을 기본값으로 사용 합니다.
위 코드를 저장하고 kubectl apply -f [파일명] 을 입력하면 정상적으로 replicaset이 생성 됩니다. (apply는 yaml 파일을 실행하기 위한 명령어이고 -f 옵션은 파일명을 지정하기 위한 옵션 입니다.)
생성이 완료 되었으면 kubectl get replicaset,pods 를 입력하여 리플리카셋을 확인하고 코드에 적은 replicas 개수만큼 포드가 생성 되었는지 확인할 수 있습니다. 빨간색은 replicaset 필드, 파란색은 pods 필드 입니다.
replicaset 필드에 나오는 DESIRED는 단어 그대로 원하는 파드의 개수(replicas에 설정한 개수)를 나타내고, CURRENT는 실제 동작중인 파드의 개수, READY는 사용할 준비가 완료된 파드의 개수 입니다. 정상적인 환경이라면 모두 개수가 맞춰지는게 좋습니다.
이후 replicaset이 정말 파드의 개수를 유지해주는지 확인해보기 위해 kubectl delete pod [podname] 을 입력하여 삭제 후 kubectl get replicaset,pods 로 확인해보면 삭제한 파드가 사라지고, 새로운 파드가 생성된것을 확인할 수 있습니다.
-
레플리카셋에서 파드 독립 후 확인
위의 글에서 레플리카셋은 레이블을 참고하여 동작한다고 했습니다. 역으로 생각해보면 파드의 레이블 정보를 변경한다면 레플리카셋에서 독립할 수 있을 겁니다.
kubectl edit pod [podname] 을 입력하여 파드의 설정 편집창으로 들어간 후 아래와 같이 metadata.labels.app 을 변경 후 :wq 으로 저장 후 빠져 나옵니다.
이후 kubectl get replicaset,pods를 입력하여 정보를 가져와보면 수정한 파드는 정상적으로 실행중인데, 레플리카셋에서 파드가 하나 삭제되었다고 인식하여 3개를 유지하기 위해 새로운 파드를 다시 실행한것을 볼 수 있습니다.
만약, 이와 반대로 기존에 3개를 유지중인 레플리카셋에 다른 파드의 레이블을 변경하여 레플리카셋에 포함 시키면 기존에 유지중이던 파드 중 1개가 삭제 됩니다. (가장 늦게 실행된 파드가 삭제되는것으로 보이는데 확실히 테스트해보지는 않았습니다.)
-
기존 실행중인 파드를 유지하며 레플리카셋만 삭제
기본적으로 kubectl delete replicaset [replicaset name] 을 입력하여 삭제하면 실행중인 레플리카셋과 파드가 모두 삭제 됩니다. 기존의 파드는 유지한 채 레플리카셋만 삭제하고 싶다면 --cascade=false 옵션을 사용하면 됩니다.
위의 이미지를 확인 해봣을 때 --cascade=false 옵션을 사용하여 레플리카셋을 삭제 후 kubectl get replicaset,pods를 입력하면 레플리카셋은 삭제되어 출력되지 않고, 기존에 실행중이던 파드들만 삭제된것을 확인할 수 있습니다.
-
파드 개수 조정
kubectl scale 명령을 이용하여 파드의 개수를 실시간으로 조정할 수 있습니다. 명령은 아래와 같습니다.
## kubectl scale replicaset [replicaset name] --replicas=[변경할 개수]
# test-replicaset 라는 이름을 가진 레플리카셋의 replicas 개수(파드를 유지할 개수)를 5로 변경
kubectl scale replicaset test-replicaset --replicas=5