반응형
들어가며
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 updateOperator 설치
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 20h2. MongoDB 설치를 위한 비밀번호 Secret 생성
MongoDB 사용자 비밀번호를 Secret으로 먼저 생성합니다.
kubectl create secret generic mongodb-admin-admin \
--from-literal=password='your-strong-password' \
--namespace mongodb3. 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 adminConnection String
mongodb://admin:<password>@mongodb-0.mongodb-svc.mongodb.svc.cluster.local:27017/?replicaSet=mongodb&authSource=admin5. 생성되는 리소스 정리
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) 관리가 필요합니다. 이 내용은 별도 포스팅에서 다루겠습니다.
감사합니다.
반응형
'DB' 카테고리의 다른 글
| Kubernetes MongoDB Community 버전 업그레이드 가이드 (6.0.5 → 8.2.6) (0) | 2026.03.27 |
|---|