CKA [Storage] – PV和PVC的讲解

k8s 有了volume为什么还需要pv?

  • 开发者无需关心存储的管理,只需要为pod请求想用的storage即可,storage就交给storage administrator来管理就好。
  • PV是Persistent volume永久存储的,就算pod被删了数据都还在

解耦开发者和底层存储资源
实现了开发和基础设施的分离

  • 开发者只管发出 PVC 请求(像说“我要一块磁盘”)
  • 存储管理员配置 PV(来自 NFS、iSCSI、云磁盘等)
  • K8s 会根据 PVC 匹配合适的 PV(自动或手动)

以下是从pod获取storage的层级

手动创建PV的流程讲解

你完全可以不依赖 StorageClass 或自动创建机制,手动创建 PV 和 PVC,然后让它们绑定起来

  • 第一手动创建实体硬盘,EBS或是EFS等等
  • 第二步就是创建PV绑定到实体硬盘
  • 第三步就是创建PVC绑定到PV
  • 最后一步就是让开发者把Pod绑定到PVC即可

实践手动创建PV

PV1和PV2都是把数据存储到宿主机当中(hostPath), 你也可以手动创建EBS或EFS来和PV做连接,但是需要在k8s集群内安装csi driver

1. 创建PV1

kubectl apply -f pv1.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: manual-pv-1gb
spec:
  storageClassName: manual
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data/1gb

2. 创建PV2

kubectl apply -f pv2.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
  name: manual-pv-3gb
spec:
  storageClassName: manual
  capacity:
    storage: 3Gi
  accessModes:
    - ReadWriteOnce
  hostPath:
    path: /mnt/data/2gb

3. 创建好了PV1和PV2之后可以查询

kubectl get pv

4. 创建2GB的PVC , 安装规格来看的话,就会绑定到3GB的PV当中

kubectl apply -f pvc.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: manual-pvc-2gb
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 2Gi
  storageClassName: manual

你会看到3GB的PV status已经Bound, 而且是被manual-pvc-2gb给绑定了

5. 创建pod 然后绑定到PVC

kubectl apply -f pod.yaml
apiVersion: v1
kind: Pod
metadata:
  name: test-pod
spec:
  containers:
    - name: app
      image: busybox
      command: ["sleep", "3600"]
      volumeMounts:
        - mountPath: "/data"
          name: mydata
  volumes:
    - name: mydata
      persistentVolumeClaim:
        claimName: manual-pvc-2gb

6. 进入pod当中创建test.txt

【进入pod当中的container】
kubectl exec -it test-pod -c app -- sh

【创建test.txt】
touch /data/test.txt

【退出】
exit

7. 从minikube container当中查询刚刚创建的test.txt

Loading

Facebook评论