쿠버네티스 - 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

structure

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라는 이름으로 지정

.

댓글남기기