0부터 시작하는 Kubernetes 공부 - storageClassName & Selector

Jaehong Lee·2022년 9월 8일
1
post-thumbnail

nfs 는 디렉토리, iscsi 는 볼륨으로 nfs 는 bind, iscsi 는 mount 한다

1. Volume

Volume 사용하기

  1. hostpath, localhost : Data 를 영구적으로 보관하기 어렵다
  2. Pod 간 Storage 공유 : Pod 하나를 Storage 용으로 사용하고, Cluster 를 통해 타 Host 에 있는 Pod 에서도 접근할 수 있다. 허나, Storage 용 Pod 가 삭제되면 문제가 발생한다
  3. 외부에 Storage 를 두고, 이를 연결하여 사용하는 방법

외부에 Storage 를 두는 방법

  1. file Storage : 서버에 두고 사용할 때 적합, 대표적으로 nfs ( 공유 저장소 )
  2. block Storage : 서버에 두고 사용할 때 적합, 대표적으로 iscsi ( 볼륨 제공 )
  3. object Storage : 사용자별 일정 공간 제공

ops 와 dev 의 구분에 따른 이용

  1. yaml 파일 내에 Volume or Directory 를 정의한다. 해당 정의에는 방식 ( ex. nfs ), 주소, 디렉토리명 ( nfs 일 때 ) 등을 기입하고, 이를 Pod 에 연결하는 형태로 작성한다
  2. 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: # pv capacity
    storage: 100Mi
  accessModes: #access mode
    - ReadWriteMany # != ReadWriteOnce
  storageClassName: testsc
  persistentVolumeReclaimPolicy: Retain # recycle policy
  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 를 필터링 요청한 개발자에게 정확히 제공하기 위하여 아래와 같은 방법을 사용할 수 있다

  1. StorageClassName -> 일종의 label 과 같이 PV, PVC 에 Name 을 지정하고, 동일한 이름일 경우 용량, 접근, 퍼미션 등을 비교하여 Bind 시킨다. 동적 프로비저닝에서는 반드시 필요하다 !!!
  2. 마치 LB 에서 특정 Pod 로 트래픽을 전달하기 위해 사용했던 Selector 를 사용한다. 이를 위해서는 Label 을 미리 PV 에 부착시켜야 한다. 즉, 요청이 들어올 때 Selector 로 해당 Label 의 PV 를 선택한다

PV 구현

apiVersion: v1
kind: PersistentVolume
metadata:
  name: nfs-pv
  labels:
    dev: gildong
spec:
  capacity: # pv capacity
    storage: 100Mi
  accessModes: #access mode
    - ReadWriteMany # != ReadWriteOnce
  persistentVolumeReclaimPolicy: Retain # recycle policy
  nfs:
    server: 211.183.3.100
    path: /shared
  • 위와 같이 metadata 에 label 을 추가하자
    • PV 에는 Label 을 추가한다

PVC 구현

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc
spec:
  accessModes:
    - ReadWriteMany
  resources:
    requests:
      storage: 100Mi
  selector:
    matchLabels:
      dev: gildong
  • 위와 같이 spec 에 Selector 를 추가하자
    • PVC 에는 Selector 를 추가한다

확인하기

  • label 을 이용하여 Bound 되었다
profile
멋진 엔지니어가 될 때까지

0개의 댓글