본문 바로가기
네트워크/k8s

[k8s] 35. StatefulSet

by Lauren X Ming 2021. 2. 25.

StatefulSet

  • 어플리케이션 종류에는 Stateless Application과 Stateful Application이 있음

Stateless Application

  • 대표적으로 Web Server
  • APACHE, NGINX, IIS가 있음
  • App이 여러 개 배포돼도 똑같은 서비스 역할을 함
  • App이 죽으면 같은 역할을 하는 Service를 하는 App을 복사하고 이름은 중요하지 않음
  • Volume이 꼭 필요하지 않음, 필요하면 Volume 하나에 App들을 연결하면 됨
  • 사용자가 접속한 네트워크 트래픽은 여러 App에 분산됨
  • ReplicaSet이 딱이네!

Stateful Application

  • 대표적으로 Database
  • mongoDB, MaraDB, redis가 있음
  • 각각의 App마다 자신의 역할이 있음
  • 그림은 mongoDB 예시로 Primary가 메인, Primary가 죽으면 Arbiter가 감지하여 Secondary는 보조역할
  • App이 죽으면 반드시 그 역할을 하는 App이 만들어지고 이름도 똑같이 만들어져야 함
  • 각각의 역할이 다른만큼 Volume을 각각 써야함
  • 사용자가 접속한 네트워크 트레픽은 각 App에 특징에 맞게 들어와야 함
    • Read/Write으로 들어온 네트워크는 App1에, Read는 App2에, App3은 App 감시역할이니 App1, 2에 연결
  • StatefulSet이 딱이네!

StatefulSet

  • StatefulSet은 컨트롤러임

StatefulSet Controller

ReplicaSet vs. StatefulSet

  • replicas에 따른 파드 생성 시
    • ReplicaSet: 임의로 뒤에 이름이 붙음
    • StatefulSet: 뒤에 순서대로 숫자가 붙음
  • replicas 삭제 시
    • ReplicaSet: 새로운 이름이 붙어서 생성
    • StatefulSet: 기존이름 그대로 생성
  • replicas를 0으로 하면
    • ReplicaSet: 모든 파드가 동시에 삭제
    • StatefulSet: 인덱스가 높은 순으로 순차적으로 삭제

PersistentVolumeClaim, Headless Service

ReplicaSet vs. StatefulSet

  • 파드에 Volume을 연결하려고 하면
    • ReplicaSet: PVC 별도로 직접 생성하고 template의 persistentVolumeClaim에 지정해서 연결
    • StatefulSet: template을 통해 파드 생성하고 추가적으로 volumeClaimTemplates이 있어 PVC가 동적으로 생성되고 연결됨
  • replicas를 3으로 하면
    • ReplicaSet: 모든 파드들이 똑같은 PVC에 연결
    • StatefulSet: volumeClaimTemplates으로 파드가 추가될 때마다 새로운 PVC가 생성되어서 연결, 파드마다 각자의 데이터 저장
      • StatefulSet에서 파드가 죽고 다시 생성되면, 기존의 연결됐던 PVC에 파드가 연결됨
  • PVC와 파드의 위치
    • ReplicaSet은 PVC가 node1에 만들어지면 PVC에 연결된 파드도 node1에 있어야 함
      • template안에 nodeSelector: "node1" 이 필요한 이유
    • StatefulSet은 동적으로 파드와 PVC가 같은 노드에 만들어져서 알아서 모든 노드에 균등하게 배포
  • replicas를 0으로 하면
    • ReplicaSet은 파드가 동시에 전부 삭제되지만 PVC는 삭제되지 않고 삭제하려면 수동으로 삭제해야함
    • StatefulSet에서 파드는 순차적으로 삭제되지만 PVC는 삭제되지 않고 삭제하려면 수동으로 삭제해야함

Headless Service

  • StatefulSet을 만들 때, serviceName: "Headless" 속성을 넣을 수 있음
  • 이 이름과 매칭되는 Headless 이름의 서비스를 만들게 되면, 파드의 예측가능한 도메인 이름이 만들어 짐
  • Internal 서버의 특정 파드 입장에서 원하는 StatefulSet의 파드와 연결 가능
    • 그림에서 Pod-2.Headless로 Pod 연결
  • 상황에 따라 StatefulSet의 파드를 선택해서 접속을 할 수 있음

출처

인프런 - 대세는 쿠버네티스

'네트워크 > k8s' 카테고리의 다른 글

[k8s] 37. Ingress - Nginx  (0) 2021.02.25
[k8s] 36. StatefulSet - 실습  (0) 2021.02.25
[k8s] 34. Kubernetes Dashboard - 실습  (0) 2021.02.24
[k8s] 33. Kubernetes Dashboard  (0) 2021.02.24
[k8s] 32. Authorization - 실습  (0) 2021.02.24