PVC 可以看做是一个接口,PV 可以看做是 PVC 的一个实现。开发人员只需要定义 PVC,提出需要多大的一个存储空间,读取模式是怎么样的,不需要知道数据是通过什么方式存储的。运维人员则提供 PV,可以是 ceph,也可以是 NFS 或者其它。
#定义PVC
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: pv-claim
spec:
accessModes:
- ReadWriteOnce
resources:
- requests:
storage: 1Gi
storageClassName: rook-cephfs
上面的 PV,一般情况下是 k8s 通过 Dynamic Provisioning 机制自动创建的。如何自动创建 PV 呢?这里的 storageClassName 就表示用名称为 rook-cephfs 这个 StorageClass 去自动创建 PV。这个 StorageClass 是部署 Rook-Ceph 后创建的。相应的 yaml 文件在官方的下载包的 /cluster/examples/kubernetes/ceph/csi/cephfs/storageclass.yaml (我用的是 1.5 版本 https://rook.io/docs/rook/v1.5/ceph-quickstart.html )
下面定义一个 Pod 使用 PVC
apiVersion: v1
kind: Pod
metadata:
name: pv-pod
spec:
containers:
- name: pv-container
image: nginx
ports:
- containerPort: 80
name: "http-server"
volumeMounts:
- mountPath: "/usr/share/nginx/html"
name: pv-storage
volumes:
- name: pv-storage
persistentVolumeClaim:
claimName: pv-claim #这里的值与上面PVC 里定义的名称一样
as