Kubernetes PV, PVC의 개념 및 볼륨 마운트
※ 본 내용은 「컨테이너 인프라 환경 구축을 위한 쿠버네티스/도커 - 길벗」를 참고하여 작성하였습니다.
NFS 볼륨에 PV/PVC를 만들고 파드에 연결하기
도커에서 파일을 저장하는 방식으로 바인드 마운트, 볼륨마운트가 있습니다.
마찬가지로 쿠버네티스에서도 파드에서 생성한 내용을 기록, 보관하거나
모든 파드가 동일한 설정을 세팅하기 위해 공유된 볼륨으로부터 공통된 설정을 갖고 올 수 있도록 할 때가 있습니다.
이 때 사용할 수 있는 볼륨 스토리지가 다양하게 있는데, 그 중 주로 이야기 되는 것이 PV, PVC입니다.
PV(Persistent Volume, 지속 사용가능한 볼륨) : 볼륨을 사용할 수 있게 준비
PVC(Persistent Volume Claim, 지속 사용가능한 볼륨 요청) : 볼륨에서 일정 공간 할당
# 공유 디렉터리 생성
mkdir /nfs_shared
# 디렉터리에 NFS로 받아들일 IP 영역 지정
# 옵션 적용하여 /etc/export에 기록(rw-읽기쓰기, sync-쓰기작업동기회, no_root_squash-root계정 사용)
echo '/nfs_shared 192.168.1.0/24(rw,sync,no_root_squash)' >> /etc/exports
NFS 서버 활성화 및 다음에 시작할 때 자동 적용
systemctl enable --now nfs
아래 오브젝트 스펙을 실행하여 PV 생성
kubectl apply -f ./nfs-pv.yaml
# nfs-pv.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 100Mi # 쓸 수 있는 양을 명시(용량 제한이 아님)
accessModes:
- ReadWriteMany # PV 사용방식(ReadWriteMany : 여러 노드가 읽고 쓸 수 있게 마운트)
persistentVolumeReclaimPolicy: Retain # PV가 제거됐을 때 작동방식 (Retain:유지)
nfs: # NFS 서버 연결위치
server: 192.168.1.10
path: /nfs_shared
PV 상태 확인
kubectl get pv
아래 오브젝트 스펙을 실행하여 PVC 생성
kubectl apply -f ~/_Book_k8sInfra/ch3/3.4.3/nfs-pvc.yaml
# nfs-pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
PVC 상태 확인
kubectl get pvc
PV 상태 확인
kubectl get pv
PV와 PVC의 관계
생성한 PVC를 볼륨으로 하는 디플로이먼트 오브젝트 스팩을 배포합니다.
kubectl apply -f ./nfs-pvc-deploy.yaml
# nfs-pvc-deploy.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-pvc-deploy
spec:
replicas: 4
selector:
matchLabels:
app: nfs-pvc-deploy
template:
metadata:
labels:
app: nfs-pvc-deploy
spec:
containers: # audit-train 이미지를 가져옴
- name: audit-trail
image: sysnet4admin/audit-trail
volumeMounts: # Volume Mount 위치 지정
- name: nfs-vol # PVC로 생성된 볼륨을 마운트 하기 위해서 nfs-pvc라는 이름 사용
mountPath: /audit
volumes:
- name: nfs-vol
persistentVolumeClaim:
claimName: nfs-pvc
생성된 파드를 확인합니다. 아래와 같이 4개의 파드가 Running 중인 것을 볼 수 있습니다.
파드 중 하나에 접속합니다.
kubectl exec -it nfs-pvc-deploy-5fd9876c46-mvtxw -- /bin/bash
df -h를 실행하면 PVC의 마운트 상태를 볼 수 있습니다. 용량이 100Mi가 아닌 NFS 서버의 용량은 37G임을 볼 수 있습니다.
df -h
이제 마스터노드의 커맨드창을 하나 더 열어서 audit-trail 컨테이너 기능을 테스트합니다.
외부에서 파드(nfs-pv-deploy)에 접속할 수 있도록 expose로 로드밸런서 서비스를 생성합니다.
생성된 로드밸런서 서비스의 IP도 확인할 수 있습니다.
(*이 때 꼭 MetalLB 셋팅이 되어있어야 External-IP를 확인할 수 있습니다.)
kubectl expose deployment nfs-pvc-deploy --type=LoadBalancer --name=nfs-pvc-deploy-svc --port=80
호스트 컴퓨터에서 브라우저를 통해 접속하여 파드이름과 IP를 확인할 수 있습니다.
exec를 통해 접속한 파드에서 아래 명령어를 통해 접속기록 파일이 남았는지 확인이 가능합니다.
이제 마스터노드에서 scale 명령으로 파드를 4개에서 8개로 증가시킵니다.
kubectl scale deployment nfs-pvc-deploy --replicas=8
가장 최근 증가된 4개의 파드 중 1개를 선택해 exec로 접속하고 기록된 audit 로그가 동일한지 확인합니다.
또, 새로 추가된 audit 로그를 확인해서 기록된 내용을 확인할 수 있습니다.
NFS 볼륨을 파드에 직접 마운트하기
사용자가 관리자와 동일한 단일시스템이라면 PV와 PVC를 사용할 필요가 없이,
바로 파드에 공유가 가능한 NFS 볼륨을 마운트 할 수 있습니다.
먼저 아래 오브젝트 스펙을 적용합니다.
kubectl apply -f ./nfs-ip.yaml
# nfs-ip.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: nfs-ip
spec:
replicas: 4
selector:
matchLabels:
app: nfs-ip
template:
metadata:
labels:
app: nfs-ip
spec:
containers:
- name: audit-trail
image: sysnet4admin/audit-trail
volumeMounts:
- name: nfs-vol # PV와 PVC를 거치지 않고 바로 NFS 서버로 접속
mountPath: /audit
volumes:
- name: nfs-vol
nfs:
server: 192.168.1.10
path: /nfs_shared
새로 배포된 파드를 확인하고 그 중 하나에 접속합니다.
접속한 파드에서 ls /audit를 통해 동일한 NFS 볼륨을 보고 있음을 확인할 수 있습니다.
ls /audit
댓글