쿠버네티스 nfs 서버 구축

pipi·2023년 8월 26일
0

인프라

목록 보기
11/12

저장공간을 공유하기 위해 nfs서버를 사용했다.

nfs서버를 사용해 mongoDB를 구축했는데, nfs서버로 mongoDB를 구축하는건 권장하지 않는 방법이다!

mongoDB pod가 1개일땐 괜찮지만, mongoDB pod가 여러개일땐 에러가 난다. 아마 mongoDB pod여러개가 nfs서버 1개에 동시접근하는걸 막는 것 같은데, 자세하겐 공부하지 못했다.

그렇기에 nfs 서버를 mongoDB 대신 다른 용도로 사용하는걸 추천합니다! nginx로 테스트했을땐 여러개의 pod도 잘 동작했다.

📌 PV, PVC 없이

NFS 서버 구축 + exports 할 파일 설정

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

DB 생성

이부분은 해당 블로그링크에서도 정리했기때문에, 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로 접근해, 동작되는지 확인한다.

DB와 연결할 BackEnd 생성

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엔 접근이 안되는걸 경험가능하다

ingress 수정

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 사용

번외로 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

PV 생성

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확인

PVC 생성

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 확인

DB 생성

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"}}

0개의 댓글

관련 채용 정보