쿠버네티스 볼륨 사용법

CHAN LIM·2022년 8월 30일
0

K8S

목록 보기
7/11

emptyDir

  • 파드가 생성, 삭제될 때 같이 생성, 삭제되는 임시 볼륨이다.
  • 빈 공간이라서, 파드내에서 컨테이너끼리 공유하는 공간으로 사용한다.
  • 임시 데이터 용도이기 때문에 해당 파드가 삭제되면 emptyDir 볼륨 데이터도 영구 삭제된다.

apiVersion: v1        # 파드 형태 배포
kind: Pod
metadata:
  name: pod-emptydir 
  labels:
    app: nginx 
spec:
  containers:        
  - name: web-page
    image: nginx 
    volumeMounts:
    - mountPath: /usr/share/nginx/html 
      name: empty-directory 

  - name: html-builder 
    image: alpine 
    volumeMounts:
    - mountPath: /html-dir 
      name: empty-directory 
    command: ["/bin/sh", "-c"]
    args: 
      - echo "This page created on $(date +%Y-%m-%d)" > /html-dir/index.html;
        sleep infinity;

  volumes:
  - name: empty-directory 
    emptyDir: {}

hostPath

  • 파드에서 마운트해서 사용하는 것은 emptyDir과 동일하지만,
    emptyDir 볼륨이 같은 파드에서 공유할 수 있는 반면에 hostPath 볼륨은 다른 파드에서도 공유 가능합니다.
  • emptyDir 볼륨 데이터는 임시적이라 파드가 삭제되면 파드 볼륨내 데이터도 삭제되는데,
    hostPath 볼륨 데이터는 해당 파드가 삭제되어도 hostPath 볼륨 데이터는 삭제되지 않아 다른 파드에서 계속 사용할 수 있습니다.
  • 노드로 배포가 되는데, 노드가 호스트이다. 즉, 노드에 있는 디렉토리를 사용할 수 있다.
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-hostpath
  labels:
    app: deploy-hostpath
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deploy-hostpath 
  template:
    metadata:
      labels:
        app: deploy-hostpath 
    spec:
      containers:
      - name: host-mon
        image: sysnet4admin/sleepy
        volumeMounts:
        - mountPath: /host-log  
          name: hostpath-directory 
      volumes:
      - name: hostpath-directory 
        hostPath:
          path: /var/log

NFS

  • 네트워크 파일 시스템
apiVersion: apps/v1
kind: Deployment
metadata:
  name: deploy-nfs
  labels:
    app: deploy-nfs
spec:
  replicas: 3
  selector:
    matchLabels:
      app: deploy-nfs
  template:
    metadata:
      labels:
        app: deploy-nfs
    spec:
      containers:
      - name: chk-log 
        image: sysnet4admin/chk-log
        volumeMounts:
        - name: nfs-vol
          mountPath: /audit
      volumes:
      - name: nfs-vol
        nfs:
          server: 192.168.1.10
          path: /nfs_shared/nfs-vol

PersistentVolume / PersistentVolmeClaim

  • PV

    • PV는 Volume 자체를 의미한다.
    • Kubernetes Cluster에서 관리되는 저장소로 Pod 하고는 별개로 관리되고 별도의 생명주기를 가지고 있어서 Pod가 재실행되더라도 PV 데이터는 정책에 따라 유지/삭제되는데, 즉 실제 물리 디스크와 같은 의미이다.
    • 시스템 관리자는 Volume Object를 사용하기 위해서 가장 먼저 실제 저장공간을 생성하고 이를 PV로 kubernetes에 등록해야 한다.
  • PVC

    • PVC는 사용자가 PV에 하는 요청으로 PV를 추상화하여 개발자가 손쉽게 PV를 사용할 수 있도록 해주는 기능이다.
    • 사용하고 싶은 용량은 얼마인지, 읽기/쓰기는 어떤 모드로 설정하고 싶은지 등을 정해서 PV에 전달하는 역할을 한다.
    • 개발자는 Pod를 생성할 때 volume을 정의하고 이 볼륨 정의 부분에 물리적 디스크에 대한 특성을 정의하는 것이 아니라 PVC를 지정하여, 관리자가 생성한 PV와 연결한다.
    • Storage를 Pod에 직접 할당하는 게 아니라 중간에 PVC를 통해서 사용하기 때문에 Pod와 * Storage 관리를 명확히 구분해서 할 수 있음.

  • NFS의 단점 보완

  • accessModes
접근모드설명약어
ReadWriteOnce하나의 노드에서만 볼륨을 읽고 쓸 수 있게 마운트RWO
ReadOnlyMany여러 개의 노드가 읽도록 마운트ROX
ReadWriteMany여러 개의 노드가 읽고 쓸 수 있도록 마운트RWX
  • persistentVolumeReclaimPolicy
반환 정책설명
Retain(보존)PVC 삭제 시에도 PV 보존
Delete(삭제)PVC 삭제 시에도 PV를 함께 삭제
Recycle(재활용)더이상 사용되지 않음

StorageClass

PV, PVC 할당의 문제점

  • 사용자가 Claim시 PV 전체를 가져오는 것
    • 관리자가 PV를 항상 준비해야 한다.

해결

  • StorageClass 사용
    • Claim을 StorageClass에 하여 그때 SC가 PV 생성한다.

볼륨과 클레임에 대한 생명주기

  • 프로비저닝
    • Volume Object를 사용하기 위해서는 가장 먼저 실제 저장할 수 있는 공간을 확보해야 한다.
    • 저장 공간이 확보되면 PV가 해당 저장 공간을 바라보며 생성돤다.
    • Provisioning 디스크 공간( Storgae )을 확보하여 PV를 만드는 단계에 해당된다.
    • PV Provisioning을 만드는 방법으로는 정적(Static)과 동적(Dynamic) 방법이 있다.
      • 정적 프로비저닝
        • 특정 용량을 가진 PV를 미리 생성해두고 요청이 있을 시, 미리 생성한 PV를 할당하여 사용하는 방법이다.
        • Storage 용량에 제한이 있을 때 사용된다.
      • 동적 프로비저닝
        • 사용자 요청이 있을 때 PV를 생성하여 할당한다.
        • StorageClass라는 오브젝트를 사용해서 동적으로 PV를 만들 수 있다.
          한 마디로 PVC는 StorageClasses를 사용해서 원하는 Storage에 PV를 생성한다는 것이다.
  • 바인딩
    • ReadWriteOnce
    • ReadOnlyMany
    • ReadWriteMany
  • 반환
    • Retain (보존)
    • Delete (삭제)
    • Recycle (재활용)

StorageClass

  • Static Provisioning 방법의 경우 관리자가 PV를 사용자로부터 요청을 받을 때마다 생성해줬어야 함.
  • 하지만 Kubernetes PV를 자동으로 생성할 수 있는 방법을 제공했는데, 그 방법이 바로 StorageClass.
  • 즉 관리자는 PV( PersistentVolume )을 여러 개 만드는 대신 Storage Object 를 정의 하여 사용하로 하여금 Storage Object를 사용하게 하는것.
  • Static Provisioning 의 경우 PVC가 직접적으로 PV 를 바라봤다면 Dynamic Provisioning 의 경우 PVC가 StorageClass를 바라보도록 한다.

volumeClaimTemplates

스테이트풀셋의 특별함

  • 스테이트풀셋의 목적은 상태를 가지고 있는 것이다.
  • 헤드리스 서비스를 통해서 각각의 도메인을 가지므로 독립적인 도메인을 가지고 독립적으로 파드를 접근할 수 있다.
  • 볼륨의 관점에서 보면, 각각의 고유의 상태값을 가지므로 volumeClaimTemplates으로 클레임하면 각각의 PV를 가지게 된다.

  • 스테이트풀셋에서만 사용할 수 있는 볼륨 타입
  • 볼륨을 클레임할 수 있는 템플릿 형태
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: sts
spec:
  replicas: 3
  serviceName: sts-svc-domain #statefulset need it
  selector:
    matchLabels:
      app: sts
  template:
    metadata:
      labels:
        app: sts
    spec:
      containers:
      - name: chk-hn
        image: sysnet4admin/chk-hn
        volumeMounts:
        - name: each-sts-backup
          mountPath: /backup_data
  volumeClaimTemplates:
  - metadata:
      name: each-sts-backup
    spec:
      accessModes: [ "ReadWriteOnce" ]
      storageClassName: "managed-nfs-storage"
      resources:
        requests:
          storage: 20Gi

From.

lectures
kubernetes Docs

profile
클라우드, 데이터, DevOps 엔지니어 지향 || 글보단 사진 지향

0개의 댓글