k8s 클러스터에 replicaset 생성하기

최초작성일 [2020.03.14]

마이크로서비스에서는 여러 개의 동일한 컨테이너를 생성한 뒤 외부 요청이 각 컨테이너에 적절히 분배될 수 있어야 한다.쿠버네티스에서는 여러 개의 동일한 컨테이너를 생성하기 위해 리플리카셋(replicaset)이라는 오브젝트를 사용한다. replicaset은 항상 정해진 수 만큼의 pod를 유지하며 노드에 장애가 발생하여 pod를 사용할 수 없을 경우 다른 노드에서 pod를 다시 생성하는 등의 pod 관리를 책임진다.

1. replicaset 생성하기

Nginx pod를 생성하는 replicaset을 만들어보자. 아래는 nginx.yml 파일의 내용이다.

apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: replicaset-nginx
spec:
  replicas: 3

  selector:
    matchLabels:
      app: nginx

  template:
    metadata:
      name: pod-nginx
      labels:
        # selector의 matchLabels과 동일함.
        app: nginx
    spec:
      containers:
        - name: pod-nginx
          image: nginx:latest
          ports:
            - containerPort: 80

attribute

role

kind

리소스 종류.

$ kubectl api-resources 명령어 결과의 KIND 필드에서 확인할 수 있다.

metadata

리소스의 이름, 라벨 등의 부가정보.

spec

리소스 생성을 위한 명세.

spec.relicas

유지할 pod의 수.

spec.selector

생성해야 할 pod의 라벨.

spec.template

pod를 생성할 때 사용할 템플릿. pod template으로도 불린다.

spec.containers

pod에 들어갈 컨테이너.

pod에는 1개 이상의 컨테이너가 생성될 수 있으므로 여러개 정의할 수 있다.

ports.containerPort

컨테이너가 사용하는 포트번호.

작성한 리소스를 클러스터에 생성하고 확인해보자.

$ kubectl apply -f nginx.yml
replicaset.apps/replicaset-nginx created

$ kubectl get pods
replicaset-nginx-b2dsp        1/1     Running            0          10s
replicaset-nginx-j6zcj        1/1     Running            0          10s
replicaset-nginx-v2ztm        1/1     Running            0          10s

spec.relicas 에 정의된 갯수에 맞게 pod가 생성된 것을 볼 수 있다. 위의 pod 3개는 replicaset에 의해 만들어진 것이므로 replicaset을 삭제하거나 수정하면 pod에도 반영한다.

$ kubectl get pods
replicaset-nginx-b2dsp        1/1     Running            0          5m
replicaset-nginx-j6zcj        1/1     Running            0          5m
replicaset-nginx-v2ztm        1/1     Running            0          5m

$ kubectl delete replicaset replicaset-nginx
replicaset.apps "replicaset-nginx" deleted

2. label selector

replicaset은 pod와 '느슨한 연결'을 가지고 있는데, 이 느슨한 연결은 label selector로 이뤄져있다. label은 사용자 관점에서 리소스를 식별하는 데 쓰일 뿐만 아니라 오브젝트들이 서로를 찾아야 할 때 쓰기도 한다. replicaset은 spec.selector.matchLabels 속성에 정의된 라벨을 통해 생성해야하는 pod를 찾는다.

위에서 생성한 replicaset-nginx의 경우 app: nginx 라는 라벨을 가진 pod의 갯수가 replicas 속성에 정의된 숫자에 일치하지 않으면 template의 내용으로 pod를 생성한다. replicaset을 처음 생성했을 때는 라벨과 일치하는 pod가 아예 없었기 때문에 3개를 생성했다.

replicas속성을 3에서 4로 바꾸고 다시 $ kubectl apply -f nginx.yml을 실행했다.

$ kubectl apply -f nginx.yml 
replicaset.apps/replicaset-nginx configured

$ kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
replicaset-nginx-4zqvc   0/1     ContainerCreating   0          4s
replicaset-nginx-b2dsp   1/1     Running             0          40m
replicaset-nginx-j6zcj   1/1     Running             0          40m
replicaset-nginx-v2ztm   1/1     Running             0          40m

새로운 pod 1개가 만들어졌다. app: nginx 라벨을 가진 pod 3개가 이미 있기 때문에 1개만 새로 생성된 것이다.

반대로 replicaset에 의해 만들어진 pod를 직접 삭제하면 어떻게 될까?

$ kubectl get pods
NAME                     READY   STATUS              RESTARTS   AGE
replicaset-nginx-4zqvc   0/1     ContainerCreating   0          4s
replicaset-nginx-b2dsp   1/1     Running             0          40m
replicaset-nginx-j6zcj   1/1     Running             0          40m
replicaset-nginx-v2ztm   1/1     Running             0          40m

$ kubectl delete pods replicaset-nginx-b2dsp
pod "replicaset-nginx-b2dsp" deleted

$ kubectl get pods                          
NAME                     READY   STATUS    RESTARTS   AGE
replicaset-nginx-4zqvc   1/1     Running   0          12m
replicaset-nginx-bzg4z   1/1     Running   0          28s
replicaset-nginx-j6zcj   1/1     Running   0          53m
replicaset-nginx-v2ztm   1/1     Running   0          53m

replicaset-nginx-b2dsp라는 pod를 직접 삭제했더니 replicaset-nginx-bzg4z라는 pod를 새로 생성했다.

이번에는 pod의 라벨을 직접 수정하면 어떻게 될지 확인해보자. 아래 커맨드를 실행하여 replicaset-nginx-4zqvc 라는 pod의 label 속성을 삭제해보겠다. $ kubectl edit 을 실행하면 S3에서 관리하는 pod의 상태파일을 터미널에서 열어준다.

$ kubectl edit pods replicaset-nginx-4zqvc
# Please edit the object below. Lines beginning with a '#' will be ignored,
# and an empty file will abort the edit. If an error occurs while saving this file will be
# reopened with the relevant failures.
#
apiVersion: v1
kind: Pod
metadata:
  annotations:
    cni.projectcalico.org/podIP: 100.100.132.202/32
   kubernetes.io/limit-ranger: 'LimitRanger plugin set: cpu request for container
     pod-nginx'
 creationTimestamp: "2020-03-14T09:30:52Z"
 generateName: replicaset-nginx-
 name: replicaset-nginx-4zqvc

--show-labels 옵션으로 pod들의 라벨을 확인해보자. app=nginx 라벨을 가진 pod가 1개 유실된만큼 새로운 pod 1개를 생성했다. 라벨이 삭제된 pod는 <none>이라는 라벨을 갖게 되고 replicaset-nginxselector.matchLabels의 값과 일치하지 않으므로 replicaset-nginx가 더 이상 관리하지 않는다. 따라서 replicaset-nginx를 수정하거나 삭제해도 라벨이 삭제된 pod는 아무런 영향을 받지 않는다.

$ kubectl get pods --show-labels
NAME                     READY   STATUS    RESTARTS   AGE     LABELS
replicaset-nginx-4zqvc   1/1     Running   0          35m     <none>
replicaset-nginx-bzg4z   1/1     Running   0          23m     app=nginx
replicaset-nginx-j6zcj   1/1     Running   0          75m     app=nginx
replicaset-nginx-qwxxr   1/1     Running   0          3m39s   app=nginx
replicaset-nginx-v2ztm   1/1     Running   0          75m     app=nginx

출처

Last updated