ReplicaSet은 Pod를 매니징한다.
예를 들어 nginx pod가 3개 있어야 한다고 하면 3개의 nginx pod를 유지한다.
replicaSet의 restartPolicy는 always이며 바꿀수 없다.
예를들어 아래 그림에서 노드2가 갑자기 죽었을때 pod의 개수를 유지하기 위해 다른 노드에 pod를 띄운다.
직접적으로 생성하는건 프로덕션 레벨에서는 권장되지 않으며 Deployment가 ReplicaSet을 관리한다.
이 글에서는 무엇을 관리해야하는지 명확히 하기 위해 metadata.labels를 사용한다
ReplicaSet 생성
주요 레퍼런스는 아래 링크에서 참고할 수 있다.
https://kubernetes.io/docs/reference/kubernetes-api/workload-resources/replica-set-v1/
# 01-simple-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-rs
spec:
selector:
# 맞는 레이블을 찾는다 (여러개가 가능하다)
matchLabels:
app: my-app
# pod를 몇개로 유지할 것인지
replicas: 3
# pod의 개수가 맞지 않으면 기본적으로 실행할 pod의 내용
template:
metadata:
name: my-pod
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx
kubectl get replicaset 명령어를 통해 replicaset을 가져올 수 있다(kubectl get rs로도 가능)
kubectl get all 명령어를 통해 감시하자
watch -t -x kubectl get all
이제 아래 명령어를 실행해보면 pod가 3개 실행되는걸 볼 수 있다.
kubectl create -f 01-simple-rs.yaml
이 때 템플릿 쪽의 metadata에 정의한대로 name이 생성되지 않는것을 알 수 있다.
...
template:
metadata:
name: my-pod
...
이제 하나를 삭제해보면 컨테이너가 삭제되고 즉시 다른 컨테이너가 확인되는걸 확인할 수있다.
또는 모든 컨테이너를 삭제해도 모든 컨테이너가 다시 실행되는걸 확인할 수 있다.
kubectl delete pod --all
마지막으로 아래 명령어를 통해 replicaSet을 삭제하면 replicaSet 과 replicaSet이 관리하는 모든 pod들이 사라진다.
kubectl delete -f 01-simple-rs.yaml
기존에 존재하는 pod와 replicaSet
이미존재하는 pod에 replicaSet을 적용해보자
# 02-multiple-pods.yaml
apiVersion: v1
kind: Pod
metadata:
name: pod-1
labels:
team: team-a
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: pod-2
labels:
team: team-a
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: v1
kind: Pod
metadata:
name: pod-3
labels:
team: team-a
spec:
containers:
- name: nginx
image: nginx
# 03-existing-pod-manager.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-rs
spec:
selector:
matchLabels:
team: team-a
replicas: 2
template:
metadata:
labels:
team: team-a
spec:
containers:
- name: nginx
image: nginx
위 두 파일을 생성한 후 02 번을 실행한다.
kubectl create -f 02-multiple-pods.yaml
이제 pod가 3개 생성되었다.
이제 03번을 적용해보자
kubectl create -f 03-existing-pod-manager.yaml
이제 파드를 확인해보면 하나가 종료되고 2개만 남아있는것을 확인할 수 있다.
추가로 남은 파드중 하나를 지워보면 03번에 정의된 my-rs이름으로 pod가 새로 생성되는걸 확인 할 수 있다.
kubectl delete pod/pod-2
Multiple ReplicaSet
# 04-multiple-rs.yaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-rs-1
spec:
selector:
matchLabels:
app: my-app
replicas: 2
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx
---
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-rs-2
spec:
selector:
matchLabels:
app: my-app
replicas: 2
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx
---을 기준으로 아래를 전부 주석처리 한 후 실행해보자.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: my-rs-1
spec:
selector:
matchLabels:
app: my-app
replicas: 2
template:
metadata:
labels:
app: my-app
spec:
containers:
- name: nginx
image: nginx
#---
#apiVersion: apps/v1
#kind: ReplicaSet
#metadata:
# name: my-rs-2
#spec:
# selector:
# matchLabels:
# app: my-app
# replicas: 2
# template:
# metadata:
# labels:
# app: my-app
# spec:
# containers:
# - name: nginx
# image: nginx
kubectl create -f 04-multiple-rs.yaml
그럼 이제 rs-1의 replicaset은 실행되어 있는 상태이다.
이제 주석을 해제하고 다시 실행해보자
kubectl create -f 04-multiple-rs.yaml
그럼 my-rs-1은 이미 존재해서 에러가 나고 my-rs-2는 추가로 생성되는것을 확인할 수 있다.
Describing replicaset
아래 명령어를 통해 replicaset에 대한 세부 정보를 볼 수 있다.
kubectl describe rs/[rs이름]
ex) kubectl describe rs/my-rs-1
ReplicaSet Match Expressions
아래와 같이도 가능하다. 하지만 실제 production level에서는 간단하게 사용하기 때문에 가능하다고 알아만 두자.
spec:
selector:
matchLabels:
- key: "team"
operator: In
values: ["team-a", "team-b"]
'Kubernetes' 카테고리의 다른 글
[Kubernetes] Service (0) | 2024.12.17 |
---|---|
[Kubernetes] Deployment (0) | 2024.12.16 |
[Kubernetes] Pod 기초 - 2 (1) | 2024.12.06 |
[Kubernetes] Pod 기초 - 1 (0) | 2024.11.27 |
[Kubernetes] Cluster 학습 (0) | 2024.11.19 |