본문 바로가기

Devops/Kubernetes

[Kubernetes] Controller - Replicaset

레플리카셋(Replicaset)의 3가지 구성 요소

 

label selector

  • 레플리카셋에 의해 관리될 파드를 선택할 레이블 정의
  • .spec.template.labels의 필드와 spec.selector.matchLabels가 같아야 한다.
  • 레이블을 기준으로 파드가 관리되므로 실행 중인 파드를 중단하거나 재시작하지 않고 레플리케이션 컨트롤러가 관리하는 파드 변경 가능

replicas

  • 유지할 파드의 수
  • 기본 값은 1

pod template

  • 레플리카셋이 실행할 파드의 정의
  • 레플리카셋에 의해서 실행할 파드의 컨테이너 이미지, 포트, 이름등의 구체적 명세

레플리카셋 yml 예제 (rs-nginx.yaml)

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx
spec:
  selector:
    matchLabels:
      app: rs-nginx
  template:
    metadata:
      name: rs-nginx
      labels:
        app: rs-nginx
    spec:
      containers:
      - name: rs-nginx
        image: nginx
        ports:
        - containerPort: 80
  replicas: 3

 

레플리카셋(RepicaSet)의 집합적 라벨 정의

 

연산기호 설명
IN lable에 지정된 값(value)중 하나에 일치해야 한다.
NotIn label의 value 목록 중 어느것과도 일치하면 안된다.
Exists key의 value와 상관없이 key가 pod에 정의되어 있기만 하면 된다.
DoesNotExist key의 value와 상관없이 key가 pod에 정의되어 있으면 안된다.

 

app의 value가 web, nginx 인 것들에 대해서 replicaset이 관리를 한다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: rs-nginx-label
spec:
  selector:
    matchExpressions:
    - key: app
      operator: In
      values:
      - web
      - nginx

 

레플리카셋(Replicaset) 생성과 삭제

 

레플리카셋 생성

 

root@master:~/k8s_lab/controller/replicaset# kubectl apply -f rs-nginx.yaml
replicaset.apps/rs-nginx created
root@master:~/k8s_lab/controller/replicaset# k get rs,pods -o wide
NAME                       DESIRED   CURRENT   READY   AGE   CONTAINERS   IMAGES   SELECTOR
replicaset.apps/rs-nginx   3         3         3       23s   rs-nginx     nginx    app=rs-nginx

NAME                 READY   STATUS    RESTARTS   AGE   IP                NODE      NOMINATED NODE   READINESS GATES
pod/rs-nginx-ffbn8   1/1     Running   0          23s   192.168.189.76    worker2   <none>           <none>
pod/rs-nginx-nfb24   1/1     Running   0          23s   192.168.189.77    worker2   <none>           <none>
pod/rs-nginx-w5pjf   1/1     Running   0          23s   192.168.235.136   worker1   <none>           <none>

기존적은 replicaset을 생성해본다. 생성한후 replicas = 3에 맞게 3개의 pod가 시작시에 생성되어 있고 1개의 replicaset이 생성된 것을 볼 수 있다.

 

레플리카셋 삭제

 

root@master:~/k8s_lab/controller/replicaset# kubectl delete pod rs-nginx-ffbn8
pod "rs-nginx-ffbn8" deleted


root@master:~/k8s_lab/controller/replicaset# k get rs,pods -o wide
NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES   SELECTOR
replicaset.apps/rs-nginx   3         3         2       3m10s   rs-nginx     nginx    app=rs-nginx

NAME                 READY   STATUS              RESTARTS   AGE     IP                NODE      NOMINATED NODE   READINESS GATES
pod/rs-nginx-clfcp   0/1     ContainerCreating   0          12s     <none>            worker1   <none>           <none>
pod/rs-nginx-nfb24   1/1     Running             0          3m10s   192.168.189.77    worker2   <none>           <none>
pod/rs-nginx-w5pjf   1/1     Running             0          3m10s   192.168.235.136   worker1   <none>           <none>

앞서 생성한 3개의 pod중 하나를 삭제하면 replicaset이 바로 새로운 한개를 생성해서 전체 개수 3개를 유지하고 있다. (ContainerCreating이 새로 생성되는 pod)

 

레플리카셋 scale-up

 

root@master:~/k8s_lab/controller/replicaset# k get rs,pods -o wide (현재 상태 확인)
NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES   SELECTOR
replicaset.apps/rs-nginx   3         3         3       7m17s   rs-nginx     nginx    app=rs-nginx

NAME                 READY   STATUS    RESTARTS   AGE     IP                NODE      NOMINATED NODE   READINESS GATES
pod/rs-nginx-clfcp   1/1     Running   0          4m20s   192.168.235.137   worker1   <none>           <none>
pod/rs-nginx-nfb24   1/1     Running   0          7m18s   192.168.189.77    worker2   <none>           <none>
pod/rs-nginx-w5pjf   1/1     Running   0          7m18s   192.168.235.136   worker1   <none>           <none>


root@master:~/k8s_lab/controller/replicaset# kubectl scale rs rs-nginx --replicas=4 (replicas를 3개에서 4개로 동적으로 변경한다.)
replicaset.apps/rs-nginx scaled


root@master:~/k8s_lab/controller/replicaset# k get rs,pods -o wide (바로 확인해보면 4개를 맞추기위해 새로운 pod 1개를 생성한다.)
NAME                       DESIRED   CURRENT   READY   AGE     CONTAINERS   IMAGES   SELECTOR
replicaset.apps/rs-nginx   4         4         3       7m42s   rs-nginx     nginx    app=rs-nginx

NAME                 READY   STATUS              RESTARTS   AGE     IP                NODE      NOMINATED NODE   READINESS GATES
pod/rs-nginx-clfcp   1/1     Running             0          4m45s   192.168.235.137   worker1   <none>           <none>
pod/rs-nginx-d9hkz   0/1     ContainerCreating   0          4s      <none>            worker2   <none>           <none>
pod/rs-nginx-nfb24   1/1     Running             0          7m43s   192.168.189.77    worker2   <none>           <none>
pod/rs-nginx-w5pjf   1/1     Running             0          7m43s   192.168.235.136   worker1   <none>           <none>

기존 3개의 replicas에서 4개로 변경 요청을 하면 replicaset은 추가로 1개의 pod를 새로 생성하여 전체 replicas 4를 맞춘다.

 

-- The End --