본문 바로가기
Compute/kubernetis

[쿠버네티스 시작하기 #3] pv와 pvc 생성 | pv와 pvc의 차이

by 조청유곽 2024. 10. 21.
반응형

 

 

** PV

A PersistentVolume (PV) is a piece of storage in the cluster that has been provisioned by an administrator or dynamically provisioned using Storage Classes. It is a resource in the cluster just like a node is a cluster resource. PVs are volume plugins like Volumes, but have a lifecycle independent of any individual Pod that uses the PV. This API object captures the details of the implementation of the storage, be that NFS, iSCSI, or a cloud-provider-specific storage system.

 

PersistentVolume (PV) 은 관리자가 프로비저닝하거나 Storage Classes를 사용하여 동적으로 프로비저닝한 클러스터의 스토리지입니다 . 노드가 클러스터 리소스인 것처럼 클러스터의 리소스입니다. PV는 Volumes와 같은 볼륨 플러그인이지만 PV를 사용하는 개별 Pod와 독립적인 수명 주기를 갖습니다. 이 API 객체는 NFS, iSCSI 또는 클라우드 공급자별 스토리지 시스템이든 스토리지 구현의 세부 정보를 캡처합니다.

 

** PVC 

A PersistentVolumeClaim (PVC) is a request for storage by a user. It is similar to a Pod. Pods consume node resources and PVCs consume PV resources. Pods can request specific levels of resources (CPU and Memory). Claims can request specific size and access modes (e.g., they can be mounted ReadWriteOnce, ReadOnlyMany, ReadWriteMany, or ReadWriteOncePod, see AccessModes).

 

PersistentVolumeClaim (PVC)  사용자의 저장소 요청입니다. Pod와 비슷합니다. Pod는 노드 리소스를 소비하고 PVC는 PV 리소스를 소비합니다. Pod는 특정 수준의 리소스(CPU 및 메모리)를 요청할 수 있습니다. 클레임은 특정 크기와 액세스 모드를 요청할 수 있습니다(예: ReadWriteOnce, ReadOnlyMany, ReadWriteMany 또는 ReadWriteOncePod로 마운트할 수 있음, AccessModes 참조 ).

 

 

출처 : kubernetes.io 

 

 

1. pod를 생성하고 volume 및 volume mountPath를 확인한다. 

: pod를  dashboard 및 cli로 생성하는 방법에 대해서는 이전 포스팅 참고 

** 이전 포스팅 | [쿠버네티스 시작하기 #2] pod 생성 / container port 확인 / service 생성

 

1.1. pod 생성 

apiVersion: v1
kind: Pod
metadata:
  name: pod-volume-1
spec:
  containers:
  - name: container1
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount1
  - name: container2
    image: kubetm/init
    volumeMounts:
    - name: empty-dir
      mountPath: /mount2
  volumes:
  - name : empty-dir
    emptyDir: {}

 

 

1.2. 생성한 pod의 container1,2에서 각각의 mountpath를 확인 

: container1에서 mountpath 확인 - mount1

[root@k8s-master ~]# kubectl exec -it pod-volume-1 -c container1 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@pod-volume-1 /]# 
[root@pod-volume-1 /]# ls -al
total 12
drwxr-xr-x.   1 root root    54 Oct 19 14:41 .
drwxr-xr-x.   1 root root    54 Oct 19 14:41 ..
-rw-r--r--.   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x.   3 root root    18 Apr 26 02:12 boot
drwxr-xr-x.   5 root root   360 Oct 19 14:41 dev
drwxr-xr-x.   1 root root    41 Oct 19 14:41 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxrwxrwx.   2 root root    22 Oct 19 14:46 mount1
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 195 root root     0 Oct 19 14:41 proc
dr-xr-x---.   1 root root    27 Oct 19 14:48 root
drwxr-xr-x.   1 root root    34 Oct 19 14:42 run
lrwxrwxrwx.   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Oct 19 05:33 sys
drwxrwxrwt.   7 root root   132 Nov 13  2020 tmp
drwxr-xr-x.   1 root root    81 Nov 13  2020 usr
drwxr-xr-x.   1 root root    52 Apr 26 02:12 var
[root@pod-volume-1 /]# cd mount
bash: cd: mount: No such file or directory
[root@pod-volume-1 /]# cd mount1
[root@pod-volume-1 mount1]# ll
total 4
-rw-r--r--. 1 root root 13 Oct 19 14:46 file.txt
[root@pod-volume-1 mount1]# exit
exit

 

 

: container2에서 mountpath 확인 - mount2  

[root@k8s-master ~]# kubectl exec -it pod-volume-1 -c container2 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@pod-volume-1 /]# 
[root@pod-volume-1 /]# 
[root@pod-volume-1 /]# 
[root@pod-volume-1 /]# ls-al 
bash: ls-al: command not found
[root@pod-volume-1 /]# ls -al
total 12
drwxr-xr-x.   1 root root    54 Oct 19 14:42 .
drwxr-xr-x.   1 root root    54 Oct 19 14:42 ..
-rw-r--r--.   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx.   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x.   3 root root    18 Apr 26 02:12 boot
drwxr-xr-x.   5 root root   360 Oct 19 14:42 dev
drwxr-xr-x.   1 root root    41 Oct 19 14:42 etc
drwxr-xr-x.   2 root root     6 Apr 11  2018 home
lrwxrwxrwx.   1 root root     7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx.   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x.   2 root root     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxrwxrwx.   2 root root    22 Oct 19 14:46 mount2
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 194 root root     0 Oct 19 14:42 proc
dr-xr-x---.   1 root root    27 Oct 19 15:08 root
drwxr-xr-x.   1 root root    21 Oct 19 14:42 run
lrwxrwxrwx.   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Oct 19 05:33 sys
drwxrwxrwt.   7 root root   132 Nov 13  2020 tmp
drwxr-xr-x.   1 root root    81 Nov 13  2020 usr
drwxr-xr-x.   1 root root    52 Apr 26 02:12 var
[root@pod-volume-1 /]#

 

 

1.3. container1에서 생성한 파일이 container2에서 동일하게 보여지는 확인 

: container1에서 file.txt 생성 

[root@pod-volume-1 mount1]# echo "file content" >> file.txt
[root@pod-volume-1 mount1]# ll
total 4
-rw-r--r--. 1 root root 13 Oct 19 14:46 file.txt

 

: container2에서 file.txt 확인 

[root@k8s-master ~]# kubectl exec -it pod-volume-1 -c container2 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
[root@pod-volume-1 /]# cd mount2/
[root@pod-volume-1 mount2]# ls -al
total 4
drwxrwxrwx. 2 root root 22 Oct 19 14:46 .
drwxr-xr-x. 1 root root 42 Oct 19 14:42 ..
-rw-r--r--. 1 root root 13 Oct 19 14:46 file.txt
[root@pod-volume-1 mount2]# 
[root@pod-volume-1 mount2]# cat file.txt
file content
[root@pod-volume-1 mount2]#

 

 

2. PV와 PVC 생성 

: PV를 생성하고 PVC 생성 시 capacity와 access modes에 따라서 PV - PVC가 연결되는것을 확인 

 

2.1. capacity가 2G와 3G인 PV를 생성 

apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-01
spec:
  capacity:
    storage: 2G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pv-02
spec:
  capacity:
    storage: 3G
  accessModes:
  - ReadWriteOnce
  local:
    path: /node-v
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - {key: kubernetes.io/hostname, operator: In, values: [k8s-node1]}

 

 

2.2. Capacity가 2G인 PVC를 생성하고 연결되는 PV를 확인한다. 

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pvc-01
spec:
  accessModes:
  - ReadWriteOnce
  resources:
    requests:
      storage: 2G
  storageClassName: ""

 

 

- 대시보드에서 PVC 확인

 

- 대시보드에서 생성한 PV를 확인 

  : pv-01이 pvc-01과 연결됨을 확인  

 


 

 

반응형