저장공간을 공유하기 위해 nfs서버를 사용했다.
nfs서버를 사용해 mongoDB를 구축했는데, nfs서버로 mongoDB를 구축하는건 권장하지 않는 방법이다!
mongoDB pod가 1개일땐 괜찮지만, mongoDB pod가 여러개일땐 에러가 난다. 아마 mongoDB pod여러개가 nfs서버 1개에 동시접근하는걸 막는 것 같은데, 자세하겐 공부하지 못했다.
그렇기에 nfs 서버를 mongoDB 대신 다른 용도로 사용하는걸 추천합니다! nginx로 테스트했을땐 여러개의 pod도 잘 동작했다.
sudo apt-get install nfs-kernel-server
mkdir /{공유할 디렉토리}
chmod 777 /{공유할 디렉토리}
echo '/{공유할 디렉토리} *(rw,sync,no_root_squash,no_subtree_check)' >> /etc/exports
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
디렉토리를 공유하고, 권한을 다음과 같이 설정했다.
결과를 확인해봅시다.
showmount -e
exportfs -v
이부분은 해당 블로그링크에서도 정리했기때문에, yaml파일만 작성하고 설명은 생략하겠다.
nano smart_trash_can_mongodb.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: smart-trash-can-mongodb
spec:
replicas: 1
selector:
matchLabels:
app: smart-trash-can-mongodb
template:
metadata:
labels:
app: smart-trash-can-mongodb
spec:
containers:
- name: smart-trash-can-mongodb
image: mongo:4.4.8
ports:
- containerPort: 27017
volumeMounts:
- name: smart-trash-can-mongodb-volume
mountPath: /data/db
volumes:
- name: smart-trash-can-mongodb-volume
nfs:
server: 192.168.0.27 # 공유 디렉토리 node의 IP주소.
path: /db/smart_trash_can # 공유 디렉토리
---
apiVersion: v1
kind: Service
metadata:
name: smart-trash-can-mongodb
spec:
ports:
- port: 27017
targetPort: 27017
selector:
app : smart-trash-can-mongodb
kubectl apply -f smart_trash_can_mongodb.yaml
이후, 만들어진 서비스 ip로 접근해, 동작되는지 확인한다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: smart-trash-can-back
spec:
replicas: 1
selector:
matchLabels:
app: smart-trash-can-back
template:
metadata:
labels:
app: smart-trash-can-back
spec:
containers:
- name: smart-trash-can-back
image: pipisebastian/smart_trash_can_back
env:
- name: MONGODB_URL
value: "mongodb://10.43.189.22:27017" # 방금 확인한 db 서비스 ip
- name: JWT_SECRET_KEY
value: "key"
ports:
- containerPort: 3000
---
apiVersion: v1
kind: Service
metadata:
name : smart-trash-can-back
spec:
selector:
app: smart-trash-can-back
ports:
- protocol: TCP
port: 80
targetPort: 3000
서비스의 endpoint에는 연결되는 pod의 ip와 포트번호가 적혀있다.
그런데 만약 적혀있지 않다면, 그건 yaml파일 작성할 때, 라벨을 안붙힌거다.
이럴 경우 pod ip엔 접근이 되지만 service ip엔 접근이 안되는걸 경험가능하다
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
annotations:
nginx.ingress.kubernetes.io/rewrite-target: /$2
name: ingress-resource-3
spec:
ingressClassName: nginx
rules:
- http:
paths:
- path: /smart-trash-can(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: smart-trash-can-back
port:
number: 80
- path: /street-lamp(/|$)(.*)
pathType: ImplementationSpecific
backend:
service:
name: street-lamp-back
port:
number: 80
외부주소로 접근했을때 잘되는걸 확인가능하다.
번외로 pv, pvc를 사용해서도 배포해봅시다.
해당부분은 "컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커" 책을 참고했다.
mkdir nfs_shared
chmod 777 /nfs_shared
echo '/nfs_shared *(rw,sync,no_root_squash,no_subtree_check)' >> /etc/exports
sudo exportfs -a
sudo systemctl restart nfs-kernel-server
nano nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 192.168.123.112 # 공유 디렉토리 node의 IP주소.
path: /nfs_shared
kubectl apply -f nfs-pv.yaml
kubectl get pv
-> pv상태 available확인
nano nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
storageClassName: ""
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
kubectl apply -f nfs-pvc.yaml
kubectl get pvc
-> Bound 확인
nano nfs-db.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: mongodb-deployment
spec:
replicas: 1
selector:
matchLabels:
app: mongodb
template:
metadata:
labels:
app: mongodb
spec:
containers:
- name: mongodb
image: mongo:4.4.8
ports:
- containerPort: 27017
volumeMounts:
- name: mongodb-volume
mountPath: /data/db
volumes:
- name: mongodb-volume
persistentVolumeClaim:
claimName: nfs-pvc
---
apiVersion: v1
kind: Service
metadata:
name: mongodb-service
spec:
ports:
- port: 27017
targetPort: 27017
selector:
app: mongodb
kubectl apply -f nfs-db.yaml
+) mongoDB pod를 늘리면 다음과 같이 에러가 뜬다.
/data/db/mongod.lock (Resource temporarily unavailable).
Another mongod instance is already running on the /data/db directory"}}