728x90
파드는 생성과 삭제를 반복하는데, 이때 중요한 데이터는 따로 저장해두어야 한다. 또한 데이터를 여러 파드가 공유할 수도 있다.
쿠버네티스에서는 다양한 형태의 볼륨을 제공한다.
PV(PersistentVolume)
- 볼륨을 사용할 수 있게 준비함
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 192.168.1.10
path: /nfs_shared
- 여기서 선언한
storage
는 단순히 레이블의 의미만 가지며 실제로 사용량을 제한하지 않는다. accessModes
: PV를 어떤 방식으로 사용할지 정의ReadWriteMany
: 여러 개의 노드가 읽고 쓸 수 있다.ReadWriteOnce
: 하나의 노드에서만 볼륨을 읽고 쓸 수 있다.ReadOnlyMany
: 여러 개의 노드가 읽을 수 있다.
persistentVolumeReclaimPolicy
: PVC가 제거됐을 때 PV가 취할 액션Retain
: 유지. PV를 그대로 둔다.Delete
: PV를 삭제한다.Recycle
: Deprecated, PV를 재활용한다.
PVC(PersistentVolumeClaim)
- 필요할 때 준비된 볼륨에서 일정 공간을 할당받음
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: nfs-pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 10Mi
- 동적 볼륨이 아닌 경우 pvc에서 선언한
storage
는 레이블의 의미만 가진다.
[root@m-k8s ~]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
nfs-pv 100Mi RWX Retain Bound default/nfs-pvc 10m
[root@m-k8s ~]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
nfs-pvc Bound nfs-pv 100Mi RWX 3m40s
- PV와 PVC의
STATUS(상태)
가 Bound되었으며, PV와 PVC가 연결됨을 확인할 수 있다. - PVC의
CAPACITY(용량)
가 선언한 10Mi가 아닌 100Mi인데, 이는 PV에서 생성한 100Mi이며 동적 PVC를 생성하는 경우가 아니면 의미가 없다.
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:
- name: audit-trail
image: sysnet4admin/audit-trail
volumeMounts:
- name: nfs-vol
mountPath: /audit
volumes:
- name: nfs-vol
persistentVolumeClaim:
claimName: nfs-pvc
- 생성한 PVC를 볼륨으로 사용하는 deployment 파일을 배포한다.
- spec.containers.volumeMounts에서 컨테이너 내에서 볼륨이 마운트 될 경로를 정한다.
- spec.volumes.persistentVolumeClaim에 사용할 PVC를 설정한다.
[root@m-k8s ~]# kubectl exec -it nfs-pvc-deploy-5fd9876c46-9s7w7 -- /bin/bash
root@nfs-pvc-deploy-5fd9876c46-9s7w7:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 37G 3.0G 35G 8% /
tmpfs 1.3G 0 1.3G 0% /dev
tmpfs 1.3G 0 1.3G 0% /sys/fs/cgroup
192.168.1.10:/nfs_shared 37G 3.4G 34G 9% /audit
/dev/mapper/centos_k8s-root 37G 3.0G 35G 8% /etc/hosts
shm 64M 0 64M 0% /dev/shm
tmpfs 1.3G 12K 1.3G 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 1.3G 0 1.3G 0% /proc/acpi
tmpfs 1.3G 0 1.3G 0% /proc/scsi
tmpfs 1.3G 0 1.3G 0% /sys/firmware
- 생성한 파드에 접속하여 PVC의 마운트 상태를 확인한다.
- nfs_shared의 크기가 37G로 되어있다.
pvc 용량 제한방법
apiVersion: v1
kind: LimitRange
metadata:
name: storagelimits
spec:
limits:
- type: PersistentVolumeClaim
max:
storage: 5Mi
min:
storage: 1Mi
- LimitRange 오브젝트를 생성한다.
- PVC를 통해 PV를 요청할 때 최소 1Mi에서 5Mi로 용량을 제한한다.
apiVersion: v1
kind: ResourceQuota
metadata:
name: storagequota
spec:
hard:
persistentvolumeclaims: "5"
requests.storage: "25Mi"
- PVC를 5개, 모든 PVC의 총 용량이 25Mi가 넘지 않도록 한다.
NFS 볼륨을 파드에 직접 마운트
- PV와 PVC를 사용할 필요가 없을 경우 볼륨을 파드에 직접 마운트할 수 있다.
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
mountPath: /audit
volumes:
- name: nfs-vol
nfs:
server: 192.168.1.10
path: /nfs_shared
- volumes에 nfs 주소를 주어 서버로 바로 접속하도록 선언한다.
728x90