Kubernetes Replica에 의한 스케일업

시스템 이중화를 위해 Replica라는 리소스를 사용한다. Replica는 Spec에서 정의한 복제본의 수를 자동 배치하고 유지(Pod가 정지했을 경우에 자동 복구)하는 기능을 가지고 있다.

yaml 파일을 이용한 Replica 실행

여기서도 yaml 파일에 설정을 작성을 해야 한다.

replicaset.yaml

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: helloworld
  labels:
    app: helloworld
spec:
  replicas: 5
  selector:
    matchLabels:
      app: helloworld
  template:
    metadata:
      labels:
        app: helloworld
    spec:
      containers:
        - name: helloworld
          image: gcr.io/google-samples/hello-app:1.0

이 yaml 파일의 replicas 부분으로 지정한 값에 따라 Pod가 복제된다. 이번 파일에서는 “5"로 되어 있기 때문에 “5"개의 Pod가 작성된다.

이 yaml 파일을 사용하여 Pod를 Replicaset으로 시작하려면 다음 명령을 실행한다.

kubectl apply -f replicaset.yaml

실행 결과:

% kubectl apply -f replicaset.yaml
replicaset.apps/helloworld created

replicaset이 생성되었는지 확인하기 위해 다음 명령을 실행한다.

kubectl get replicaset

실행 결과:

% kubectl get replicaset
NAME         DESIRED   CURRENT   READY   AGE
helloworld   5         5         5       27s
% kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
helloworld-22r5b   1/1     Running   0          45s
helloworld-9bkcr   1/1     Running   0          45s
helloworld-ft2b7   1/1     Running   0          45s
helloworld-ndsph   1/1     Running   0          45s
helloworld-zrsw4   1/1     Running   0          45s

replicaset이 생성되었음을 확인할 수 있으며, 5개의 Pod가 생성되었다고 표시되므로 Pod 목록을 보면 확실히 포드가 생성되었는지 확인할 수 있다. 또한 이러한 Pod는 모두 helloworld-[hash]와 같은 이름으로 만들어져 있는 것도 확인할 수 있다.

기동 중인 Pod의 개수를 늘리기

이렇게 작성한 기동중에 Pod의 개수를 늘리는 것도 가능하다. 이것은 kubectl scale 명령에서 --replicas 옵션을 추가하여 얻을 수 있다.

kubectl scale --replicas=[Pod 개수] replicaset/[replicaset명]

예로서 10개로 늘려 보겠다.

% kubectl scale --replicas=10 replicaset/helloworld
replicaset.apps/helloworld scaled

다시 replicaset을 목록을 확인해 보겠다.

% kubectl get replicaset
NAME         DESIRED   CURRENT   READY   AGE
helloworld   10        10        10      5m11s

Pod도 확인해 보자.

% kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
helloworld-22r5b   1/1     Running   0          5m36s
helloworld-26x7g   1/1     Running   0          76s
helloworld-9bkcr   1/1     Running   0          5m36s
helloworld-ft2b7   1/1     Running   0          5m36s
helloworld-ldfpk   1/1     Running   0          76s
helloworld-ndsph   1/1     Running   0          5m36s
helloworld-sjg5c   1/1     Running   0          76s
helloworld-smdhb   1/1     Running   0          76s
helloworld-xgl6m   1/1     Running   0          76s
helloworld-zrsw4   1/1     Running   0          5m36s

실행 결과를 보면 Pod의 개수가 10개로 증가한 것을 확인할 수 있다.

Pod가 정지가 되었을 때

다음은 기동한 Pod를 하나를 강제로 정지를 시켜 보려고 한다. 이 때의 동작으로서는 10개 있는 중 1개의 Pod가 정지되었다고 replicaset가 판단하여, Pod를 다시 생성하는 동작을 하게 된다. 이때 정지 전의 것과는 다른 해시가 할당되어, 1개의 Pod가 다른 해시로 새로 만들어지 진다.

테스트로 아래와 같이 helloworld-22r5b를 정지 시켜 보자.

% kubectl delete pod helloworld-22r5b
pod "helloworld-22r5b" deleted

Pod의 상태를 확인한다.

% kubectl get pod
NAME               READY   STATUS    RESTARTS   AGE
helloworld-26x7g   1/1     Running   0          6m9s
helloworld-9bkcr   1/1     Running   0          10m
helloworld-ft2b7   1/1     Running   0          10m
helloworld-ldfpk   1/1     Running   0          6m9s
helloworld-ndsph   1/1     Running   0          10m
helloworld-sjg5c   1/1     Running   0          6m9s
helloworld-smdhb   1/1     Running   0          6m9s
helloworld-xgl6m   1/1     Running   0          6m9s
helloworld-xmxbx   1/1     Running   0          16s <<<<< 신규 생성
helloworld-zrsw4   1/1     Running   0          10m

이 경우 중지된 helloworld-22r5b 대신에 helloworld-xmxbx이 자동으로 생성되었음을 확인할 수 있다.




최종 수정 : 2022-09-08