컨테이너가 내려갔다가 올라오면 컨테이너 내부 데이터는 사라진다. 데이터를 유지하려면 외부스토리지에 마운트하여 데이터를 저장해야 한다. 클러스터 내부 저장소에 마운트하면 컨테이너 생명주기와 클러스터 생명주기가 다르므로 데이터가 유지될 수 있다. 그러나 클러스터가 내려가면 데이터 역시 사라진다.
클러스터 상태와 무관하게 데이터를 유지하려면 클러스터 외부의 스토리지에 컨테이너가 마운트 되어야 한다. 이번 포스팅에서는 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을 발견할 수 있다. 이처럼 클러스터 외부에 독립적으로 존재하는 스토리지에 마운트하여 클러스터 내부의 데이터 유지 및 공유가 가능하다.
참고자료
'DevOps > K8S' 카테고리의 다른 글
[K8S] Kubernetes 동작원리 (0) | 2024.02.25 |
---|---|
[Kubernetes] MySQL PV, PVC 적용하기 (0) | 2023.10.16 |
[Kubernetes] ClusterIP, NodePort, LoadBalancer의 차이 (0) | 2023.10.13 |
[Kubernetes] MySQL 서비스 및 디플로이먼트 생성하기 (3) | 2023.10.13 |
[Kubernetes] 프론트엔드, 백엔드 서비스 및 디플로이먼트 생성하기 (0) | 2023.10.12 |