ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • PV, PVC, SC 사용시 Tip!
    K8S 2022. 8. 17. 15:39

    틀린 내용이 있을 수도 있습니다! 

    틀린 내용이 있다면 댓글로 달아주시면 감사하겠습니다!

     

    1. StorageClass default로 설정하기

    storage class에 다음과 같은 annotation을 추가하여 해당 storage class를 default로 설정할 수 있다.  

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      annotations:
        storageclass.kubernetes.io/is-default-class: 'true'

     

    만약 default storage class를 해제하고 싶다면, 이를 false로 변경한다. 

    apiVersion: storage.k8s.io/v1
    kind: StorageClass
    metadata:
      annotations:
        storageclass.kubernetes.io/is-default-class: 'false'

    참고로 default storage class는 하나여야 한다. 

     

    2. default storage class를  사용하려면, storageClassName을 명시하지 않는다. 

    default storageClassName을 사용하지 않으려면 다음과 같이 storageClassName을 ""이라 명시한다.

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: my-pv
    spec:
      storageClassName: ""
      capacity:
        storage: 20Gi
      accessModes:
        - ReadWriteOnce
      hostPath:
        path: "/mnt/data"
        
     ---
     
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: my-pvc
    spec:
      storageClassName: ""
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 20Gi

     

    3. PVC에 특정 볼륨을 매핑하고 싶은 경우 

    1) PVC Selector 

    persistent volume claim에서 특정 Persistent volume만 사용하도록 하고 싶은 경우, selector를 사용하면 된다.  

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: gluster-volume
      labels: 
        storage-tier: gold
        aws-availability-zone: us-east-1
    spec:
      capacity:
        storage: 2Gi
      accessModes:
        - ReadWriteMany
      glusterfs:
        endpoints: glusterfs-cluster 
        path: myVol1
        readOnly: false
      persistentVolumeReclaimPolicy: Retain
    
    ---
    
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: gluster-claim
    spec:
      accessModes:
      - ReadWriteMany
      resources:
         requests:
           storage: 1Gi
      selector: 
        matchLabels:
          storage-tier: gold
          aws-availability-zone: us-east-1

     

    2) persistentVolume에서 매핑되는 claim을 지정하기

    위의 경우와 반대로 persistent volume에서 매핑할 claim을 지정하는 경우다. 

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: foo-pv
    spec:
      storageClassName: ""
      claimRef:
        name: foo-pvc
        namespace: foo
      ...

     

    4. PVC에 storageClassName을 지정한 경우

    pvc에 storageClassName을 지정하여 Pod를 생성한 경우, pv를 생성하지 않아도 pv가 생성되어 pvc와 바인딩 된다. 

    이 때, 생성된 pv는 pvc에 명시된 storageClass에 정의된 환원 정책(Delete, Retain)을 사용하게 된다. 

    참고로 default 환원 정책은 Delete으로 선택된다. 

     

    5. local storage class를 이용한 프로비저닝

    기본적으로 storage class는 local disk에서의 동적 할당을 지원하지 않는다.

    하지만 직접 로컬 경로에 마운트할 디렉터리를 명시하여 사용할 수도 있다. 

     

    mkdir -p /data/volumes/pv1

    chmod 777 /data/volumes/pv1

    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      storageClassName: "" # 디폴트 스토리지 클래스는 사용하지 않음 
      resources:
        requests:
          storage: 1Gi
      selector:
        matchLabels:
          type: clm-test
    
    ---
    
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv
      labels:
        type: clm-test
    spec:
    # 스토리지 클래스를 명시하지 않은 건 pv에서 디폴트 스토리지 클래스를 사용하기 위함 
      capacity:
        storage: 1Gi
      accessModes:
        - ReadWriteOnce
      local:
        path: /data/volumes/pv1
      nodeAffinity: # 로컬에 pv를 생성하려면 필요한 필드 
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - {{ node name을 적어주세요 }}
    
    ---
    # 로컬을 사용하는 디폴트 스토리지 클래스 생성  
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: local-storage
    provisioner: kubernetes.io/no-provisioner
    volumeBindingMode: WaitForFirstConsumer
    
    ---
    apiVersion: v1
    kind: Pod
    metadata:
      name: test-local-vol
      labels:
        name: test-local-vol
    spec:
      containers:
      - name: app
        image: busybox
        command: ['sh', '-c', 'echo "The local volume is mounted!" > /mnt/test.txt && sleep 3600']
        volumeMounts:
          - name: local-persistent-storage
            mountPath: /mnt
      volumes:
        - name: local-persistent-storage
          persistentVolumeClaim:
            claimName: test-pvc
    반응형

    댓글

Designed by Tistory.