쿠버네티스 - DB를 파드로?
업데이트:
DB를 쿠버네티스에서 사용하려면 어떻게 하는가?
컨테이너는 재시작 시, 재시작 이전의 데이터가 유지되지 않는다.
따라서 데이터베이스와 같이 Stateful해야 하는 서비스의 경우, 볼륨을 외부 파일 시스템에 마운트해 상태를 유지시킬 수 있다.
도커에서의 컨테이너 볼륨 마운트
도커에서는 ‘-v {외부 볼륨}:{컨테이너 속 내부 볼륨}’의 형태로 컨테이너 실행 시 마운트할 볼륨을 지정할 수 있다.
1
2
3
docker run --name {name} -v {외부 볼륨}:{컨테이너 속 볼륨} -d -p {ext port}:{int port} {image}:{version}
예) docker run --name mongo -v C:\\mongo-mount:/data/db -d -p 27017:27017 wichan-mongo:0.0.2
이 경우 컨테이너가 종료되더라도, 재시작 시 mount 경로를 참조하게 하면 이어서 서비스 가능하기 때문에 알맞다.
k8s에서의 파드(컨테이너) 볼륨 마운트
k8s도 결국은 container를 구동하는 툴이기 때문에, 노드에 파드의 볼륨을 마운트하여 상태를 유지할 수 있다.
다만, replicaset 기능을 사용하면 추가적인 고려가 필요하다.
같은 볼륨을 마운트하는 replica가 여러개 생길 경우, 충돌이 발생한다.
참조1: https://bcho.tistory.com/1306
참조2: https://velog.io/@hoonki/%EC%BF%A0%EB%B2%84%EB%84%A4%ED%8B%B0%EC%8A%A4k8s-Persistent-Storage%EB%9E%80
k8s에서 DB 배포를 시도해보자
참조: https://zzsza.github.io/development/2019/01/27/kubernetes-statefulset/
Deployment 로 등록해보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
apiVersion: apps/v1
kind: Deployment # deployment > replicaset > pod
metadata:
name: mongo-deployment # deployment's name
labels:
app: mongo # resource에 label을 달 수 있음.
spec: # deployment의 spec 정의
replicas: 4 # 4개의 레플리카 파드 생성
selector: # 디플로이먼트가 관리할 파드를 찾는 방법.
matchLabels: # pod 중 app=mongo 라벨을 가진 파드를 선택
app: mongo
template: # 생성되는 pod들의 meta, spec을 정의
metadata:
labels:
app: mongo # pod에 app=mongo 라벨을 붙임
spec:
containers: # 컨테이너 하나 생성
- name: mongo # name 필드의 값 mongo
image: mongo:latest # 최신 mongo 이미지 사용
ports:
- containerPort: 27017 # 컨테이너 포트 지정
1
kubectl apply -f mongo-deployment.yaml
Statefulset 으로 등록해보기
statefulset으로 mongo 파드를 생성해보자.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
kind: StatefulSet # statefulset 생성
apiVersion: apps/v1 # statefulset은 apps/v1 부터 지원함
metadata: # sfs의 metadata 지정
name: mongo-primary-0 # sfs 이름, 다만 pod 생성 시 {sfs명}-{번호} 로 네이밍됨
spec: # sfs의 spec을 지정
replicas: 1 # 레플리카 개수 지정
selector: # 파드를 매핑할 셀렉터 지정
matchLabels:
app: mongo-primary
template:
metadata: # pod의 metadata 지정
labels:
app: mongo-primary
spec: # pod의 spec을 지정
volumes:
- name: mongodata # mongodata라는 이름의 볼륨을 찾아 노드의 /app/mongo에 마운트
hostPath:
path: /app/mongo
containers:
- name: mongo-primary-container
image: mongo:latest
ports:
- containerPort: 27017
protocol: TCP
volumeMounts:
- name: mongodata
mountPath: /data/db # 파드의 /data/db를 mongodata라는 이름으로 지정
댓글남기기