반응형

 

 

 

 

레플리카셋

레플리카셋의 목적은 레플리카 파드 집합의 실행을 항상 안정적으로 유지하는 것이다. 이처럼 레플리카셋은 보통 명시된 동일 파드 개수에 대한 가용성을 보증하는데 사용한다.

 

레플리카셋의 작동 방식

레플리카셋을 정의하는 필드는 획득 가능한 파드를 식별하는 방법이 명시된 셀렉터, 유지해야 하는 파드 개수를 명시하는 레플리카의 개수, 그리고 레플리카 수 유지를 위해 생성하는 신규 파드에 대한 데이터를 명시하는 파드 템플릿을 포함한다. 그러면 레플리카셋은 필드에 지정된 설정을 충족하기 위해 필요한 만큼 파드를 만들고 삭제한다. 레플리카셋이 새로운 파드를 생성해야 할 경우, 명시된 파드 템플릿을 사용한다.

레플리카셋은 파드의 metadata.ownerReferences 필드를 통해 파드에 연결되며, 이는 현재 오브젝트가 소유한 리소스를 명시한다. 레플리카셋이 가지고 있는 모든 파드의 ownerReferences 필드는 해당 파드를 소유한 레플리카셋을 식별하기 위한 소유자 정보를 가진다. 이 링크를 통해 레플리카셋은 자신이 유지하는 파드의 상태를 확인하고 이에 따라 관리 한다.

레플리카셋은 셀렉터를 이용해서 필요한 새 파드를 식별한다. 만약 파드에 OwnerReference이 없거나 OwnerReference가 컨트롤러(Controller) 가 아니고 레플리카셋의 셀렉터와 일치한다면 레플리카셋이 즉각 파드를 가지게 될 것이다.

 

레플리카셋은 언제 사용하는가?

레플리카셋은 지정된 수의 파드 레플리카가 항상 실행되도록 보장한다. 그러나 디플로이먼트는 레플리카셋을 관리하고 다른 유용한 기능과 함께 파드에 대한 선언적 업데이트를 제공하는 상위 개념이다. 따라서 우리는 사용자 지정 오케스트레이션이 필요하거나 업데이트가 전혀 필요하지 않은 경우라면 레플리카셋을 직접적으로 사용하기 보다는 디플로이먼트를 사용하는 것을 권장한다.

이는 레플리카셋 오브젝트를 직접 조작할 필요가 없다는 것을 의미한다. 대신 디플로이먼트를 이용하고 사양 부분에서 애플리케이션을 정의하면 된다

 

 

Replicaset 과 ReplicationController 의 차이점

  • 복제 Pod를 만드는 역활은 둘다 똑같다.
  • Replicaset은 selector 기능으로 Label을 입력하여 Pods들을 보기쉽게, 효율적으로 관리할 수 있습니다. 

 

 

 

레플리카셋 생성

# 레플리카셋 YAML파일 생성
jinsu@jinsu:~$ cat replicaset.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: mynginx-rs
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mynginx-rs
  template:
    metadata:
      labels:
        app: mynginx-rs
    spec:
      containers:
      - name: nginx
        image: nginx
jinsu@jinsu:~$ 

jinsu@jinsu:~$ kubectl apply -f replicaset.yaml
replicaset.apps/mynginx-rs created
jinsu@jinsu:~$

# 레플리카셋 생성 확인
jinsu@jinsu:~$ kubectl get replicaset
NAME         DESIRED   CURRENT   READY   AGE
mynginx-rs   1         1         1       28s
jinsu@jinsu:~$
jinsu@jinsu:~$ kubectl get rs
NAME         DESIRED   CURRENT   READY   AGE
mynginx-rs   1         1         1       32s
jinsu@jinsu:~$

# 레플리카셋 pod 1개 생성 확인
jinsu@jinsu:~$ kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
mynginx-rs-hlw2j   1/1     Running   0          7m16s
jinsu@jinsu:~$



# 레플리카셋 설정값 확인
jinsu@jinsu:~$ kubectl get rs mynginx-rs -oyaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"ReplicaSet","metadata":{"annotations":{},"name":"mynginx-rs","namespace":"default"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"mynginx-rs"}},"template":{"metadata":{"labels":{"app":"mynginx-rs"}},"spec":{"containers":[{"image":"nginx","name":"nginx"}]}}}}
  creationTimestamp: "2022-08-14T07:40:17Z"
  generation: 1
  name: mynginx-rs
  namespace: default
  resourceVersion: "13994"
  selfLink: /apis/apps/v1/namespaces/default/replicasets/mynginx-rs
  uid: ad48f6a2-ef69-403b-b96a-5cefa8d94372
spec:
  replicas: 1
  selector:
    matchLabels:
      app: mynginx-rs
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: mynginx-rs
    spec:
      containers:
      - image: nginx
        imagePullPolicy: Always
        name: nginx
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  fullyLabeledReplicas: 1
  observedGeneration: 1
  readyReplicas: 1
  replicas: 1
jinsu@jinsu:~$

# 레플리카셋에 pod 생성을 2개로 설정(spec: replicas: 2)
jinsu@jinsu:~$ kubectl get rs mynginx-rs -oyaml
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  annotations:
    kubectl.kubernetes.io/last-applied-configuration: |
      {"apiVersion":"apps/v1","kind":"ReplicaSet","metadata":{"annotations":{},"name":"mynginx-rs","namespace":"default"},"spec":{"replicas":1,"selector":{"matchLabels":{"app":"mynginx-rs"}},"template":{"metadata":{"labels":{"app":"mynginx-rs"}},"spec":{"containers":[{"image":"nginx","name":"nginx"}]}}}}
  creationTimestamp: "2022-08-14T07:40:17Z"
  generation: 2
  name: mynginx-rs
  namespace: default
  resourceVersion: "14633"
  selfLink: /apis/apps/v1/namespaces/default/replicasets/mynginx-rs
  uid: ad48f6a2-ef69-403b-b96a-5cefa8d94372
spec:
  replicas: 2
  
# 설정값을 변경하자마자 pod가 2개로 생성
jinsu@jinsu:~$ kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
mynginx-rs-hlw2j   1/1     Running   0          13m
mynginx-rs-t8wx2   1/1     Running   0          10s
jinsu@jinsu:~$ 

jinsu@jinsu:~$ kubectl get rs
NAME         DESIRED   CURRENT   READY   AGE
mynginx-rs   2         2         2       13m
jinsu@jinsu:~$

 

레플리카셋 삭제

# 현재 동작중인 레플리카셋 확인
jinsu@jinsu:~$ kubectl get rs
NAME         DESIRED   CURRENT   READY   AGE
mynginx-rs   2         2         2       42m
jinsu@jinsu:~$ 

# 레플리카셋 삭제
jinsu@jinsu:~$ kubectl delete rs mynginx-rs
replicaset.apps "mynginx-rs" deleted
jinsu@jinsu:~$ 

jinsu@jinsu:~$ kubectl get rs
No resources found in default namespace.
jinsu@jinsu:~$

 

 

레플리카셋 Scale 수정

# Replicaset 만들었던 Yaml 파일 수정하여 replace
kubectl replace -f replicaset-definition.yaml

# scale 명령으로 레플리카셋 3에서 6으로 수정
kubectl scale --replicas=6 -f replicaset-definition.yaml

# scale 명령으로 name을 지정해서 수정
kubectl scale --replicas=6 replicaset myapp-replicaset

 

 

동작중인 레플리카셋 정보를 수정 및 yaml로 생성

# 현재 동작중인 replicaset을 edit으로 수정
kubectl edit replicaset new-replica-set

# 현재 동작중인 replicaset을 yaml파일로 변경
kubectl get replicaset new-replica-set -o yaml > new-replica-set.yaml

 

 

 

 

 

참고자료

https://kubernetes.io/ko/docs/concepts/workloads/controllers/replicaset/

 

반응형

+ Recent posts