DevOps/K8S

[Kubernetes] NFS 서버에 PV 만들어 접근하기 ( 우분투 환경 )

IT록흐 2023. 10. 16. 22:01
반응형

 

 

 

컨테이너가 내려갔다가 올라오면 컨테이너 내부 데이터는 사라진다. 데이터를 유지하려면 외부스토리지에 마운트하여 데이터를 저장해야 한다. 클러스터 내부 저장소에 마운트하면 컨테이너 생명주기와 클러스터 생명주기가 다르므로 데이터가 유지될 수 있다. 그러나 클러스터가 내려가면 데이터 역시 사라진다. 

 

클러스터 상태와 무관하게 데이터를 유지하려면 클러스터 외부의 스토리지에 컨테이너가 마운트 되어야 한다. 이번 포스팅에서는 MiniKube 클러스터 밖에 NFS 서버(외부스토리지)를 구성하여 클러스터 밖의 저장소와 데이터를 공유하는 과정을 다루어 보겠다. 

 

우분투OS 로컬환경에 MiniKube와 NFS 서버를 띄어 실습을 진행해보겠다.

 

 

NFS 서버 생성하기 ( 우분투 환경 )

 

$ sudo apt-get update
$ sudo apt-get install -y nfs-common nfs-kernel-server rpcbind portmap

 

NFS 서버 구성을 위한 패키지를 설치한다. 

 

$ cd /mnt
$ sudo mkdir shared
$ sudo chmod 777 shared

 

공유할 디렉토리를 생성하고 권한을 모두 허용한다. 이곳이 PV가 될 공간이다. 

 

$ sudo echo '/mnt/shared 192.168.49.2/16(rw,sync,no_subtree_check)' >> /etc/exports

 

앞에서 생성한 /mnt/shared에 접근할 IP정보를 설정하는 과정이다. 네트워크IP + 서브넷 범위로 디렉토리에 접근할 IP 범위를 설정할 수 있다. 나는 Minikube에서만 접근하므로 MiniKube ip를 그대로 적었다. 

 

$ sudo echo '/mnt/shared *(rw,sync,no_subtree_check)' >> /etc/exports

 

'*'로 설정하면 모든 IP가 접근할 수 있으므로 잘 모르겠다면 일단 위와 같이 설정하면 된다. 

 

index.html

<html>
	<body>
		<h2>Hello! NFS Nginx</h2>
	</body>
</html>

 

/mnt/shared 디렉토리로 이동하여 index.html 파일을 생성한다.  파드 안 컨테이너가 index.html을 참조할 것이다.

 

sudo ufw enable # 방화벽 활성화
sudo ufw status # 방화벽 상태확인 
sudo ufw allow 2049 # NFS 서비스 포트 열기
sudo ufw status # 방화벽 상태확인

 

NFS 서비스는 2049 포트에서 동작한다. 2049 포트가 트래픽을 받을 수 있도록 열어주어야 한다. 

 

$ sudo exportfs -a
$ sudo systemctl restart nfs-kernel-server

 

설정이 마무리되었다면 NFS 서비스를 재실행한다. 

 

 

PV, PVC, Deployment Yaml 파일 생성 및 실행하기 

 

 

PV ( Persistent Volume )

apiVersion: v1
kind: PersistentVolume
metadata:
 name: nfs-pv
 labels:
  type: nfs
spec:
 volumeMode: Filesystem
 capacity:
  storage: 3Gi
 accessModes:
  - ReadWriteOnce
 nfs:
  server: 192.168.219.109 
  path: /mnt/shared

 

nfs 설정을 보자.

 

NFS 서버가 로컬환경에 띄워져 있으므로 ifconfig를 하여 나온 IP인 192.168.219.109 를 NFS 서버IP로 설정해주었다. 그리고 path는 앞서 공유했던 NFS 서버의 디렉토리로 설정한다. 

 

 

PVC( Persistent Volume Claim )

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
 name: nfs-pvc
spec:
 accessModes:
  - ReadWriteOnce
 volumeMode: Filesystem
 resources:
  requests:
   storage: 3Gi
 storageClassName: ""
 selector:
  matchExpressions:
   - key: type
     operator: In
     values:
      - nfs

 

Yaml 파일은 key: value 구조이다. PVC가 가리키는 PV는 matchExpressions 키로 묘사하고 있다. key명은 type이고 value가 nfs인 PV를 PVC는 가리킨다.  type 키에 nfs 값이 들어가있는 PV를 PVC가 지원한다는 의미이다. 

 

 

Nginx Service 및 Deployment 띄우기

apiVersion: v1
kind: Service
metadata:
  name: nfs-svc 
spec:
  selector:
    app: nginx 
  type: NodePort
  ports:
    - protocol: TCP
      port: 80
      targetPort: 80
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: nfs-deployment
  labels:
    app: nginx 
spec:
  replicas: 2 
  selector:
    matchLabels:
      app: nginx 
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.14.2
        ports:
        - containerPort: 80
        volumeMounts:
         - name: nginx-volume
           mountPath: /usr/share/nginx/html
      volumes:
      - name: nginx-volume
        persistentVolumeClaim:
         claimName: nfs-pvc

 

 

Nginx 서비스의 80포트와 Nginx 컨테이터 80포트와 포트포원딩하였다. 그리고 외부에서 접근이 가능하도록 노드포트 타입으로 서비스를 생성하여 서비스의 80포트와 노드포트를 포트포워딩하였다. 그리고 Nginx 디플로이먼트로 파드를 생성한다. volumeMounts에 /usr/share/nginx/html 경로를 설정하여 해당 경로와 PV를 마운트한다. PV와 마운트하기 위해 volumes 설정에 nfs-pvc를 설정한다. 

 

 

테스트해보기

 

kubectl get svc nfs-svc

 

 

Minikube Node가 192.168.49.2이고 Nginx 서비스와 포트포워딩된 노드포트가 31224이니 192.168.49.2:31224로 이동하면 Nginx App에 접근할 수 있다. 접근하면 아래와 같은 페이지가 열린다. 

 

 

위 페이지는 NFS 서버에 저장한 index.html이다. Nginx 컨테이너가 NFS 서버의 PV에 마운트하여 index.html을 참조한 것이다. 

 

 

실제 파드 안으로 들어가 /usr/share/nginx/html로 접근하면 index.html을 발견할 수 있다. 이처럼 클러스터 외부에 독립적으로 존재하는 스토리지에 마운트하여 클러스터 내부의 데이터 유지 및 공유가 가능하다. 

 

 


 

참고자료

 

K8s 환경에서 NFS 노드 볼륨 구성

프로젝트 서버 설정 작업을 맡게 되었습니다. 요청 사항 중에서 'n개의 서버 병렬 운용이 가능할 것' 이라는 게 있었는데 특정 상황(행사 등)에서 요청이 폭주하여 서버가 다운된 경험이 있는 듯

velog.io

 

Volumes

On-disk files in a container are ephemeral, which presents some problems for non-trivial applications when running in containers. One problem occurs when a container crashes or is stopped. Container state is not saved so all of the files that were created

kubernetes.io

 

[linux] 우분투 방화벽 설정하기 포트 허용 하기 (ubuntu, ufw)

1. 기본 명령어 방화벽 정지 후 상태 확인 ufw disable ufw status 방화벽 실행 후 상태 확인 ufw enable ufw status 22번 포트 허용하고 리스트 확인 ufw allow 22 ufw status 22번 포트 막고 리스트 확인하기 ufw deny 22

pinggoopark.tistory.com

 

반응형