본문 바로가기

kubernetes, helm, rancher

kubernetes Volumes, pv, pvc, Storage class

기본적인 kubernetes resource, option 등을 설명한 블로그입니다. 추가적인 기능을 보고싶으시면 docs를 참고바랍니다.

https://kubernetes.io/docs/home/

 

Kubernetes Documentation

Kubernetes is an open source container orchestration engine for automating deployment, scaling, and management of containerized applications. The open source project is hosted by the Cloud Native Computing Foundation.

kubernetes.io

  • Volume은 kubernetes 스토리지의 추상화 개념. container는 pod에 바인딩 되는 volume을 마운트한다.

 

kind: Pod
...
spec:
  ...
  volumes:
  - name: [volume name]
    hostPath: # NFS, EBS, FC 등등 많은 종류의 volume이 있다.
      path: [path, file or dir in Node]
      type: DirectoryOrCreate # directory이며 없으면 생성. File, FileOrCreate, Directory가 있다.
  containers:
    ...
    volumeMounts:
    - name: [volume name]
      mountPath: [Mount path in container]
  • 만약 노드가 많을 경우 각각의 노드에 hostpath가 마운트되기 때문에 nfs나 aws같은 다른 volume types을 찾는 것이 좋다.

 

volumes:
- name: data-volume
  awsElasticBlockStore:
    volumeID: [volume id]
    fsType: ext4

 

kind: Pod
...
spec:
  ...
  volumes:
  - name: [volume name]
    emptyDir: {} # 한 파드안의 여러 container가 share하는 빈 mount 공간.

 

 

kind: Pod
...
spec:
  ...
  volumes:
  - name: [volume name]
    nfs: # nfs server의 파일 공간을 mount해서 사용하도록 하여, 노드끼리 shared 공간을 사용하도록.
      server: nfs.server.name # nfs server ip.
      path: /share/dir/path # nfs server의 mount dir

 

  • fc, nfs, iscs2, hostpath 등등 volume이 굉장히 많아서 이러한 것들을 각각 파드마다 환경에 따라 관리를 해줘야하기 때문에 volume들을 pv1, pv2 ... 로 묶어서 pool을 만든다.
  • kubernetes가 pod를 생성할 때 필요한 디스크를 요청할때 조건(1TB, rwo)과 함께 pvc를 주면 pv pool에서 해당하는 volume을 준다.

 

# PersistentVolume 생성
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv
spec:
  capacity:
    storage: [storage_size, ex) 2Gi]
  accessModes:
  - ReadWriteOnce
  - ReadOnlyMany
  storageClassNmae: "manual"
  persistentVolumeReclaimPolicy: Retain
  nfs:
    server: [nfs server]
    path: [mount path]

 

 

# PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: myclain
spec:
  resources:
    requests:
      storage: [size]
  accessModes:
  - ReadWriteOnce
  - ReadOnlyMany
  storageClassNmae: "manual"
  selector:
    matchLabels:
      release: "stable"
  persistentVolumeReclaimPolicy: Recycle #default로 retain
  
  # retain: pvc가 delete되도 pv는 manual하게 삭제하지 않으면 남아있으며,
  # 다른 claim에 재사용되어지지 않는다.
  # delete: pvc가 delete되면 pv도 delete된다.
  # recycle: pvc가 delete되면 다른 claim이 쓸 수 있게된다.

 

  • kubectl get pv, kubectl get pvc로 볼 수 있다.

 

...
spec:
  ...
  volumes:
  - name: name
    persistentVolumeClaim:
      claimName: [pvc name]
  • 하지만 static provisioning은 storage를 직접 할당하여 주는것이며, dynamic provisioning을 통해 pv를 생성하지 않고 pvc에 해당 provisioner를 넘겨주면 자동으로 volume이 할당된다.
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: google-storage
provisioner: kubernetes.io/gce-pd
parameters:
  type: pd-standard
  replication-type: none
  • 따라서 pv definition은 필요없고 아래와 같이 pvc에 넣어주면 자동으로 할당된다.
apiVersion: v1
kind: persistentVolumeClaim
metadata:
  name: myclaim
spec:
  accessModes:
  - ReadWriteOnce
  storageClassName: google-storage
  resources:
    requests:
      storage: 500Mi
  • pod에 할당된 pvc를 delete시키면 terminating상태에 있는데, pod가 delete되면 pvc도 그때서야 없어진다. pvc에 bound되어진 pv는 access mode가 retain이라면 released상태로 된다.
  • PV는 storageClassName 속성을 스토리지클래스의 이름으로 설정하여 지정하는 클래스를 가질 수 있다. 특정 클래스의 PV는 해당 클래스를 요청하는 PVC에만 바인딩될 수 있다. storageClassName이 없는 PV에는 클래스가 없으며 특정 클래스를 요청하지 않는 PVC에만 바인딩할 수 있다.

'kubernetes, helm, rancher' 카테고리의 다른 글

kubernetes cluster upgrade  (0) 2022.01.02
kubernetes Auto Scaling, metric server  (0) 2021.12.08
kubernetes auth, certificates  (0) 2021.12.02
kubernetes scheduling  (0) 2021.12.01
kubernetes configmap, secret  (0) 2021.11.30