공부하기싫어

목차

     

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

     

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

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

    kubernetes.io

     

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

     

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

     

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

    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

     

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

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

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

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

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

     

    더보기

    퍼시스턴트 볼륨의 유형

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

    • 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

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

     

    생성 및 확인

    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$

     

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

    pv-claim.yaml

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

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

     

    생성 및 확인

    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$

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

     

     

    4. 파드 생성하기

    pv-pod.yaml

    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 생성 및 확인

    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 가 삭제되어도 해당 파일이 남아있는지 확인해보려고 한다.

     

    파일 생성

    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

    확인

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

     

    잘 남아있다.

     

     

    정리하기

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

    kubectl delete pod task-pv-pod
    kubectl delete pvc task-pv-claim
    kubectl delete pv task-pv-volume