EKS 환경에서 MongoDB를 사용할 일이 생겼다.
여러 시도를 하면서 결국 Cloud MongoDB 서비스를 사용하기로 했다.
Mongo Atlas
시도했던 것들을 정리하면서 나중에 해결법을 찾아볼 것이다.
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
app: mongo-test
name: mongo-test
spec:
replicas: 1
selector:
matchLabels:
app: mongo-test
strategy: {}
template:
metadata:
labels:
app: mongo-test
spec:
containers:
- image: mongo
name: mongo-test
ports:
- containerPort: 27017
env:
- name: MONGO_INITDB_ROOT_USERNAME
valueFrom:
secretKeyRef:
name: mongo-creds
key: username
- name: MONGO_INITDB_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mongo-creds
key: password
volumeMounts:
- name: "mongo-data-dir"
mountPath: "chown /data/db:rw"
volumes:
- name: "mongo-data-dir"
persistentVolumeClaim:
claimName: "mongo-pvc"
# claimName: "mongo-ebs-pvc"
---
apiVersion: v1
data:
password: dskaglkenasd
username: gaegasdg=
kind: Secret
metadata:
creationTimestamp: null
name: mongo-creds
---
apiVersion: v1
kind: Service
metadata:
name: suite-mongo-test-service
labels:
app: mongo-test
spec:
selector:
app: mongo-test
ports:
- protocol: TCP
port: 27017
targetPort: 27017
type: LoadBalancer
외부 연결을 위해 Service를 LoadBalancer Type으로 선언했다.
배포도 잘 됐고 DB에 연동도 잘 됐다.
하지만 분명 EFS에 볼륨 마운트도 성공적으로 됐음을 확인했지만 POD를 삭제하고 다시 띄웠을 때
다시 그 Volume을 사용하지 못하는 문제를 발견했다.
처음에는 StorageClass가 reclaimPolicy가 Delete로 선언돼있어서 그런줄알고 Retain으로 설정해줬다.
그럼에도 불구하고 POD를 삭제하면서 같이 볼륨 데이터가 삭제됐다.
DB 데이터 저장에는 EBS가 국룰이라하여 EBS를 사용하려고 했으나 Node 또한 유동적으로 사용되는 EKS 환경이기 때문에 NodeSelector로 관리하기엔 역시 Data가 유실될 가능성이 있어서 선택하지 않았다.
커뮤니티 문서상 튜토리얼도 잘 돼있었으나 이 역시 mongo 명령어가 없다는 실패 log를 확인해 실패했다.
다음에 좀 더 확인해봐야겠다.
따라서 내가 POD설정을 잘못한 것 같아 Helm 차트에서 가져오기로 했다.
helm install mongo-test -n test --set storageClass=suite-mongo-test-sc --set auth.rootPassword=admin --set auth.username=admin --set auth.password=admin --set auth.database=admin oci://registry-1.docker.io/bitnamicharts/mongodb
하지만 지속적인 Pending 상태가 유지됐고 events를 살펴보았다.
35s Normal ExternalProvisioning
persistentvolumeclaim/mongo-test-mongodb
waiting for a volume to be created, either by external provisioner
"ebs.csi.aws.com" or manually created by system administrator
로그를 보니 EFS가 아닌 EBS를 볼륨 마운팅하려 시도하는 것을 볼 수 있다.
따라서 Recomand인 EBS를 볼륨으로 찾고 있지만 내가 선언한 StorageClass는 EFS여서 계속 실패하는 것으로 확인된다. 따라서 이 방법도 나중에 설정을 더 파보아야 할 것 같다.
따라서 결국 Mongo에서 제공하는 Atlas 라는 Colud 서비스를 이용하기로 했다.
우선 회원가입을 진행한다. 나는 Google로 가입했다.
Organization을 생성하고 DB를 생성하자.
User ID 와 PW를 설정하고 접근 가능 네트워크를 0.0.0.0/0 으로 열어두자.
보안을 위해서는 본인의 클러스터 네트워크로 열어주자.
Add Data 에 들어가 Java 를 선택하고, Application이 사용하는 MongoDB Driver 버전을 선택한 뒤에 링크를 복사해 yml파일에 붙여주자.
spring:
application:
name: suite-study-service
datasource:
url: <>
driver-class-name: com.mysql.cj.jdbc.Driver
username: <>
password: <>
hikari:
max-lifetime: 1800000
data:
mongodb:
host: <>
port: <>
authentication-database: <>
username: <>
password: <>
database: <>
spring:
application:
name: suite-study-service
datasource:
url: <>
driver-class-name: com.mysql.cj.jdbc.Driver
username: <>
password: <>
hikari:
max-lifetime: 1800000
data:
mongodb:
uri: <>
주의 ! 링크에 자신이 만든 DB의 이름을 꼭 넣어주자...
mongodb://<계정>:<계정 비밀번호>@ac-9e4east-shard-00-00.k1rmxrk.mongodb.net:27017,ac-9e4east-shard-00-01.k1rmxrk.mongodb.net:27017,ac-9e4east-shard-00-02.k1rmxrk.mongodb.net:27017/<DB 이름>?ssl=true&replicaSet=atlas-q24zy8-shard-0&authSource=admin&retryWrites=true&w=majority