nfs 는 디렉토리, iscsi 는 볼륨으로 nfs 는 bind, iscsi 는 mount 한다
1. Volume
Volume 사용하기
- hostpath, localhost : Data 를 영구적으로 보관하기 어렵다
- Pod 간 Storage 공유 : Pod 하나를 Storage 용으로 사용하고, Cluster 를 통해 타 Host 에 있는 Pod 에서도 접근할 수 있다. 허나, Storage 용 Pod 가 삭제되면 문제가 발생한다
- 외부에 Storage 를 두고, 이를 연결하여 사용하는 방법
외부에 Storage 를 두는 방법
- file Storage : 서버에 두고 사용할 때 적합, 대표적으로 nfs ( 공유 저장소 )
- block Storage : 서버에 두고 사용할 때 적합, 대표적으로 iscsi ( 볼륨 제공 )
- object Storage : 사용자별 일정 공간 제공
ops 와 dev 의 구분에 따른 이용
- yaml 파일 내에 Volume or Directory 를 정의한다. 해당 정의에는 방식 ( ex. nfs ), 주소, 디렉토리명 ( nfs 일 때 ) 등을 기입하고, 이를 Pod 에 연결하는 형태로 작성한다
- ops 와 dev 가 별도인 경우, dev 가 저장소의 위치 / 프로토콜 / 볼륨 등등을 세세히 알 수 없는 문제가 있다. 이 경우 ops 는 볼륨을 만들어 이를 Pool 에 보관하고, 개발자는 자신이 필요한 정보 ( 볼륨 크기, Many / Once , PVC 삭제시 재사용 여부 ) 를 요청하면, 해당 정보와 매칭되는 Pool 에 담겨있는 볼륨을 자동으로 연결시켜 준다
만약, 개발자가 10GB 만 필요하다고 했을 때, Pool 에 담긴 Volume 이 20GB 라고 해도 연결된다. 개발자가 요청한 10GB 는 최소 필요 용량이다. 즉, 볼륨 크기를 제외한 모든 요청 사항이 매칭될 때, 요청 크기가 볼륨의 크기보다 작으면 연결되지만, 요청 크기가 더 크게되면 연결되지 않는다
- 즉, pvc 에서 요청하는 용량은 최소 용량으로 nfs 나 iscsi 방식 상관 없이 모두 적용된다
nfs 는 디렉토리, iscsi 는 볼륨으로 nfs 는 bind, iscsi 는 mount 한다
Volume 을 특정 사용자에게 제공하기
- Storage Class 를 이용하여 지정된 개발자에게만 볼륨을 제공할 수 있다
- Storage Class 는 동적 프로비저닝에 많이 사용된다
- 이를 통해 Volume 요청이 많아지면, Storage Class 를 사용하는 것이 좋다
- 혹은, selector 와 label 을 통해 특정 개발자에게 특정 볼륨만 제공할 수 있다
2. storageClassName
storageClassName 는 PV 와 PVC 의 StorageClass 의 이름을 정의하는 것이다. PV 와 PVC 의 storageClassName 이 같다면 Bound 된다. 따라서, PVC 는 요청하는 PV 의 StorageClass 의 name 을 정의한다
PV 구현
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
storageClassName: testsc
persistentVolumeReclaimPolicy: Retain
nfs:
server: 211.183.3.100
path: /shared
- 위와 같이 작성 후 프로비저닝 해주자
- storageClassName 을 추가해주자. 이는 자신의 StorageClass 의 Name 을 설정해주는 것이다
- pv 정보를 확인하면, STORAGECLASS 에 name 이 추가되었다
PVC 구현
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteMany
storageClassName: testsc
resources:
requests:
storage: 100Mi
- 위와 같이 storageClassName 을 추가해주자. PVC 의 StorageClass 의 name 을 정의한다. 이는 요청할 PV 의 StorageClass 의 name 을 적어야 한다
확인하기
- pvc 가 요청한 pv 의 storageClassName 과 pv 의 storageClassName 이 같으므로 Bound 가 된다. 만약, Name 이 다르면 Bound 되지 않는다
- 현재 요청에 Bound 된 상태이다. 이를 사용하려면, Deployment 에 넣어서 배포해야 한다
3. Selector - Selector & Label
PV, PVC 필터링하는 방법
수동 환경에서 PV 와 PVC 를 필터링 요청한 개발자에게 정확히 제공하기 위하여 아래와 같은 방법을 사용할 수 있다
- StorageClassName -> 일종의 label 과 같이 PV, PVC 에 Name 을 지정하고, 동일한 이름일 경우 용량, 접근, 퍼미션 등을 비교하여 Bind 시킨다. 동적 프로비저닝에서는 반드시 필요하다 !!!
- 마치 LB 에서 특정 Pod 로 트래픽을 전달하기 위해 사용했던 Selector 를 사용한다. 이를 위해서는 Label 을 미리 PV 에 부착시켜야 한다. 즉, 요청이 들어올 때 Selector 로 해당 Label 의 PV 를 선택한다
PV 구현
apiVersion: v1
kind: PersistentVolume
metadata:
name: nfs-pv
labels:
dev: gildong
spec:
capacity:
storage: 100Mi
accessModes:
- ReadWriteMany
persistentVolumeReclaimPolicy: Retain
nfs:
server: 211.183.3.100
path: /shared
- 위와 같이 metadata 에 label 을 추가하자
PVC 구현
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pvc
spec:
accessModes:
- ReadWriteMany
resources:
requests:
storage: 100Mi
selector:
matchLabels:
dev: gildong
- 위와 같이 spec 에 Selector 를 추가하자
확인하기