본문 바로가기
Containers/Kubernetes

4.3. ReplicaSet

by shinebee* 2020. 7. 28.

1. ReplicaSet 소개

  • replication controller의 문제점 및 기능을 개선을 위해 추가되었다.
  • replication controller가 제공하는 기능과 거의 비슷하다.
  • 기본적으로 요구하는 복제본 개수만큼 pod를 복제하고 모니터링하며 관리한다.

 

 

2. ReplicaSet과 replication controller의 비교

  • pod의 다중 레이블 지원
    • 파드 들은 레이블이 여러 개 있을 수 있다.ex) app: web,  env: dev
    • 레이블이 몇개든 상관없다.
    • 레플리케이션 컨트롤러는 레이블을 하나밖에 모른다.

 

  • pod에 설정된 레이블의 키만 선택 가능
    • env라는 레이블의 키만 가지고 있어도 된다.=> 특정 레이블의 키만 가지고 있어도 된다.
    • 레이블은 생성한 직후에는 같지만 나중에 추가하거나 수정할 수 있는데 그래도 인식 가능하다.

 

 

3. ReplicaSet 생성

  • 레플리카셋은 apps API 그룹에 속하며 v1 버전을 사용한다.
  • 레플리카셋 API 그룹과 버전 정보 확인
kubectl api-resources
kubectl api-versions

 

 

 

  • 레플리케이션 컨트롤러에서 생성한 mynapp-rc.yaml 파일과 똑같은 기능을 하는 레플리카셋 생성
# mynapp-rs.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mynapp-rs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: mynapp-rs
  template:
    metadata:
      labels:
        app: mynapp-rs
    spec:
      containers:
      - name: mynapp
        image: httpd
        ports:
        - containerPort: 80
  • 레플리케이션 컨트롤러에서는 레이블 셀렉터 항목에 레이블을 직접 지정했지만,  레플리카셋은 matchLabels 및 matchExpressions 필드로 레이블을 선택한다.
  • matchLabels는 특정 레이블의 키=값을 매칭하게 된다.

 

  • 레플리카셋 생성
kubectl create -f mynapp-rs.yaml

 

 

4. ReplicaSet 확인

  • 레플리카셋 상태 및 목록 확인

 

  • pod 목록 확인

 

 

5. ReplicaSet의 Label selector 사용

1) matchLabels 레이블 셀렉터

...
spec:
  selector:
    matchLabels:
      key: value
...
  • matchLabels로 레이블 셀렉터를 사용하는 경우는 레플리케이션 컨트롤러와 똑같이 동작한다.

 

2) matchExpressions 레이블 셀렉터

...
spec:
  selector:
    matchExpressions:
    - key: <string>
      operator: < In | NotIn | Exists | DoesNotExists >
      values:
      - <string>
...
  • matchExpressions 필드는 레플리카셋의 기능.
  • key : 선택할 레이블의 키 이름 지정
  • values : 레이블의 값 지정
  • operator : 키, 값의 연산을 담당하는 부분
    • In : 레이블의 키와 값이 지정된 값으로 일치해야 한다.
    • NotIn :  레이블의 키와 값이 지정된 값과 일치하지 않아야 한다.
    • Exists
      • 레이블의 키가 포함되어야 한다. 
      • 레이블의 키 값만 매칭 ( value 항목 설정 X )
    • DoesNotExist
      • 레이블의 키가 포함되지 않아야 한다.
      • 레이블의 키 값만 매칭 ( value 항목 설정 X )

 

 

6. matchExpressions를 사용한 ReplicaSet 생성

# mynapp-rs-exp.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mynapp-rs-exp
spec:
  replicas: 3
  selector:
    matchExpressions:
      - key: app
        operator: In
        values:
          - mynapp-rs-exp
      - key: env
        operator: Exists
  template:
    metadata:
      labels:
        app: mynapp-rs-exp
        env: dev
    spec:
      containers:
      - name: mynapp
        image: c1t1d0s7/myweb
        ports:
        - containerPort: 8080

 

 

7. ReplicaSet 확인

  • -o wide 옵션 : 조금 더 자세한 정보를 확인할 수 있다.
  • 컨트롤러의 SELECTOR(레이블 셀렉터) 필드를 보기 위해 옵션 사용.

 

  • 레플리카셋에 의해 생성된 파드의 목록 확인

 

  • ReplicaSet을 정리하면 ReplicationController와 기능이 같지만, 다중 레이블 셀렉터 및 레이블 키 만 선택할 수 있는 기능이 추가되었다.

 

 

8. ReplicaSet 삭제

kubectl delete rs mynapp-rs-exp

 

 

9. 간단한 실습

※ 후에 만들 replicaset과 설정이 부합하는 pod를 두개 먼저 만들고 그 다음 replicaset을 생성한 후 replicaset이  먼저만든 두개의 pod를 인식하고 포함시킬 것인가를 확인!

  • pod
    • app: web
    • app: apache
  • replicaset
replica: 3
selector:
  matchExpressions:
  - key: app
    operator: Exists
pod의 정의
 metadata:
   labels:
     app: nginx

 

 1) pod 생성

  • app: web
apiVersion: v1
kind: Pod
metadata:
  name: mynapp-pod-1
  labels:
    app: web
spec:
  containers:
  - image: c1t1d0s7/myweb
    name: mynapp
    ports:
    - containerPort: 8080
      protocol: TCP

 

  • app: apache
apiVersion: v1
kind: Pod
metadata:
  name: mynapp-pod-2
  labels:
    app: apache
spec:
  containers:
  - image: c1t1d0s7/myweb
    name: mynapp
    ports:
    - containerPort: 8080
      protocol: TCP

 

  • 확인

 

 2) replicaset 생성

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mynapp-rs-test
spec:
  replicas: 3
  selector:
    matchExpressions:
    - key: app
      operator: Exists
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: mynapp
        image: c1t1d0s7/myweb
        ports:
        - containerPort: 8080
          protocol: TCP

 

  • 확인

 

 

※ 결론 : rs는 먼저 생성한 두개의 pod를 인식한다. replica = 3이므로 미리 생성되어있던 pod 두개 이외에 하나의 pod가 더 생 성된다.

'Containers > Kubernetes' 카테고리의 다른 글

5.1. Cluster 내부 서비스  (0) 2020.08.03
4.4. DaemonSet  (0) 2020.07.29
4.2. Replication Controller  (0) 2020.07.24
4.1. Liveness Probe  (0) 2020.07.24
3.4. namespace  (0) 2020.07.24

댓글