Kubernetes

Controller [2] - ReplicaSet

chaenii 2022. 1. 29. 23:40

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

반응형