[k8s] 5-1. ReplicaSet
ReplicaSet
yaml 구성
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: echo-rs
spec:
replicas: 1
selector:
matchLabels:
app: echo
tier: app
template:
metadata:
labels:
app: echo
tier: app
spec:
containers:
- name: echo
image: ghcr.io/subicura/echo:v1
ReplicaSet 생성
# ReplicaSet 생성
$ kubectl apply -f echo-rs.yml
# 리소스 확인
$ kubectl get po,rs
NAME READY STATUS RESTARTS AGE
pod/echo-rs-tcdwj 1/1 Running 0 61s
NAME DESIRED CURRENT READY AGE
replicaset.apps/echo-rs 1 1 1 61s
ReplicaSet은 label을 체크
해서 원하는 수
의 Pod이 없으면 새로운 Pod
을 생성합니다. 이를 설정으로 표현하면 다음과 같습니다.
정의 | 설명 |
---|---|
spec.selector |
label 체크 조건 |
spec.replicas |
원하는 Pod의 개수 |
spec.template |
생성할 Pod의 명세 |
ReplicaSet 동작 원리
ReplicaSet Controller
는 ReplicaSet조건을 감시하면서 현재 상태와 원하는 상태가 다른 것을 체크ReplicaSet Controller
가 원하는 상태가 되도록Pod
을 생성하거나 제거Scheduler
는 API서버를 감시하면서 할당되지 않은unassignedPod
이 있는지 체크Scheduler
는 할당되지 않은 새로운Pod
을 감지하고 적절한노드
node에 배치- 이후 노드는 기존대로 동작
ReplicaSet은 ReplicaSet Controller가 관리하고 Pod의 할당은 여전히 Scheduler가 관리합니다.
Scale Out
yaml 파일의 replicas
를 다수로 설정해 주면 수에 맞게 Pod를 복제할 수 있습니다.
# echo-rs-scaled.yml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: echo-rs
spec:
replicas: 3
selector:
matchLabels:
app: echo
tier: app
template:
metadata:
labels:
app: echo
tier: app
spec:
containers:
- name: echo
image: ghcr.io/subicura/echo:v1
$ kubectl apply -f echo-rs-scaled.yml
# 또는
$ kubectl scale rs echo-rs --replicas=3
# 또는
$ kubectl edit rs echo-rs
# Pod 확인
$ kubectl get pod,rs
기존의 생성된 Pod 외에 2개가 추가로 생성됨.
NAME READY STATUS RESTARTS AGE
pod/echo-rs-h4q86 1/1 Running 0 11m
pod/echo-rs-4wk6t 1/1 Running 0 2m30s
pod/echo-rs-nkgf2 1/1 Running 0 2m30s
NAME DESIRED CURRENT READY AGE
replicaset.apps/echo-rs 3 3 3 11m
# DESIRED : 설정한 replicas 수
# CURRENT : 현재 replicas 수
# READY : 현재 replicas 중 이용 가능한 replicas 수
ReplicaSet을 삭제하면 Pod도 함께 삭제된다.
$ kubectl delete rs echo-rs
pod는 삭제하지 않고 ReplicaSet만 삭제하려면
$ kubectl delete rs echo-rs --cascade=false
다만, ReplicaSet에 의해 통제되지 않는 단독 Pod로 남게된다.
Replication Controller
replicaSet과 거의 같은 개념으로 사용된다.
다만 ReplicaSet이 더 풍부한 selector를 가지고 있다.
Replication Controller는 label을 통해 replica를 관리한다.
아래는 예시 파일
apiVersion: apps/v1
kind: ReplicationController
metadata:
name: rc-nginx
spec:
replicas: 3
selector:
app: webui
template:
metadata:
name: nginx-pod
labels:
app: webui
spec:
containers:
- name: nginx-container
image: nginx:1.14
# replicas 변경시
$ kubectl scale rc echo-rs --replicas=3
# rc=replication controller
또는
$ kubectl edit rc echo-rs
# vim editor를 통해 수정
다만, replicas controller는 replicas 개수만 충족 한다면 정상으로 동작하기 때문에,
image의 version 정보를 바꾸더라도 바뀌지 않고, 이전 version의 pod가 그대로 동작함.
pod를 종료한 후 재시작 하면 바뀐 version의 pod로 재시작됌.
ReplicationController vs ReplicaSet
ReplicaSet은 다양한 Selector를 지원
RelicationController
spec:
replicas: 3
selector: # label과 version만 support함
app: webui
version: "2.1"
...
ReplicaSet
spec:
replicas: 3
selector:
matchLabels:
app: webui
matchExpressions:
- {key: version, opratior: In, value:["2.1", "2.2"] }
# option
- {key: version, tier, environment ...
- {opatior: In = key와 value를 지정하여 일치하는 Pod만 연결
NotIn = key는 일치 value는 일치하지 않는 Pod에 연결
Exists = key에 맞는 label의 pod를 연결
DoesNotExist = key와 다른 label의 pod를 연결
댓글남기기