갬미의 성장일기
Day 56 - 3tier 구성하기, StatefulSet 본문
오늘 배운 내용
- StatefulSet
- 지금까지 배운 내용 + StatefulSet 을 사용해서 3tier 구성하기
StatefulSet
pod는 두가지 종류가 있다
1. stateless - session 정보가 없는 pod
2. stateful - session 정보를 가진 pod
pod를 생성하는 방법중 statefulset이 있다
statefulset으로 만들어진 pod는 stateful 상태가 된다
1. RS -> stateless
2. Deployset -> stateless
3. DaemonSet -> stateless
4. StatefulSet -> stateful
파드의 이름이 고정되어 순서대로 생성되고 삭제 되기때문에 주로 파드가 만들어지는 순서나 이름을 예측할 필요가 있는 시스템에서 많이 사용한다
nginx-1 / nginx-2 / nginx-3 ....
- pod를 삭제하면 똑같은 이름을 가진 pod가 생기고 같은 역할을 함
statefulset은 volumeClaimTemplates 기능을 사용해 pvc를 자동으로 생성할수있고, 이때 생성된 pvc가 사라지지 않는 한 같은 이름을 가진 pod는 pvc를 공유한다
pod이름이 web-0, web-1 로 생성되었다
저절로 pvc disk가 생김
pvc가 사라지기 전까지 같은 이름의 pod는 같은 pvc를 공유하므로, pod가 죽었다가 같은 이름을 가진 새로운 pod가 생겼다고 하더라도 pvc에 저장된 data는 계속해서 남아있다
DB 시스템은 거의 대부분 statefulset을 이용하며 was SessionAffinity에도 사용할 수 있다
was의 session은 어디에 있을까?
- was의 메모리에 있음 login session 정보는 was가 가지고 있다
- 메모리에 가지고 있다 = 메모리 DB에 가지고 있다 --> 이걸 빼서 완벽한 sesssion 보존을 함
메모리에 가지고있는 경우 was pod가 꺼지면 모두 사라짐
--> 세션처리용 DB를 따로 저장한다
모든 세션은 pod가 아닌 memory DB가 가지고 있다
특히 Auto Scale을 사용하는 경우 was pod 가 생겼다가 줄었다가 하기 때문에 이 방법이 필수로 사용된다
정리하자면
pod가 session을 가지고있으면 stateful -> pod가 죽으면 세션이 모두 사라진다
따라서 pod에 session을 없애고 (stateless로 만들고) 세션이 저장되는 메모리는 따로 session용 DB에 따로 저장하여 세션 정보는 따로 저장하도록 한다
+ headless
statefulset는 pod를 clusterIP: None으로 생성한다
이는 외부에 statefulset을 노출하지 않겠다는 말인데 ip를 가지지 않기 때문에 클러스터 내부적에서 도메인 이름으로 통신할 수 있다
CoreDNS에서 클러스터 내에서 도메인이름으로 pod와 통신 가능하게하며, pod는 podname.svcname으로 도메인 통신 가능하다
StatefulSet 실습
https://cloud.google.com/kubernetes-engine/docs/concepts/statefulset?hl=ko
stateful smaple.yml
apiVersion: v1
kind: Service
metadata:
name: nginx
labels:
app: nginx
spec:
ports:
- port: 80
name: web
clusterIP: None # headless
selector:
app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
name: web
spec:
serviceName: "nginx"
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: nginx
image: k8s.gcr.io/nginx-slim:0.8
ports:
- containerPort: 80
name: web
volumeMounts:
- name: www
mountPath: /usr/share/nginx/html
volumeClaimTemplates:
- metadata:
name: www
spec:
accessModes: [ "ReadWriteOnce" ]
resources:
requests:
storage: 1Gi
replicas를 줄이면 2->1->0 지워진다
다시 개수를 늘리면 0>1>2>... 순으로 만들어짐
pod-name.svc-name 으로 원하는 pod에 접근가능 (같은 cluster 안에서)
ex. ping mysql-0.mysql-svc
미니과제
StatefulSet으로 DB 파드를 만들고 3tier 구성하기
- ingress 사용 X
Initializing mysql directory error 발생시 다음 참고
다음 추가
image: mysql:5.7
args:
- "--ignore-db-dir=lost+found"
오늘의 회고
- 스테이트풀셋 ,, 머리가 터져버리는줄 알았다 지금 다시 정리해보니까 나름 괜찮아보이기도 하고,,, 내일 또 다시 실습해보기로 했다!
- 야물파일은 git에 올린다 ..
'Cloud > Cloud 공부일기' 카테고리의 다른 글
Day 58 - JAVA, Gradle 설치, CICD 준비 (0) | 2022.04.01 |
---|---|
Day 57 - full container 3tier 구성하기 (2) | 2022.03.31 |
Day 55 - 3tier 구성하기, VPC Peering, CronTab (0) | 2022.03.29 |
Day 54 - 3tier 구성하기, NAT gateway (2) | 2022.03.28 |
Day 53 - Bastion host, BGP, VPN (0) | 2022.03.25 |