공부하기싫어

1. 목차

     

    https://kubernetes.io/ko/docs/tasks/configure-pod-container/configure-persistent-volume-storage/

     

    스토리지로 퍼시스턴트볼륨(PersistentVolume)을 사용하도록 파드 설정하기

    이 페이지는 스토리지에 대해 퍼시스턴트볼륨클레임(PersistentVolumeClaim)을 사용하도록 파드를 설정하는 방법을 보여준다. 과정의 요약은 다음과 같다. 클러스터 관리자로서, 물리적 스토리지와

    kubernetes.io

     

    쿠버네티스 공식 문서 참고하여 실습 진행

     

    과정의 요약은 다음과 같다.
    1. 클러스터 관리자로서, 물리적 스토리지와 연결되는 퍼시스턴트볼륨을 생성한다. 볼륨을 특정 파드와 연결하지 않는다.
    2. 그 다음 개발자 / 클러스터 사용자의 역할로서, 적합한 퍼시스턴트볼륨에 자동으로 바인딩되는 퍼시스턴트볼륨클레임을 생성한다.
    3. 스토리지에 대해 위의 퍼시스턴트볼륨클레임을 사용하는 파드를 생성한다.

     

    1.1. 1. 사용자 노드에 index.html 파일 생성하기

    <bash />
    ubuntu@k3s:/mnt$ sudo mkdir /mnt/data ubuntu@k3s:/mnt$ ls data ubuntu@k3s:/mnt$ cd data/ ubuntu@k3s:/mnt/data$ ls ubuntu@k3s:/mnt/data$ sudo sh -c "echo 'Hello from Kubernetes storage' > /mnt/data/index.html" ubuntu@k3s:/mnt/data$ ls index.html ubuntu@k3s:/mnt/data$ cat index.html Hello from Kubernetes storage

     

    1.2. 2. 퍼시스턴트 볼륨 생성하기

    이 예제에서, 사용자는 hostPath 퍼시스턴트볼륨을 생성한다. 쿠버네티스는 단일 노드에서의 개발과 테스트를 위해 hostPath를 지원한다. hostPath 퍼시스턴트볼륨은 네트워크로 연결된 스토리지를 모방하기 위해, 노드의 파일이나 디렉터리를 사용한다.

    운영 클러스터에서, 사용자가 hostPath를 사용하지는 않는다. 대신, 클러스터 관리자는 Google Compute Engine 영구 디스크, NFS 공유 또는 Amazone Elastic Block Store 볼륨과 같은 네트워크 자원을 프로비저닝한다. 클러스터 관리자는 스토리지클래스(StorageClasses)를 사용하여 동적 프로비저닝을 설정할 수도 있다.
    hostPath 퍼시스턴트볼륨의 설정 파일은 아래와 같다.

    라고 하는데 현재 pv 공식 문서에서는 아래와 같이 사용이 종료된다고 한다.

    그리고 일단 현재 진행하는 프로젝트에서는 k3s 로 단일 클러스터를 사용하고 있기 때문에 hostPath 를 사용하는 PV를 생성해서 사용해보려고 한다.

     

    더보기

    2. 퍼시스턴트 볼륨의 유형

    퍼시스턴트볼륨 유형은 플러그인으로 구현된다. 쿠버네티스는 현재 다음의 플러그인을 지원한다.

    • cephfs - CephFS 볼륨
    • csi - 컨테이너 스토리지 인터페이스 (CSI)
    • fc - Fibre Channel (FC) 스토리지
    • hostPath - HostPath 볼륨 (단일 노드 테스트 전용. 다중-노드 클러스터에서 작동하지 않음. 대신 로컬 볼륨 사용 고려)
    • iscsi - iSCSI (SCSI over IP) 스토리지
    • local - 노드에 마운트된 로컬 스토리지 디바이스
    • nfs - 네트워크 파일 시스템 (NFS) 스토리지
    • rbd - Rados Block Device (RBD) 볼륨

    아래의 PersistentVolume 타입은 사용 중단되었다. 이 말인 즉슨, 지원은 여전히 제공되지만 추후 쿠버네티스 릴리스에서는 삭제될 예정이라는 것이다.

    • awsElasticBlockStore - AWS Elastic Block Store (EBS) (v1.17에서 사용 중단)
    • azureDisk - Azure Disk (v1.19에서 사용 중단)
    • azureFile - Azure File (v1.21에서 사용 중단)
    • cinder - Cinder (오픈스택 블록 스토리지) (v1.18에서 사용 중단)
    • flexVolume - FlexVolume (v1.23에서 사용 중단)
    • gcePersistentDisk - GCE Persistent Disk (v1.17에서 사용 중단)
    • portworxVolume - Portworx 볼륨 (v1.25에서 사용 중단)
    • vsphereVolume - vSphere VMDK 볼륨 (v1.19에서 사용 중단)

     

    pv-volume.yaml

    <bash />
    apiVersion: v1 kind: PersistentVolume metadata: name: task-pv-volume labels: type: local spec: storageClassName: manual capacity: storage: 5Gi accessModes: - ReadWriteOnce hostPath: path: "/mnt/data"

     

    생성 및 확인

    <bash />
    ubuntu@k3s:~/test$ k apply -f pv-volume.yaml persistentvolume/task-pv-volume created ubuntu@k3s:~/test$ k get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE task-pv-volume 5Gi RWO Retain Available manual 4s ubuntu@k3s:~/test$

     

    2.1. 3. 퍼시스턴 볼륨 클레임 생성하기

    pv-claim.yaml

    <bash />
    apiVersion: v1 kind: PersistentVolumeClaim metadata: name: task-pv-claim namespace: test spec: storageClassName: manual accessModes: - ReadWriteOnce resources: requests: storage: 3Gi

    공식문서의 코드에서 namespace 만 추가하였음

     

    생성 및 확인

    <bash />
    ubuntu@k3s:~/test$ vim pv-claim.yaml ubuntu@k3s:~/test$ k apply -f pv-claim.yaml persistentvolumeclaim/task-pv-claim created ubuntu@k3s:~/test$ k get pvc -n test NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE task-pv-claim Bound task-pv-volume 5Gi RWO manual 9s ubuntu@k3s:~/test$

    정상적으로 바인딩 됨을 확인함

     

     

    2.2. 4. 파드 생성하기

    pv-pod.yaml

    <bash />
    apiVersion: v1 kind: Pod metadata: name: task-pv-pod namespace: test spec: volumes: - name: task-pv-storage persistentVolumeClaim: claimName: task-pv-claim containers: - name: task-pv-container image: nginx ports: - containerPort: 80 name: "http-server" volumeMounts: - mountPath: "/usr/share/nginx/html" name: task-pv-storage

     

    pod 생성 및 확인

    <bash />
    ubuntu@k3s:~/test$ vim pv-pod.yaml ubuntu@k3s:~/test$ k apply -f pv-pod.yaml pod/task-pv-pod created ubuntu@k3s:~/test$ k get all -n test NAME READY STATUS RESTARTS AGE pod/task-pv-pod 1/1 Running 0 9s ubuntu@k3s:~/test$ k exec -it task-pv-pod -n test /bin/bash kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead. root@task-pv-pod:/# apt update ... root@task-pv-pod:/# apt install curl ... root@task-pv-pod:/# curl http://localhost/ Hello from Kubernetes storage

     

    이후 공식 문서는 정리하기로 넘어가지만

    나는 해당 마운트 포인트에 새로 파일을 생성해서 host dir에 pod 가 삭제되어도 해당 파일이 남아있는지 확인해보려고 한다.

     

    파일 생성

    <bash />
    root@task-pv-pod:/# cd /usr/share/nginx/html root@task-pv-pod:/usr/share/nginx/html# touch app.py root@task-pv-pod:/usr/share/nginx/html# ls app.py index.html

    확인

    <bash />
    ubuntu@k3s:~$ ls /mnt/data/ app.py index.html

     

    잘 남아있다.

     

     

    2.3. 정리하기

    파드, 퍼시스턴트볼륨클레임, 퍼시스턴트볼륨을 삭제한다.

    <code />
    kubectl delete pod task-pv-pod kubectl delete pvc task-pv-claim kubectl delete pv task-pv-volume