Kubernetes/07. 쿠버네티스 볼륨

[쿠버네티스] PV,PVC 리소스 정적 볼륨 프로비저닝

Jaden Park 2021. 6. 22. 16:28

들어가며:

NFS 스토리지 구성

  • NFS 서버 구성 (kube-control1)
  • NFS 클라이언트 구성 (kube-node1,2,3)

PV 생성 및 확인

PVC 생성 및 확인

레플리카셋 컨트롤러 생성 및 확인

PV 및 PVC 상세 정보 확인

서비스 생성 및 확인

볼륨 상태 전환 확인


들어가며:

PV 리소스는쿠버네티스 클러스터 외부 스토리지와 연결을 담당하는 리소스이며,PVC는PV와 파드를 연결하기 위한 리소스입니다.

 

정적 볼륨PV 및 PVC 리소스를 직접 생성하고 사용하는 방식입니다.

PV, PVC 에 대한 설명은 이전 포스팅을 참고하시기 바랍니다.


NFS 스토리지 구성

 

NFS 서버 구성 (kube-control1)

이 작업은 NFS 서버를 구성할 컨트롤플레인 노드 kube-control1 호스트에서 작업해야합니다.

// NFS 서버 패키지 설치
vagrant@kube-control1:~$ sudo apt install -y nfs-kernel-server 

// NFS 공유 디렉토리를 설정
vagrant@kube-control1:~$ sudo mkdir /nfs-volume

// NFS 내보내기를 설정
vagrant@kube-control1:~$ echo "/nfs-volume *(rw,sync,no_subtree_check)" | sudo tee /etc/exports
/nfs-volume *(rw,sync,no_subtree_check)

// NFS 공유 디렉토리에 파드가 사용할 index.html 파일을 생성합니다.
vagrant@kube-control1:~$ echo "hello NFS volume" | sudo tee /nfs-volume/index.html
hello NFS volume

// NFS 공유 디렉토리에 적절한 권한을 부여합니다
vagrant@kube-control1:~$ sudo chown -R nobody:nogroup /nfs-volume
vagrant@kube-control1:~$ sudo chmod 777 /nfs-volume

// NFS 서버를 재시작합니다
vagrant@kube-control1:~$ sudo systemctl restart nfs-kernel-server.service 

 

 

NFS 서버 서비스 상태를 확인해봅니다.

 

 

NFS 서비스 포트인 2049번 포트 방화벽을 열어줍니다.

vagrant@kube-control1:~$ sudo iptables -A INPUT -p tcp --dport 2049 -j ACCEPT 
vagrant@kube-control1:~$ sudo iptables -A INPUT -p udp --dport 2049 -j ACCEPT 

 

 

NFS 클라이언트 구성 (kube-node1,2,3)

NFS 클라이언트로 설정할 kube-node1, kube-node2, kube-node3 노드에 NFS 클라이언트 패키지를 설치합니다.

$ sudo apt install -y nfs-common

 

혹은 ansible 을 사용해서 모든 워커노드에 한번에 설치할 수도 있습니다.

vagrant@kube-control1:~$ ansible kube-node -i ~/kubespray/inventory/mycluster/inventory.ini -m apt -a 'name=nfs-common' --become

PV 생성 및 확인

다음은 PV 리소스 정의 파일입니다.

//myapp-pv-nfs.yaml

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: myapp-pv-nfs
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs-volume
    server: 192.168.100.11

PV 리소스에서 정의할 주요 필드는 다음과 같습니다.

 

.spec.capacity.storage: 스토리지 용량 지정

.spec.accessMode: 접근 방식 관련 옵션 (스토리지에 따라 옵션이 다릅니다)

  • ReadWriteOnce: 하나의 노드에서 읽기/쓰기 가능 (RWO)
  • ReadWriteMany: 여러 노드에서 읽기/쓰기 가능 (RWM)
  • ReadOnlyMany: 여러 노드에서 읽기만 가능 (ROM)

(21.07.01) 수정. 님 감사합니다.

자세한 참고

 

 

.spec.persistentVolumeReclaimPolicy: 회수 정책

  • Retain
  • Delete
  • Recycle

 

 

.spec.nfs: NFS 볼륨

  • emptyDir, hostPath 와 같은 볼륨을 지정
  • 볼륨에 따른 하위 필드는 달라집니다.

 

 

볼륨 형식에 따른 접근 모드 지원표는 해당 링크를 참고해주시기 바랍니다.

 

PV리소스를 생성한 뒤 상태를 확인해보겠습니다.

$ kubectl create -f myapp-pv-nfs.yaml

현재 myapp-pv-nfs 볼륨의 접근 모드는 RWX(ReadWriteMany)이며, 회수 정책은 유지(Retain), 상태는 사용 가능한 (Available) 상태로 보고하고 있습니다.

 

표시되는 PV 리소스의 4가지 상태(STATUS)

  • Available: 다른 PVC에 연결되지 않은 상태. 사용 가능 상태
  • Bound: 특정 PVC에 연결됨
  • Released: 연결되었던 PVC가 해제되었으며, 리소스를 회수하지 않은 상태
  • Failed: 회수 실패

 


PVC 생성 및 확인

다음은 PVC 리소스 정의 파일입니다.

$ cat myapp-pv-nfs.yaml 

---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: myapp-pv-nfs
spec:
  capacity:
    storage: 5Gi
  accessModes:
    - ReadWriteMany
  persistentVolumeReclaimPolicy: Retain
  nfs:
    path: /nfs-volume
    server: 192.168.100.11

PVC 리소스의 주요 필드는 다음과 같습니다.

 

.spec.accessMode: 접근 방식 관련 옵션

  • ReadWriteOnce: 하나의 파드만 읽기/쓰기 가능 (RWO)
  • ReadWriteMany: 여러 파드 읽기/쓰기 가능 (RWM)
  • ReadOnlyMany: 여러 파드 읽기만 가능 (ROM)

 

.spec.requests.storage: PV에 요청하는 크기

.spec.volumeName: PV 리소스 이름을 지정

.spec.storageClassName: 스토리지 클래스 이름 (지금 지정하지 않음)

 

 

PVC 리소스를 생성한 뒤 확인해보도록 하겠습니다.

상태를 확인하면 myapp-pv-nfs PV 리소스에 연결된(Bound) 것을 확인할 수 있습니다.

혹시나 상태가 보류(Pending) 상태이면 연결 중 또는 적절한 PV 리소스를 찾지 못한 경우 입니다. 이런 경우 kubectl describe 명령으로 PVC 리소스의 이벤트에 원인을 찾아서 해결하면 됩니다.

 

PV 리소스의 상태를 확인해보면 상태가 Available에서 연결됨 (Bound) 상태로 변화된 것을 볼 수 있습니다.

요청 필드에 myapp-pvc-nfs PVS 리소스가 연결된 것을 확인할 수 있습니다.


레플리카셋 컨트롤러 생성 및 확인

다음은 NFS PVC 볼륨을 사용할 레플리카셋 리소스 정의 파일입니다.

$ cat myapp-rs-nfs.yaml 
apiVersion: apps/v1
kind: ReplicaSet
metadata:
  name: myapp-rs-nfs
spec:
  replicas: 2
  selector:
    matchLabels:
      app: myapp-rs-nfs
  template:
    metadata:
      labels:
        app: myapp-rs-nfs
    spec:
      containers:
      - name: myapp
        image: nginx
        volumeMounts:
        - name: nfs-share
          mountPath: /usr/share/nginx/html
        ports:
        - containerPort: 80
      volumes:
      - name: nfs-share
        persistentVolumeClaim:
          claimName: myapp-pvc-nfs

사용할 볼륨을 PVC 볼륨으로 지정합니다.

 

.spec.template.spec.volumes.persistentVolumeClaim: PVC 볼륨

  • claimName: PVC 리소스의 이름

 

 

레플리카셋 리소스를 생성한 뒤 리소스를 확인해봅니다. 파드가 볼륨에 연결될 때까지 시간이 조금 오래걸릴 수도 있습니다.

$ kubectl create -f myapp-rs-nfs.yaml


PV 및 PVC 상세 정보 확인

PV 리소스의 상세 정보를 확인해보면 PVC 요청(Claim) 정보 및 연결된 스토리지(Source)의 정보를 확인할 수 있습니다.

 

PVC 리소스의 상세 정보를 확인해보면 어떤 파드가 볼륨을 마운트 했는지 확인할 수 있습니다.

 


서비스 생성 및 확인

파드 및 볼륨의 데이터를 확인하기 위한 서비스 리소스입니다.

$ cat myapp-svc-nfs.yaml
apiVersion: v1
kind: Service
metadata:
  name: myapp-svc-nfs
spec:
  type: LoadBalancer
  ports:
  - port: 80
    targetPort: 80
  selector:
    app: myapp-rs-nfs

 

레플리카셋 컨트롤러는 nginx 이미지를 사용하고 있고, 80번 포트를 사용하고 있습니다.

 

$ kubectl create -f myapp-svc-nfs.yaml
service/myapp-svc-nfs created

서비스 리소스를 생성한 뒤 서비스에 접근해서 컨텐츠를 확인해보겠습니다.


볼륨 상태 전환 확인

$ kubectl delete rs myapp-rs-nfs 
replicaset.apps "myapp-rs-nfs" deleted

레플리카셋을 삭제하고 파드를 중지시킵니다.

 

 

PVC 상세 정보를 확인하면 mount 상태가 none 으로 바뀐 것을 확인할 수 있습니다.

 

$ kubectl create -f myapp-rs-nfs.yaml 
replicaset.apps/myapp-rs-nfs created

 

다시 레플리카셋을 생성합니다.

 

PVC 상세 정보를 확인하면 새로 생성된 파드가 이상 없이 마운트 한 것을 확인할 수 있습니다.

 

$ kubectl delete rs myapp-rs-nfs 
replicaset.apps "myapp-rs-nfs" deleted

다시 레플리카셋 컨트롤러를 삭제하겠습니다.

 

$ kubectl delete pvc myapp-pvc-nfs 
persistentvolumeclaim "myapp-pvc-nfs" deleted

PVC 리소스도 삭제하겠습니다.

 

PV 리소스를 확인하면 상태가 연결이 해제된(Released) 상태인 것을 확인할 수 있습니다.

 

$ kubectl create -f myapp-pvc-nfs.yaml 
persistentvolumeclaim/myapp-pvc-nfs created

다시 PVC 리소스를 생성해보고 PVC 리소스 상태를 확인해보겠습니다.

 

PV 리소스가 해제된 (Released) 상태이기 때문에 PVC가 연결할 적절한 PV를 찾지 못했기 때문에 보류(Pending) 상태를 확인할 수 있습니다.

볼륨에 따라서 실패(Failed) 로 보고받을 수 있습니다.

 

PV와 PVC를 삭제 후 재시작하면 다시 Bound 이 되는 것을 확인할 수 있습니다.

또한, 위와 같은 상황에서 PV 리소스만 삭제하고 재생성해도 Bound 되는 것을 확인할 수 있습니다.