Controller [2] - ReplicaSet
ReplicaSet는 Replication Controller의 발전형이다.
Replication Controller는 Selector가 동호 기반이므로 labels를 선택할 때 같은지 다른지만 확인하지만,
ReplicaSet은 in, notin, exists와 같은 연산자를 지원한다.
selector:
matchLabels:
component: redis
matchExpressions:
- {key: tier, operator: In, values: [cache]}
- {key: environment, operator: NotIn, values: [dev}
matchExpressions 연산자
- In : key와 value를 지정하여 key, value가 일치하는 pod에만 연결
- NotIn : key는 일치하고 value는 일치하지 않은 Pod에 연결
- Exists : key에 맞는 label의 pod를 연결
- DoesNotExist : key와 다른 label의 pod를 연결
ReplicaSet를 이용해 파드를 관리하는 예를 살펴보자.
아래는 ReplicaSet를 사용하도록 설정하는 template의 예이다.
apiVersion: apps/v1
kind: ReplicaSet
metadata:
name: rs-nginx
spec:
replicas: 3
selector:
matchLabels:
app: web
template:
metadata:
name: nginx-pod
labels:
app: web
spec:
containers:
- name: nginx-container
image: nginx:1.14
ReplicaSet을 정의하는 필드는 획득 가능한 파드를 식별하는 방법이 명시된 셀렉터(selector), 유지해야 하는 파드 개수를 명시하는 레플리카의 개수(replicas), 그리고 레플리카 수 유지를 위해 생성하는 신규 파드에 대한 데이터를 명시하는 파드 템플릿을 포함한다(template).
ReplicaSet은 필드에 지정된 설정을 충족하기 위해 필요한 만큼 파드를 만들고 삭제한다. 레플리카셋이 새로운 파드를 생성해야 할 경우, 명시된 파드 템플릿을 사용한다.
$ kubectl create -f rs-nginx.yaml
replicaset.apps/rs-nginx created
replicaset이 생성된 것을 확인했다.
$ kubectl get rs
replicas에 지정한 것과 같이 총 3개의 파드가 생성되었다.
$ kubectl get po
3개의 파드 모두 label이 app=web으로 지정되어있다.
$ kubectl get po --show-labels
Replicas 개수 바꾸기
scale 명령어를 이용해 replicas 개수를 4개로 변경해보았다.
rs-nginx-k7tk8이 생성되었다.
$ kubectl scale rs rs-nginx --replicas=4
rs-nginx-k7tk8을 삭제해보니 ReplicaSet에 의해서 새로운 파드가 생성된 것을 확인할 수 있다.
ReplicaSet은 파드의 개수를 일정하게 유지해주기 때문에 파드의 개수가 하나 부족해 하나의 파드를 생성한 것이다.
$ kubectl delete po rs-nginx-k7tk8
pod "rs-nginx-k7tk8" deleted
ReplicaSet만 지우기 (파드 유지)
만약 ReplicaSet을 지워도 파드는 지우지 않고 유지하고 싶다면 어떻게 해야할까?
ReplicaSet과 파드를 한꺼번에 삭제할 때는 kubectl delete replicaset 명령어를 실행하지만, --cascade=false 옵션을 사용하면 ReplicaSet가 관리하는 파드에 영향을 끼치지 않고 ReplicaSet만 삭제할 수 있다.
$ kubectl delete replicaset rs-nginx --cascade=false
replicaset.apps "rs-nginx" deleted
rs-nginx는 지워졌지만, 파드들은 그대로 남아있는 것을 확인했다.
$ kubectl get po
$ kubectl get rs rs-nginx
Error from server (NotFound): replicasets.apps "rs-nginx" not found
지웠던 rs-nginx를 다시 생성하면 어떻게 될까?
$ kubectl create -f rs-nginx.yaml
replicaset.apps/rs-nginx created
파드의 개수를 유지해주는 Controller만 추가되고 기존의 파드는 그대로 유지된다.
파드의 label 바꿔보기
edit 명령어를 이용해 rs-nginx-9wrqd 파드의 label을 app: nginx-other로 변경하였다.
$ kubectl edit po rs-nginx-9wrqd
pod/rs-nginx-9wrqd edited
app=web label을 가진 파드가 새로 생성된 것을 확인할 수 있었다.
rs-nginx.yaml에 replicas 개수를 3개로 설정해두었기 때문에 ReplicaSet은 app=web 라벨을 가진 파드 개수를 3개로 유지해준다.
$ kubectl get po --show-labels