-
클라우드: 쿠버네티스 레플리카셋(Replica Set) 실습하기K8S 2021. 2. 5. 01:58
우선 포드는 기본적으로 여러 개의 컨테이너를 추상화하여 하나의 어플리케이션으로 동작한다.
외부 사용자가 어플리케이션으로 요청을 보내면 쿠버네티스에서는 이러한 요청을 동일한 여러개의 포드로 분배하여 전달한다.
그렇다면 동일한 여러개의 포드는 어떤식으로 생성할 수 있을까?
yaml 파일에 하나의 포드를 더 정의해서 사용하는 방법은 매우 비효율적이다.
워커 노드가 다운되거나 어떠한 이유로 포드가 삭제된다면 해당 포드를 다시 생성하기는 어렵다.
그래서 이러한 문제점을 해결해주는 것이 레플리카셋이다.
레플리카 셋이 하는 일은 다음과 같다.
● 동일한 포드가 정해진 수 만큼 실행되도록 한다.
● 노드에 장애 발생시, 다른 노드에서 포드를 다시 생성한다.
이렇게 레플리카셋을 이용하여 일정한 수의 동일한 포드를 생성하고 유지할 수 있다.
레플리카셋의 사용과 동작원리를 알아보기 위해 다음과정을 실습한다.
다음과 같이 replicaset을 이용해서 yaml파일을 만든다.
<replica-nginx.yaml>
apiVersion: apps/v1 kind: ReplicaSet metadata: name: replicaset-nginx spec: replicas: 3 selector: matchLabels: app: my-nginx-pods-label template: metadata: name: my-nginx-pod labels: app: my-nginx-pods-label spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
(yaml파일에 대한 내용은 뒤에서 알아보겠다)
metadata.name : 만들어진 replicaset의 name
spec.replicas : 동일한 포드를 몇개 유지시킬 것인지 설정
spec.template : 만들어질 포드에 대한 내용을 기술하며 보통 포드 스펙, 포드 템플릿이라고 한다.
(template 밑의 내용은 이전 포스팅에서 사용했던 컨테이너와 유사하다.)
위 yaml파일을 클러스터에 적용해주면
kubectl apply -f replica-nginx.yaml
다음과 같이 포드가 3개의 동일한 포드가 생성되었음을 알 수 있다.
다음 명령어를 통해 생성된 replicaset의 정보를 볼 수 있다.
kubectl get rs
이번에는 위에서 생성한 yaml파일에서 replicas를 4로 변경한 후 클러스터에 적용시킨다.
쿠버네티스는 이미 생성된 리소스의 속성을 변경하는 기능을 제공하기 때문에
기존의 replicaset을 삭제하지 않고, 다시 다음 명령어를 통해 적용시켜 준다.
kubectl apply -f replica-nginx.yaml
configured 되었다고 나오면 변경된 속성이 잘 적용되었다는 것
만들어진 replica set을 삭제하고 싶을때는 다음 명령어를 따른다.
kubectl delete rs replicaset-nginx
또는
kubectl delete -f replica-nginx.yaml
위와 같은 실습을 거쳐서 레플리카셋의 사용법은 알아보았지만 어떠한 원리로 레플리카셋이 동작하는 것일까?
레플리카셋은 라벨 셀렉터(Label selector)를 이용해서 위와 같은 동작을 수행한다.
위에서 실습했던 yaml파일을 통해서 알아본다.
<replica-nginx.yaml>
apiVersion: apps/v1 kind: ReplicaSet metadata: name: replicaset-nginx spec: replicas: 3 selector: matchLabels: app: my-nginx-pods-label template: metadata: name: my-nginx-pod labels: app: my-nginx-pods-label spec: containers: - name: nginx image: nginx:latest ports: - containerPort: 80
먼저 template을 기준으로 위는 replicaset에 대한 내용, 밑은 pod에 대한 내용이다.
레플리카 셋은 label selector를 이용해서 생성할 포드를 결정짓는다.
이후 레플리카 셋은 레이블이 my-nginx-pods-label인 포드를 찾는다.
만약 존재한다면 레이블이 my-nginx-pods-label인 포드가 replicas에서 정의된 수만큼 존재할때까지
레이블이 my-nginx-pods-label인 포드를 생성한다.
하지만 만약 존재하지 않는다면 template에 정의되어 있는 pod를 생성한다.
다음과 같은 경우를 생각해보자
먼저 my-nginx-pod-label이라는 라벨을 가진 my-nginx-pod 포드를 먼저 생성한후 위에서 정의한 레플리카셋을 적용시킨다.
< nginx-pod.yaml >
apiVersion: v1 kind: Pod metadata: name: my-nginx-pod labels: app: my-nginx-pods-label spec: containers: - name: my-nginx-container image: nginx:latest ports: - containerPort: 80 protocol: TCP
kubectl apply -f nginx-pod.yaml
포드의 label을 확인하고 싶을때 다음 명령어를 따른다.
kubectl get pods --show-labels
이후 위에서 만들어준 replica-nginx.yaml을 apply했을 때 다음과 같은 포드 상태를 알 수 있다.
이는 replicaset의 label selector을 통해 처음 생성된 my-nginx-pod와 동일한 포드 3개가 더 생성되었음을 알 수 있다.
그리고 여기서 포드를 my-nginx-pod를 하나 지운다.
이후 kubectl get pods를 통해 상태를 확인해보면
포드하나를 지우자마자 replicaset에 의해 포드 하나가 더 생성되는 것을 알 수 있다.
용찬호 개발자님의 "시작하세요! 도커/쿠버네티스"를 인용해서 작성했습니다.
반응형'K8S' 카테고리의 다른 글
클라우드: 쿠버네티스 네임스페이스(namespace) 실습하기 (0) 2021.03.28 클라우드: 쿠버네티스 서비스(Service) ClusterIP와 NodePort 실습하기 (0) 2021.02.18 클라우드: 쿠버네티스 디플로이먼트(Deployment) 실습하기 (0) 2021.02.14 클라우드: 쿠버네티스 포드(Pod) 오브젝트 사용하기 (0) 2021.02.01 클라우드: 쿠버네티스 설치하기 (0) 2021.01.31