기존에 MongoDB를 외부에 두고 접근을 하는 형태로 구성을 하였는데, Kubernetes 적극 활용하고 싶다는 생각에 Helm을 이용하여 Kubernetes cluster에 MongoDB를 구축하게 되었다.

사용한 chart는 Bitnami에서 제공해는 것으로 다음의 chart를 이용했다. https://github.com/bitnami/charts/tree/master/bitnami/mongodb

Architecture의 경우 scale in/out을 할 수 없는 standalone과 여러개의 pod을 띄울 수 있는 replicaset 형태가 있었는데, PSA(Primary Secondary Arbiter) 기반의 구축을 하기 위하여 replicaset을 선택했다.

위의 Github에 들어가면 설치 시에 제공되는 다양한 parameter가 있는데, 아래의 parameter를 이용하여 설치를 진행 하였다.

helm install mongo bitnami/mongodb --namespace=mongo --set \ nameOverride=mongo,\ # 간단한 이름을 원해서 사용
architecture=replicaset,\
replicaCount=2,\ # Arbiter를 제외한 두개의 primary, secondary를 띄우기 위해 사용
arbiter.enabled=true,\ # Arbiter 사용
clusterDomain=<Cluster Domain>,\ # cluster.local 아닐 시 arbiter가 dicovery 불가하므로 따로 명시 필요
auth.enabled=false,\ # Cluster 내부에서 Service Discovery만을 이용하므로 생략
nodeSelector.app=mongo # 특정 node에서 실행되도록 하기 위함

실행을 하면 아래와 같은 스펙의 PersistentVolumeClaim이 생성되기 때문에 hostPath 타입의 PersistentVolume을 미리 만들어 놓았다.

# PVC
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 8Gi
  volumeMode: Filesystem
  volumeName: host-path-0
# PV
apiVersion: v1
kind: PersistentVolume
metadata:
  name: host-path-0
  namespace: mongo
spec:
  capacity:
    storage: 10Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /host-path
    type: DirectoryOnCreate

이제 아래 명령어로 pod을 하나 띄우고 mongo –host mongo-0,mongo-1로 테스트를 하면 된다.

kubectl run –namespace mongo mongo-client –rm –tty -i –restart=’Never’ –image docker.io/bitnami/mongodb:4.4.1-debian-10-r0 –command — bash

참고

--set을 통해 parameter를 설정할 때 정상적으로 설정이 되지 않는다면 git clone을 하여 chart의 values.yaml을 직접 확인해 보는게 큰 도움이 되었다.