ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 클라우드: 쿠버네티스 레플리카셋(Replica Set) 실습하기
    K8S 2021. 2. 5. 01:58

     

    우선 포드는 기본적으로 여러 개의 컨테이너를 추상화하여 하나의 어플리케이션으로 동작한다.

     

    외부 사용자가 어플리케이션으로 요청을 보내면 쿠버네티스에서는 이러한 요청을 동일한 여러개의 포드로 분배하여 전달한다. 

     

     

    그렇다면 동일한 여러개의 포드는 어떤식으로 생성할 수 있을까?

     

     

    yaml 파일에 하나의 포드를 더 정의해서 사용하는 방법은 매우 비효율적이다.

     

    워커 노드가 다운되거나 어떠한 이유로 포드가 삭제된다면 해당 포드를 다시 생성하기는 어렵다. 

     

    그래서 이러한 문제점을 해결해주는 것이 레플리카셋이다. 

     

    레플리카 셋이 하는 일은 다음과 같다.

     

     

    ●  동일한 포드가 정해진 수 만큼 실행되도록 한다.

     

    ●  노드에 장애 발생시, 다른 노드에서 포드를 다시 생성한다.

     

     

    이렇게 레플리카셋을 이용하여 일정한 수의 동일한 포드를 생성하고 유지할 수 있다.

     

    레플리카셋의 사용과 동작원리를 알아보기 위해 다음과정을 실습한다. 

     

    다음과 같이 replicaset을 이용해서 yaml파일을 만든다. 

     

     

     

    <replica-nginx.yaml>

    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: replicaset-nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-nginx-pods-label
      template:
        metadata:
          name: my-nginx-pod
          labels:
            app: my-nginx-pods-label
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    

    (yaml파일에 대한 내용은 뒤에서 알아보겠다)

     

    metadata.name : 만들어진 replicaset의 name

    spec.replicas : 동일한 포드를 몇개 유지시킬 것인지 설정

    spec.template : 만들어질 포드에 대한 내용을 기술하며 보통 포드 스펙, 포드 템플릿이라고 한다.

    (template  밑의 내용은 이전 포스팅에서 사용했던 컨테이너와 유사하다.) 

     

     

     

     

    위 yaml파일을 클러스터에 적용해주면

     

    kubectl apply -f replica-nginx.yaml

     

    다음과 같이 포드가 3개의 동일한 포드가 생성되었음을 알 수 있다. 

     

     

     

     

     

     

    다음 명령어를 통해 생성된 replicaset의 정보를 볼 수 있다.

     

    kubectl get rs

     

     

     

     

     

    이번에는 위에서 생성한 yaml파일에서 replicas를 4로 변경한 후  클러스터에 적용시킨다.

     

    쿠버네티스는 이미 생성된 리소스의 속성을 변경하는 기능을 제공하기 때문에

     

    기존의 replicaset을 삭제하지 않고, 다시 다음 명령어를 통해 적용시켜 준다.

     

    kubectl apply -f replica-nginx.yaml

     

     

     

    configured 되었다고 나오면 변경된 속성이 잘 적용되었다는 것

     

     

     

     

     

    만들어진 replica set을 삭제하고 싶을때는 다음 명령어를 따른다.

     

    kubectl delete rs replicaset-nginx

     

    또는

     

    kubectl delete -f replica-nginx.yaml

     

     

     

     

     

    위와 같은 실습을 거쳐서 레플리카셋의 사용법은 알아보았지만 어떠한 원리로 레플리카셋이 동작하는 것일까?

     

    레플리카셋은 라벨 셀렉터(Label selector)를 이용해서 위와 같은 동작을 수행한다. 

     

     위에서 실습했던 yaml파일을 통해서 알아본다.

     

     

     

    <replica-nginx.yaml>

    apiVersion: apps/v1
    kind: ReplicaSet
    metadata:
      name: replicaset-nginx
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: my-nginx-pods-label
      template:
        metadata:
          name: my-nginx-pod
          labels:
            app: my-nginx-pods-label
        spec:
          containers:
          - name: nginx
            image: nginx:latest
            ports:
            - containerPort: 80
    

     

    먼저 template을 기준으로 위는 replicaset에 대한 내용, 밑은 pod에 대한 내용이다.

     

    레플리카 셋은 label selector를 이용해서 생성할 포드를 결정짓는다. 

     

    이후 레플리카 셋은  레이블이 my-nginx-pods-label인 포드를 찾는다.

     

    만약 존재한다면 레이블이 my-nginx-pods-label인 포드가 replicas에서 정의된 수만큼 존재할때까지 

    레이블이 my-nginx-pods-label인 포드를 생성한다.

     

    하지만 만약 존재하지 않는다면 template에 정의되어 있는 pod를 생성한다. 

     

     

     

     

    다음과 같은 경우를 생각해보자

     

    먼저 my-nginx-pod-label이라는 라벨을 가진 my-nginx-pod 포드를 먼저 생성한후 위에서 정의한 레플리카셋을 적용시킨다.

     

    < nginx-pod.yaml >

    apiVersion: v1
    kind: Pod
    metadata:
      name: my-nginx-pod
      labels:
        app: my-nginx-pods-label
    spec:
      containers:
      - name: my-nginx-container
        image: nginx:latest
        ports:
        - containerPort: 80
          protocol: TCP
    

     

    kubectl apply -f nginx-pod.yaml

     

     

     

    포드의 label을 확인하고 싶을때 다음 명령어를 따른다.

     

    kubectl get pods --show-labels

     

     

     

     

     

    이후 위에서 만들어준 replica-nginx.yaml을 apply했을 때 다음과 같은 포드 상태를 알 수 있다.

     

     

    이는 replicaset의 label  selector을 통해 처음 생성된 my-nginx-pod와 동일한 포드 3개가 더 생성되었음을 알 수 있다. 

     

     

     

     

    그리고 여기서 포드를 my-nginx-pod를 하나 지운다.

     

    이후 kubectl get pods를 통해 상태를 확인해보면

     

     

    포드하나를 지우자마자 replicaset에 의해 포드 하나가 더 생성되는 것을 알 수 있다.

     

     

     

     

     

    용찬호 개발자님의 "시작하세요! 도커/쿠버네티스"를 인용해서 작성했습니다.

    반응형

    댓글

Designed by Tistory.