티스토리 뷰
레플리카셋을 사용하는 이유
쿠버네티스의 기본 단위인 파드는 여러 개의 컨테이너를 추상화해 하나의 애플리케이션으로 동작하도록 만드는 컨테이너 묶음이다. 그러나 YAML에 파드를 생성하게 되면 이 파드의 생성 주기는 어떻게 될까?
YAML로 생성한 파드는 아래와 같은 두 가지 방법으로 삭제할 수 있다.
kubectl delete -f nginx-pod-with-ubuntu.yaml
kubectl delete pods my-nginx-pod
만약 kubectl delete 명령어로 파드를 삭제하면 파드의 컨테이너 또한 삭제된 뒤 쿠버네티스에서 영원히 사라지게 된다. 이처럼 YAML 파일에 파드만 정의해 생성할 경우 해당 파드는 오직 쿠버네티스 사용자에 의해 관리된다. 단순히 파드의 기능을 테스트하는 등의 간단한 용도로는 이렇게 파드를 사용할 수 있지만, 실제로 외부 사용자의 요청을 처리해야 하는 마이크로 서비스 구조의 파드라면 이러한 방식을 사용하기 어렵다. 스웜 모드처럼 마이크로서비스에서는 여러 개의 동일한 컨테이너를 생성한 뒤 외부 요청이 각 컨테이너에 적절히 분배될 수 있어야 한다.
쿠버네티스에서는 기본 단위가 파드이기 때문에 동일한 여러 개의 파드를 생성해 외부 요청을 각 파드에 분배하는 방식을 사용해야 할 것이다. 그렇다면, 동일한 여러 개의 파드를 어떻게 생성할 수 있을까? 가장 간단한 방법은 서로 다른 이름을 가지는 여러개의 파드를 직접 만드는 방식일 것이다.
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod-a
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod-b
spec:
containers:
- name: my-nginx-container
image: nginx:latest
ports:
- containerPort: 80
protocol: TCP
그러나 여러 개의 파드를 직접 생성하는 방법은 여러 가지 이유로 적절하지 않다. 우선 동일한 파드의 개수가 많아질수록 일일이 정의하는 것은 매우 비효율적인 작업이다. 또한 파드가 어떤 이유로든지 삭제되거나, 파드가 위치한 노드에 장애가 발생해 더 이상 파드에 접근하지 못하게 됐을 때, 직접 파드를 삭제하고 다시 생성하지 않는 한 해당 파드는 다시 복구되지 않는다.
그래서 파드만 YAML 파일에 정의해 사용하는 방식은 여러 가지 한계점이 있다. 따라서 쿠버네티스에서 파드만 정의해 사용하는 경우는 거의 없으며, 이러한 한계점을 해결해주는 레플리카셋(replicaset)이라는 쿠버네티스 오브젝트를 함께 사용하는 것이 일반적이다. 레플리카셋이 수행하는 역할을 간단하게 설명하자면 아래와 같다.
- 정해진 수의 동일한 파드가 항상 실행되도록 관리한다.
- 노드 장애 등의 이유로 파드를 생성할 수 없다면 다른 노드에서 파드를 다시 생성한다.
따라서 동일한 Nginx 파드를 안정적으로 여러 개 실행할 수도 있고, 워커 노드에 장애가 생기더라도 정해진 개수의 파드를 유지할 수도 있다. 이처럼 레플리카셋이 대신 파드를 관리하기 때문에 개발자가 파드를 직접 관리할 필요는 거의 없다.
레플리카셋 사용하기
레플리카셋이 어떠한 역할을 하는지 이해했다면, 이제 Nginx 파드를 생성하는 레플리카셋을 만들어보겠다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: replicaset-nginx
spec:
replicas: 3
selector:
matchLavels:
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
이 레플리카셋의 이름은 metadata의 name 항목에서 replicaset-nginx로 설정했다. 그런데 이전의 파드를 생성할 때 사용한 YAML 파일과 비교해 보면 새로운 항목이 몇 가지 추가된 것을 알 수 있다.
- spec.replicas : 동일한 파드를 몇 개를 유지시킬 것인지를 설정한다. 위 예시에서는 파드의 개수를 3으로 설정했기 때문에 레플리카셋은 3개의 파드를 새롭게 생성할 것이다.
- spec.template : 파드를 생성할 때 사용할 템플릿을 정의한다.
위의 파일을 작성했다면, 이 내용으로 레플리카셋을 직접 생성해 보겠다. 파드를 생성했던 방식과 동일하게 kubectl apply -f 명령어로 YAML 파일을 읽어와 생성한다.
kubectl apply -f replicaset-nginx.yaml
3개의 파드가 정상적으로 생성되었다. 그리고 이 3개의 파드는 위에서 생성한 레플리카셋에 의해 생성된 것이다.
Ref : 시작하세요! 도커/쿠버네티스
'DevOps > Kubernetes' 카테고리의 다른 글
[Kubernetes] Ingress (2) | 2023.08.15 |
---|---|
[Kubernetes] Namespace : 리소스를 논리적으로 구분하는 장벽 (0) | 2023.01.14 |
[Kubernetes] Service : 파드를 연결하고 외부에 노출하기 (0) | 2023.01.14 |
[Kubernetes] Deployment : 레플리카셋, 파드의 배포를 관리 (2) | 2023.01.13 |
[Kubernetes] 쿠버네티스 시작하기 (2) | 2023.01.12 |