[k8s] Controller - ReplicaSet(RS)

2022. 9. 11. 17:52[ DevOps ]/[ k8s ]

 

 

 

ReplicaSet Controller

- RC(ReplicationController)와 같은 역할을 하는 컨트롤러이다.

- RC보다 다양한 형태의 selector를 지원한다. 이때 selector 필드 아래 matchLabels, matchExpressions 필드를 사용한다.

- matchLabels만 사용하면 RC와 같다. (label에 대한 AND 연산)

- matchExpressions까지 사용하면 다양한 형태로 표현할 수 있다. 

- RC, RS 모두 label과 selector 만을 기반으로 Pod를 컨트롤한다. 즉, 어떤 컨테이너인지는 관여하지 않는다.

 

 

 

 

RC vs RS Definition 비교

 

출처: https://github.com/237summit/Getting-Start-Kubernetes/blob/main/6/rs-exam1.yaml

 

 

- ReplicaSet의 API 버전은 apps/v1이다. (k8s 1.22 기준)

ReplicationController에서 selector 하위 항목들에 대해 AND 조건으로 연산한다.

- ReplicaSet Controller에서는 selector 하위 항목에 matchLabels를 등록할 수 있다. matchLabels만 사용할 경우에는 Replication Controller와 완전히 같다. 즉, matchLabels에서는 AND 조건을 기반으로 한다. 하지만 selector 하위에 matchExpressions를 추가할 경우에는 ReplicationController보다 더욱 풍부한 조건을 기반으로 Pod 컨트롤이 가능해진다.

 

 

공통점 - label, selector 기반의 컨트롤러
- 컨테이너가 어떤 것이든 관여하지 않음
차이점 - rc의 경우 selector에 정의한 label이 2개 이상일 경우 모든 label을 만족하는 Pod만 스캔 대상이 된다. 즉, rc는 label에 대해 AND 조건만 가능하다.
- rs는 matchLabels 필드로 스컌 대상이 될 label만을 포함시킬 수 있다. 추가로 rs는 matchExpressions의 연산자를 활용하여 label에 대해 다양한 연산이 가능하다.

 


 

rs의 matchExpressions 연산자

1) In: key와 values를 지정하여 key, value가 일치하는 Pod 필터링

2) NotIn: key는 일치하고 value는 일치하지 않는 Pod 필터링

3) Exists: key에 맞는 label의 Pod 연결

4) DoesNotExist: key와 다른 label의 Pod 연결

 

 

rs의 matchExpressions 다양한 사용법 예시

[예시 1]

app은 webui이고 version 안에 "2.1"이 들어가(In) 있는 것만 3개(replicas) 보장

 

 

[예시 2]

app은 webui이고 version 안에 "2.1" '또는' "2.2"가 들어가(In) 있는 것만 3개(replicas) 보장

 

 

[예시 3]

app은 webui이고 version이 "2.1" '또는' "2.2"가 아닌 것(NotIn)만 3개(replicas) 보장

 

 

[예시 4]

app은 webui이고 version이라는 키가 있는(Exists) 것만 3개(replicas) 보장

- DoesNotExists는 반대

 

 


 

실습

ReplicaSet Nginx를 실행해본다.

 

rs 파일 작성 후 실행

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  replicas: 3
  selector:
    matchLabels:
      app: webui
  template:
    metadata:
      name: nginx-pod
      labels:
        app: webui
    spec:
      containers:
      - name: nginx-container
        image: nginx:1.14

출처: https://github.com/237summit/Getting-Start-Kubernetes/blob/main/6/rs-nginx.yaml

 

 

Pod 삭제 후 결과 확인

- 이전 상태

 

- rs-nginx-j7bvg 삭제 후 확인

 

cf. rs 타입으로 동작중인 Pod 죽이면 다시 생성되지만 컨트롤러(rs) 자체를 삭제하면 Pod도 같이 삭제됨

 

 

스케일링 후 결과 확인

- 2개로 변경 (scale-in)

- 가장 최근에 실행된 Pod를 우선 삭제함을 확인

 

 

RS 삭제 후 결과 확인

- rs를 삭제하면 pod들도 같이 삭제되고 pod만 삭제하면 rs에 의해 pod는 재시작된다. 

- 아래 cascade 옵션을 사용해서 pod를 그대로 두고 rs만 삭제할 수 있다.

 

- 위와 같이 cascade=fasle (cascade=orphan)를 사용하여 rs만 삭제하고 pod를 그대로 두면, 남겨진 pod는 아무도 컨트롤해주지 않는 단독적인 pod로 변경된다.

 

- 하지만 여전히 labels은 app=webui 임을 확인할 수 있다.

 

 

rs-nginx.yaml 다시 시작 후 결과 확인

- 위에서 pod를 orphan으로 남겨두고 rs만 삭제한 상태에서 rs-nginx rs를 다시 실행한 경우에 해당한다

- 위 rs-nginx.yaml 파일에서 볼 수 있듯이 rs-nginx rs는 app=webui라는 label의 pod를 3개 실행시키는 것을 목적으로 한다.

- 하지만 이미 app=webui label을 가진 pod 2개가 실행 중이므로 1개만 추가적으로 실행시킬 것이다.

 

 

- 혹시나 실행할 컨테이너가 nginx가 아니더라도 1개가 추가적으로 실행된다. 즉, rs에서는 label과 selector만을 기준으로 pod 컨트롤을 진행한다. 대체로 rs를 사용할 때 서로 다른 프로그램을 실행하지 않는 것이 일반적이다. 따라서 rs를 사용할 때 label과 selector를 잘 설정해야 한다.

 

 

cf. rs를 제대로 사용하기 위한 최소 설정

- version

- type

- name 

- etc,

 

 

 

Reference

- 따배쿠, https://youtu.be/78QmQdjovCc

- ReplicaSet k8s docs, https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/

- label, selector, matchExpressions, https://kubernetes.io/ko/docs/concepts/overview/working-with-objects/labels/