Pod 에서 생성한 내용을 기록하고 보관하거나, 모든 Pod 가 동일한 동일한 설정 값을 유지하고, 관리하기 위해 공유된 Volume 으로부터 공통된 설정을 가지고 오게 하기 위해 외부 Storage 의 Volume 을 사용한다
- file storage -> 디렉토리 ( ex. nfs ) - bind
- block storage -> 외부 스토리지의 볼륨을 disk 형태 ( ex. /dev/sd5 ) 로 가져온다 - mount
- object storage -> 사용자 별로 지정된 공간을 제공
p. 188
일반적인 Volume 제공 방법은 개발자가 요청을 하면, 운영자쪽에서 Volume 생성을 하고, 해당 Volume 을 개발자에게 mount 하라고 요청해서 개발자가 mount 해야 한다
PV 와 PVC 를 사용하면, 개발자가 PVC 를 작성해서 Pool 에 보내면, Pool 에서 미리 준비된 PV 중에서 요청 사항에 맞는 PV 를 찾아 자동으로 해당 PV 를 PVC 에 Bound 시켜준다
- Pool 에 저장된 PV 는 자신의 사양을 명시해야 한다. 이는 용량, 방식, multi access 가능 여부, 재사용 방식 등이 있다
- PVC 는 배포시, 요청 사항이 전달되어 PV 와 Bound 된 것이다. 이때 PVC 는 볼륨이 아니며 단순 명세서와 같은 것으로, Bound 시 연결된 PV 정보를 담고 있다. 이를 통해 Pod 에 PVC 를 넣어주면, Pod 는 PVC 와 Bound 된 PV 정보를 확인하고 Bind / Mount 된다
- network 나 volume 같은 자원을 준비하는 것은 배포가 아닌 프로비저닝 이다
- PVC 는 deploy 에 넣어 사용한다. 즉, 개발자가 PVC, deploy 를 작성하고, 운영자가 PV 를 작성해야 한다
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity: # pv capacity
storage: 100Mi
accessModes: #access mode
- ReadWriteMany # != ReadWriteOnce
persistentVolumeReclaimPolicy: Retain # recycle policy
nfs:
server: 211.183.3.100
path: /shared
- capacity : 용량
- accessModes : 다중 접속 허가 ( Many ) / 불허가 ( Once )
- persistentVolumeReclaimPolicy : PV 재사용에 대한 설정
- nfs : 방식
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 50Mi
- spec 에 요청 사항을 작성한다
- 이때 PVC 는 요청 용량을 보장 받으며, 그 이상의 용량도 사용할 수 있다. 그래서 50Mi 를 요청했는데 100Mi 라고 나온 것이다
- Nfs 에서 크기는 의미없다. 이러한 크기를 고정시키려면 Volume 을 사용해야 한다
- Available ( 독립적인 상태 )
- Bound ( 연결이 된 상태 )
- Release ( 연결이 되었다가 해제 된 상태 )
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Mi
mkdir /shared ; chmod 777 /shared
echo "jaehong" > /shared/index.html
apiVersion: apps/v1
kind: Deployment
metadata:
name: testdeploy
spec:
replicas: 3
selector:
matchLabels:
app: nginx
template:
metadata:
labels:
app: nginx
spec:
containers:
- name: testnginx
image: nginx
volumeMounts:
- name: pvpvc
mountPath: /usr/share/nginx/html
volumes:
- name: pvpvc
persistentVolumeClaim:
claimName: pvc
- volume 선언에 사용할 PVC 를 선언해주면 된다
root@manager:~/k8slab/pvpvclab# k exec testdeploy-7694f559b4-bvlgj -- cat /usr/share/nginx/html/index.html
jaehong
root@manager:~/k8slab/pvpvclab# k exec testdeploy-7694f559b4-bvlgj -- df -h
Filesystem Size Used Avail Use% Mounted on
overlay 20G 9.1G 9.0G 51% /
tmpfs 64M 0 64M 0% /dev
tmpfs 971M 0 971M 0% /sys/fs/cgroup
/dev/sda5 20G 9.1G 9.0G 51% /etc/hosts
shm 64M 0 64M 0% /dev/shm
211.183.3.100:/shared 20G 9.8G 8.4G 54% /usr/share/nginx/html
tmpfs 971M 12K 971M 1% /run/secrets/kubernetes.io/serviceaccount
tmpfs 971M 0 971M 0% /proc/acpi
tmpfs 971M 0 971M 0% /proc/scsi
tmpfs 971M 0 971M 0% /sys/firmware
- 우리는 PVC 로 100Mi 를 요청했지만, 20GB 로 나오고, 실제 사용 가능은 8.4 GB 라고 나온다. 이는 NFS 방식을 통해 실질적으로 디렉토리는 manager Node 에 있는 디렉토리 이기 때문이다. 이 20GB 는 Node 의 총 용량이다. 총 용량으로 나오는 이유는 manager Node 의 shared 디렉토리의 용량이 제한되지 않았기 때문이다
- Overlay 환경이기에 Overlay 공유 자원도 나온다
리눅스는 여러명의 사용자가 동시에 접속해서 사용할 수 있다. 이러한 사용자 별로 용량을 제한하기 위해 quota 를 사용할 수 있다
- soft : 보장된 공간
- hard : 최대 사용 가능 공간
- grace time : hard 공간을 사용 가능한 시간이다. soft 이상의 공간을 사용시 최대 hard 에 정의한 용량만큼 사용할 수 있는데, 이 공간은 grace time 만큼 유지되며, grace time 이 끝나면 soft 초과 용량에 저장된 Data 는 삭제된다
K8S 에서는 ResourceQuota 를 사용할 수 있다. 이때, hard 에 요청 가능한 PVC 수와 PVC 들의 용량 총 합을 제한하는 옵션이 있다
- 이 ResourceQuota 는 Namespace 에 속한다
- PVC 를 제한해야 한다. PVC 는 namespace 에 속하며, PV 는 namespace 에 속하지 않는다
- ResourceQuota 는 soft 를 정의하지 않는다. hard 만 정의하여 제한한다
apiVersion: v1
kind: ResourceQuota
metadata:
name: testquota
spec:
hard:
persistentvolumeclaims: "5"
requests.storage: "250Mi"
- 이를 통해 배포한 PV 를 특정 사용자에게만 제공해줄 수 있다
- StorageClass 에 PV 와 PVC 를 등록하면, 해당 PVC 에게만 PV 를 제공해준다