파드에서 데이터를 안정적으로 저장하는 방식
- hostPath
- 클라우드 서비스 방식
1. FTP Server 구축
1-1) NFS 패키지 다운 및 설치
설치
yum -y install nfs-utils rpcbind
systemctl start rpcbind
systemctl start nfs-server
systemctl start rpc-statd
systemctl enable rpcbind
systemctl enable nfs-server
확인
systemctl status nfs-server
1-2) 공유 폴더 생성 및 설정
공유 폴더 생성
mkdir /share-data
chmod 777 /share-data
vi /etc/exports

// 아래 내용 입력 후 저장
/share-data *(rw,sync,no_root_squash)
반영
exportfs -r
방화벽 해제 및 NFS Server재시작
systemctl stop firewalld && systemctl disable firewalld
systemctl stop NetworkManager && systemctl disable NetworkManager
systemctl restart nfs-server
node1 및 node2에 NFS 클라이언트 설치
sudo yum install nfs-utils

2. FileStroage (NFS) 연결 Pod
2-1) NFS 연결을 위한 PersistentVolume 생성
apiVersion: v1
kind: PersistentVolume
metadata:name: pv-nfs
 labels:pv: pv-nfs
spec:capacity:storage: 2G
 accessModes:
 - ReadWriteMany
 nfs:path: /share-data
	server: 192.168.219.10
2-2) PersistentVolumeClaim
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: pvc-nfs
spec:accessModes:
 - ReadWriteMany
 resources:requests:storage: 2G
 storageClassName: ""
 selector:matchLabels:pv: pv-nfs
2-3) Pod
apiVersion: v1
kind: Pod
metadata:name: pod-nfs
spec:containers:
 - name: container
	image: kubetm/init
	volumeMounts:
	- name: volume-nfs
	 mountPath: /nfs/share-data
 volumes:
 - name : volume-nfs
	persistentVolumeClaim:claimName: pvc-nfs
3. Longhorn 구축
3-1) 모든 Master/Work Node에 iscsi 설치
iSCSI( Internet Small Computer System Interface)는 IP 네트워크를 통해 SCSI 명령어를 전송하는 프로토콜
→ 스토리지 시스템을 IP 네트워크에 연결하고, 이를 통해 서버나 컴퓨터에서 스토리지를 사용할 수 있도록 해주는 프로토콜
iSCSI를 사용하면 스토리지를 직접 연결하지 않아도 네트워크를 통해 스토리지 리소스를 사용할 수 있다.
→ 스토리지 자원을 더 효율적으로 관리하고, 데이터 센터나 서버 환경에서 스토리지를 공유하고 확장할 수 있다.
yum install -y iscsi-initiator-utils
3-2) Longhorn 설치
Longhorn은 Kubernetes용 오픈소스 분산 스토리지 시스템
Longhorn은 소규모 및 중규모 Kubernetes 클러스터에서 사용할 수 있으며, 데이터를 블록 스토리지로 저장하고 관리
kubectl apply -f https://raw.githubusercontent.com/longhorn/longhorn/master/deploy/longhorn.yaml
3-3) 확인
kubectl get pods -n longhorn-system
3-4) 기존 Longhorn StorageClass 삭제 및 재생성
$ kubectl get storageclasses.storage.k8s.io -n longhorn-system longhorn 
$ kubectl delete storageclasses.storage.k8s.io -n longhorn-system longhorn
ex)
NAME	 PROVISIONER					RECLAIMPOLICY VOLUMEBINDINGMODE	 ALLOWVOLUMEEXPANSION AGE
longhorn driver.longhorn.io/longhorn Delete		 WaitForFirstConsumer false				 1d


//"longhorn-system" 네임스페이스에 있는 "longhorn" 스토리지 클래스의 세부 정보를 나열
$ cat <<EOF | kubectl create -f -
kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:name: longhorn
provisioner: driver.longhorn.io
allowVolumeExpansion: trueparameters:numberOfReplicas: "2"
 staleReplicaTimeout: "2880"
 fromBackup: ""
EOF // End Of File
3-5) Longhorn Dashboard 접속을 위한 Port Type변경
Service Type 변경 [ClusterIP -> NodePort]
kubectl edit svc -n longhorn-system longhorn-frontend
4. Longhorn Volume에 POD 연결
4-1) PersistentVolumeClaim(PVC)
Kubernetes에서 PersistentVolumeClaim
(PVC)은 PersistentVolume
(PV)에 대한 요청(request)을 나타내는 리소스
PV는 클러스터 내부의 물리적 스토리지 자원을 추상화한 것이며, PVC는 이러한 PV에 대한 요청을 나타내는데 사용
PVC는 쿠버네티스에서 애플리케이션에서 사용할 수 있는 스토리지를 동적으로 프로비저닝할 수 있도록 해주는 중요한 구성 요소
PVC를 정의하면 쿠버네티스는 사용 가능한 PV를 찾거나 필요한 경우 새로운 PV를 생성하고, 이를 PVC와 연결하여 해당 스토리지를 애플리케이션에서 사용 가능
PVC는 다양한 스토리지 클래스를 사용하여 애플리케이션에 필요한 스토리지 요구사항을 충족
PVC는 애플리케이션의 스토리지 요구사항을 정의하고, 이에 맞게 PV를 동적으로 할당하여 애플리케이션에 필요한 스토리지를 제공
apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: longhorn-pvc
spec:accessModes:
	- ReadWriteOnce
 storageClassName: longhorn
 resources:requests:storage: 1Gi
4-2) Longhorn Dashboard 접속
http://localhost:30001
4-3) Pod
apiVersion: v1
kind: Pod
metadata:name: pod-blockstorage
spec:containers:
 - name: container
	image: kubetm/init
	volumeMounts:
	- name: volume-blockstorage
	 mountPath: /longhorn/data
 volumes:
 - name : volume-blockstorage
	persistentVolumeClaim:claimName: longhorn-pvc
4-4) Longhorn Volumeattachments 확인
kubectl get -n longhorn-system volumeattachments.storage.k8s.io