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"
이 필요한 이유
- template안에
- StatefulSet은 동적으로 파드와 PVC가 같은 노드에 만들어져서 알아서 모든 노드에 균등하게 배포
- ReplicaSet은 PVC가 node1에 만들어지면 PVC에 연결된 파드도 node1에 있어야 함
- 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 |