Stateless Application VS Stateful Application
| Stateless Application | Stateful Application |
---|
역할 | 단순 복제 | 각자 역할을 가짐 |
재생성 | 같은 서비스의 역할을 하는 앱을 생성 | |
앱 이름 달라도 상관 없음 | Down된 앱과 같은 앱을 생성 | |
앱 이름 같아야 함 | | |
Volume | 하나의 Volume을 공유하여 사용 가능 | 앱 각자의 Volume을 사용해야 함 |
네트워크 | 앱들이 트래픽을 균등하게 나누어 가짐 | 각 앱의 특징에 맞게 트래픽을 가짐 |
예시 | Apache, Nginx | MariaDB, Redis, MongoDB |
Controller | ReplicaSet | StatefulSet |
Service | Service | Headless Service |
StatefulSet Controller
| ReplicaSet | StatefulSet |
---|
pod 이름 | {Pod 이름}-{랜덤 값} | {Pod 이름}-{index} |
동시 생성 | replicas만큼 동시에 Pod 생성 | replicas만큼 순서대로 Pod 생성 |
동시 삭제 | replicas만큼 동시에 Pod 삭제 | replicas만큼 순서대로 Pod 삭제 |
PVC 생성 | PVC 직접 생성 해야 함 | volumeClaimTemplate을 통해 PVC 동적 생성 |
단일 PVC 여부 | Pod들이 하나의 PV와 PVC를 공유하여 사용 | Pod마다 PVC와 PV가 생성 |
Service | Pod의 이름을 예측하기 어렵기 때문에 HeadlessService 연결하기 힘듬 | Pod의 이름을 예측할 수 있기 때문에 HeadlessService로 Pod에 접근 가능 |
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: stateful-db
spec:
replicas: 1
selector:
matchLabels:
type: db
template:
metadata:
labels:
type: db
spec:
containers:
- name: container
image: something
apiVersion: apps/v1
kind: statefulSet
metadata:
name: stateful-pvc
spec:
replicas: 1
selector:
matchLabels:
type: db2
serviceName: "stateful-headless"
template:
metadata:
labels:
type: db2
spec:
containers:
- name: container
image: something
volumeMounts:
- name: volume
mountPath: /applog
volumeClaimTemplate:
- metadata:
name: volume
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1G
storageClassName: "fast"
apiVersion: v1
kind: Service
metadata:
name: stateful-headless
spec:
selector:
type: db2
ports:
- port: 80
targetPort: 8080
clusterIP: None