ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • local 볼륨 동적 프로비저닝을 위한 PV, PVC 예제
    K8S 2022. 8. 26. 17:27

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

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

     

    엄밀히 말하면 동적 프로비저닝은 아니다!

    하지만 개인 클러스터에서 default storage class를 이용한 동적 프로비저닝이 필요해서

    비슷하게나마 흉내내기 위해 사용하는 예제 파일이다.  

     

    노드 하나를 정해서 다음과 같이 볼륨 역할을 할 디렉터리를 3개 만들어준다.  

    # pv1
    mkdir -p /data/volumes/pv1
    chmod 777 /data/volumes/pv1
    # pv2
    mkdir -p /data/volumes/pv2
    chmod 777 /data/volumes/pv2
    # pv3
    mkdir -p /data/volumes/pv3
    chmod 777 /data/volumes/pv3

     

    디렉터리를 3개 만들었으므로 각 디렉터리에 대한 pv를 생성한다.

    이때 pv에 로컬 프로비저닝을 위한 storage class를 명시해주어야 한다.

    참고로 명시해주지 않았을 때, default storage class로도 적용되지 않더라.  

    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv1
    spec:
      storageClassName: local-storage
      persistentVolumeReclaimPolicy: Delete
      capacity:
        storage: 10M
      accessModes:
        - ReadWriteOnce
      local:
        path: /data/volumes/pv1
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - {{ 노드 이름 }}
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv2
    spec:
      storageClassName: local-storage
      persistentVolumeReclaimPolicy: Delete
      capacity:
        storage: 10M
      accessModes:
        - ReadWriteOnce
      local:
        path: /data/volumes/pv2
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - {{ 노드 이름 }}
    ---
    apiVersion: v1
    kind: PersistentVolume
    metadata:
      name: test-pv3
    spec:
      storageClassName: local-storage
      persistentVolumeReclaimPolicy: Delete
      capacity:
        storage: 10M
      accessModes:
        - ReadWriteOnce
      local:
        path: /data/volumes/pv3
      nodeAffinity:
        required:
          nodeSelectorTerms:
          - matchExpressions:
            - key: kubernetes.io/hostname
              operator: In
              values:
              - {{ 노드 이름 }}
    
    ---
    kind: StorageClass
    apiVersion: storage.k8s.io/v1
    metadata:
      name: local-storage
      annotations:
        storageclass.kubernetes.io/is-default-class: 'true'
    provisioner: kubernetes.io/no-provisioner
    reclaimPolicy: Delete
    volumeBindingMode: Immediate

     

    이제 잘 동작하는지 검증한다.

    다음과 같이 storage class를 사용하지 않도록 pvc를 생성 후, 해당 pvc를 pod에 명시한다. 

    pvc에서 storage class를 명시하지 않는 이유는 pvc에서 default storage class를 사용하기 위함이며  

    pvc 생성시 미리 생성해놓은 pv와 pvc가 bound된다.    

    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
        
    --- 
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: test-pvc
    spec:
      accessModes:
        - ReadWriteOnce
      resources:
        requests:
          storage: 10M

     

    다음과 같이 잘 bound 된것을 확인할 수 있다. 

    root@tmax:~# k get pvc
    NAME                      STATUS   VOLUME     CAPACITY   ACCESS MODES   STORAGECLASS    AGE
    test-pvc                  Bound    test-pv    10M        RWO            local-storage   2s
    반응형

    댓글

Designed by Tistory.