ReplicaSet
Pod에 이어서 ReplicaSet이다.
레플리카셋은 이름에서 알 수 있듯이 여러 개의 파드를 한번에 생성해주는 오브젝트이다.
ReplicaSet을 왜 쓸까?
예시로 바로 보자.
이전과는 다르게, Pod가 이번엔 1개가 아니라 4개가 필요한 상황이다.
4개의 nginx pod를 만드려면 어떻게 해야할까?
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod-a
spec:
containers:
- name: my-nginx-container
image: nginx
ports:
- containerPort: 80
protocol: TCP
---
apiVersion: v1
kind: Pod
metadata:
name: my-nginx-pod-b
spec:
containers:
- name: my-nginx-container
image: nginx
ports:
- containerPort: 80
protocol: TCP
---
...
kubectl apply -f 4-nginx-pod.yaml
다행히 YAML은 ---를 구분자로 사용하여 여러 개의 리소스를 정의할 수 있지만,
각 Pod별로 겹치는 부분도 많고 관리하기에 힘들어 보인다.
ReplicaSet을 이용하면 이를 쉽게 해결할 수 있다.
ReplicaSet은 다음과 같은 기능을 제공한다.
- 클러스터 내에서 항상 정해진 수의 동일한 Pod가 실행되도록 관리한다.
- 노드 장애등의 이유로 Pod에 장애가 발생하면 다른 노드로 Pod를 옮긴다.
ReplicaSet을 정의하는 YAML
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
spec:
replicas: 4
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
ports:
- containerPort: 80
apiVersion
Pod와 달리 ReplicaSet은 apps/v1을 사용한다.
리소스별 api version은 다음과 같은 명령어로 확인할 수 있다.
kubectl api-resources -o wide
Shortname도 알려주는데, 이게 상당히 유용하다!
ReplicaSet의 줄임말은 rs이며, apps 그룹에 속해있는것을 볼 수 있다.
그룹명이 없는것은 기본 core 그룹에 속해있어 Pod 처럼 단순히 v1으로 나타낼 수 있다.
spec
ReplicaSet spec을 보면 replicas 필드가 추가됐다.
이는 ReplicaSet이 생성하고 관리할 Pod 개수를 설정한다.
selector 필드는 ReplicaSet이 Pod를 찾는데 필요한 정보를 제공한다.
즉, app: my-nginx-pods-label 라벨을 가지는 Pod를 관리한다.
template 필드는 만약 app: my-nginx-pods-label 이라는 라벨을 가지고 있는 Pod가
현재 클러스터에 replicas 필드에 정의한 수만큼 존재하지 않다면 생성할 Pod를 정의한다.
우리는 현재 클러스터에 아무런 Pod가 없으므로 template에 명시된 Pod를 4개를 생성할 것이다.
만약 기존에 selector에 명시된 라벨을 가진 Pod가 1개 있다면 새롭게 Pod를 3개 생성할 것이다.
YAML파일로 ReplicaSet 생성하기
ReplicaSet도 kubectl을 통해 생성할 수 있다.
kubectl apply -f rs-nginx.yaml
ReplicaSet이 생성됐다!
한번 살펴보자.
Desired와 Current, Ready가 4로 일치하는것을 보면 정상적으로 잘 된 것을 알 수 있다.
Pod는 어떻게 생성됐을까?
4개의 Pod가 잘 올라와있다.
자세히 보면 w2-k8s 노드에 두 개의 Pod가 할당되었다.
워커 노드는 3개뿐이고, 생성해야 하는 Pod는 4개이니
스케쥴러가 워커 노드들의 상태를 고려해서 하나의 노드에 2개의 Pod를 배치한것이다.
Replica Factor 수정하기
현재 Replica Factor는 4로 설정되어있는데, 3으로 줄이면 어떻게 될까?
YAML 파일의 replicas 필드를 3으로 수정한 이후, apply를 다시 해보자.
w2-k8s에 있던 Pod중 하나가 삭제된 것을 볼 수 있다.
ReplicaSet 삭제하기
이번엔 아예 ReplicaSet을 삭제해보자.
kubectl delete -f rs-nginx.yaml
ReplicaSet만을 삭제했는데, Pod들도 전부 사라졌다.
정확히는 해당 ReplicaSet을 통해 생성된 Pod가 같이 삭제된다.
Pod 장애 복구
ReplicaSet이 제공하는 기능인 Pod 장애 복구를 테스트 해보자.
다시 ReplicaSet을 생성하면 다음과 같다.
이번에도 w2-k8s 노드에 2개의 Pod가 할당됐다. (w2-k8s가 힘이 좋나보다)
이때, w3-k8s 노드에 할당된 Pod를 삭제해보자.
그리고 다시 Pod를 조회해보자.
오잉? 똑같이 Pod 개수가 4개이다.
삭제가 잘 안됐나? 하고 봤더니 맨 마지막 Pod의 Age가 나머지 Pod와 다른것을 볼 수 있다.
새롭게 Pod가 생성된것이다!
이렇게 ReplicaSet을 통해 생성된 Pod는 삭제나 장애가 발생하면 ReplicaSet에 의해 다시 생성된다.
ReplicaSet의 본질은 Pod의 생성이 아닌, Pod의 개수 유지라는것을 명심하자.
Pod 라벨 삭제
앞서 ReplicaSet은 라벨을 통해 Pod를 관리한다고 했었다.
현재 생성된 Pod들은 전부 app=my-nginx-pods-label 이라는 라벨을 가지고 있다.
만약 w1-k8s 노드에 있는 Pod의 Label을 지우면 어떻게 될까?
kubectl edit pods rs-nginx-jjx5k
edit 명령어는 직접 오브젝트의 정보를 수정할 수 있게 해준다.
이후 다시 Pod의 목록을 조회해보면 우리가 예상한 결과를 얻을 수 있다.
'Infra > Kubernetes' 카테고리의 다른 글
[Kubernetes] 쿠버네티스 오브젝트 [Service] (0) | 2023.07.05 |
---|---|
[Kubernetes] 쿠버네티스 오브젝트 [Deployment] (0) | 2023.07.04 |
[Kubernetes] 쿠버네티스 오브젝트 [Pod] (0) | 2023.07.03 |
[Kubernetes] 쿠버네티스 구성 요소 (0) | 2023.07.03 |
[Kubernetes] 쿠버네티스 시작하기 (0) | 2023.07.03 |