DB

Kubernetes에 MongoDB 설치하기

황동리 2026. 3. 27. 11:00
반응형

들어가며

Kubernetes 환경에서 MongoDB를 운영하려면 직접 Pod를 관리하는 것보다 MongoDB Community Operator를 활용하는 것이 훨씬 효율적입니다.


Operator를 사용하면 MongoDB의 설치, 업그레이드, 사용자 관리 등을 Kubernetes 리소스(CRD)로 선언적으로 관리할 수 있습니다.


설치 환경

  • Kubernetes: EKS
  • MongoDB Community Operator: v1.7.0
  • MongoDB: 6.0.5
  • Storage: AWS EBS gp3
  • Node: 전용 노드 그룹 (Taint/Toleration 적용)

저는 위 환경에서 진행을 하였습니다.


1. MongoDB Community Operator 설치

아래 주소는 MongoDB 공식문서 주소 입니다.
참고링크

Helm Repository 추가

helm repo add mongodb https://mongodb.github.io/helm-charts
helm repo update

Operator 설치

helm install mongodb-operator mongodb/mongodb-kubernetes \
  --namespace mongodb \
  --create-namespace \
  --version 1.7.0

설치 확인

kubectl get deployment mongodb-kubernetes-operator -n mongodb
---
NAME                                           READY   STATUS    RESTARTS   AGE
mongodb-kubernetes-operator-6574674d6b-44dw9   1/1     Running   0          20h

2. MongoDB 설치를 위한 비밀번호 Secret 생성

MongoDB 사용자 비밀번호를 Secret으로 먼저 생성합니다.

kubectl create secret generic mongodb-admin-admin \
  --from-literal=password='your-strong-password' \
  --namespace mongodb

3. MongoDBCommunity 리소스 작성 및 배포

mongodb.yaml 파일을 작성합니다.


해당 파일 내용은 mongodb-kubernetes Github 에서 참고하였습니다.

apiVersion: mongodbcommunity.mongodb.com/v1
kind: MongoDBCommunity
metadata:
  name: mongodb
spec:
  members: 1
  type: ReplicaSet
  version: "6.0.5"
  security:
    authentication:
      modes: ["SCRAM"]
  users:
    - name: admin
      db: admin
      passwordSecretRef:
        name: mongodb-admin-admin
      roles:
        - name: clusterAdmin
          db: admin
        - name: userAdminAnyDatabase
          db: admin
        - name: root
          db: admin
      scramCredentialsSecretName: my-scram
  additionalMongodConfig:
    storage.wiredTiger.engineConfig.journalCompressor: zlib
  statefulSet:
    spec:
      volumeClaimTemplates:
        - metadata:
            name: data-volume
          spec:
            accessModes: ["ReadWriteOnce"]
            storageClassName: ebs-gp3-sc
            resources:
              requests:
                storage: 30Gi
        - metadata:
            name: logs-volume
          spec:
            accessModes: ["ReadWriteOnce"]
            storageClassName: ebs-gp3-sc
            resources:
              requests:
                storage: 2Gi
      template:
        spec:
          containers:
            - name: mongod
              resources:
                limits:
                  cpu: 800m
                  memory: 1.5Gi
                requests:
                  cpu: 100m
                  memory: 250Mi
            - name: mongodb-agent
              resources:
                limits:
                  cpu: 200m
                  memory: 512Mi
                requests:
                  cpu: 100m
                  memory: 256Mi
          nodeSelector:
            node-group-type: mongodb-nodes
          tolerations:
            - key: mongodb
              operator: Equal
              value: only
              effect: NoSchedule

주요 설정 설명

항목 설명
members: 1 ReplicaSet 멤버 수. 운영 환경은 3 권장 (저는 테스트여서 1개만 생성을 하였습니다.)
type: ReplicaSet Community Operator는 ReplicaSet만 지원
version 실행할 MongoDB 버전
modes: ["SCRAM"] 인증 방식. SCRAM-SHA-256 사용
scramCredentialsSecretName SCRAM 인증 정보를 저장할 Secret 이름
storageClassName: ebs-gp3-sc EBS gp3 StorageClass 지정
nodeSelector MongoDB 전용 노드 그룹에 배치
tolerations Taint가 걸린 전용 노드에 스케줄링 허용

이제 이대로 배포를 해보겠습니다.

kubectl apply -f mongodb.yaml -n mongodb

배포를 하고 상태 확인해보겠습니다.

kubectl get mongodbcommunity -n mongodb
---
NAME      PHASE     VERSION
mongodb   Running   6.0.5

kubectl get pods -n mongodb
---
NAME          READY   STATUS    RESTARTS   AGE
mongodb-0     2/2     Running   0          2m

Pod가 2/2인 이유는 mongod 컨테이너와 mongodb-agent 컨테이너가 함께 실행되기 때문입니다.

4. 연결 확인

kubectl로 직접 접속

kubectl exec -it mongodb-0 -n mongodb -c mongod -- \
  mongosh -u admin \
  -p $(kubectl get secret mongodb-admin-admin -n mongodb -o jsonpath='{.data.password}' | base64 -d) \
  --authenticationDatabase admin

Connection String

mongodb://admin:<password>@mongodb-0.mongodb-svc.mongodb.svc.cluster.local:27017/?replicaSet=mongodb&authSource=admin

5. 생성되는 리소스 정리

Operator가 자동으로 생성하는 리소스들입니다.

리소스 이름 설명
StatefulSet mongodb MongoDB Pod 관리
Service (Headless) mongodb-svc Pod별 DNS 엔드포인트
Secret mongodb-config Automation Agent 설정
Secret my-scram-scram-credentials SCRAM 인증 정보
Secret mongodb-keyfile ReplicaSet 내부 인증 키

마치며

MongoDB Community Operator를 사용하면 Kubernetes에서 MongoDB를 선언적으로 관리할 수 있어 운영이 훨씬 간편해집니다.
버전 업그레이드도 version 필드만 변경하면 Operator가 자동으로 rolling upgrade를 처리합니다.


단, Major 버전 업그레이드 시에는 featureCompatibilityVersion(FCV) 관리가 필요합니다. 이 내용은 별도 포스팅에서 다루겠습니다.


감사합니다.

반응형