PV 用来定义持久化存储卷,可将外部存储如 NFS/GFS/CFS 等定义为一个 K8S 内部对象,是一个服务提供者。html
PVC 会寻找合适的 PV 进行绑定,绑定成功后,PVC 就能够提供给 pod 使用。node
定义一个 PVlinux
[root@master01 ~]# cat pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: nfs1-pv spec: storageClassName: manual capacity: storage: 1Gi accessModes: - ReadWriteMany nfs: server: 192.168.10.17 path: "/data/nfs"
定义一个 PVCnginx
[root@master01 ~]# cat pvc.yaml apiVersion: v1 kind: PersistentVolumeClaim metadata: name: nfs1-pvc spec: accessModes: - ReadWriteMany storageClassName: manual resources: requests: storage: 1Gi
# kubectl get pv NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE nfs1-pv 1Gi RWX Retain Released default/nfs1-pvc manual 118s # kubectl get pvc NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE nfs1-pvc Pending manual 14s
PVC 会查找 storageClassName 名称一致的 PV,而后在这些 PV 中查找知足 spec.resources.requests.storage 条件的 PV,找到后就绑定 PVC 到该 PV 上。web
若是没有符合条件的 PV,PVC 会处于 pending 状态。K8S 的一个名叫 PersistentVolumeController 的控制器会不断检查是否有 pending 的 PVC,以及是否有符合条件的 PV 出现,一旦有符合条件的 PV 出现,即将 pending 中的 PVC 与 PV 绑定,而后 PVC 状态变为 Bound。后端
建立 Podapi
[root@master01 ~]# cat pod.yaml apiVersion: v1 kind: Pod metadata: name: mypod spec: containers: - name: web image: nginx volumeMounts: - name: nfs mountPath: "/usr/share/nginx/html" volumes: - name: nfs persistentVolumeClaim: claimName: nfs1-pvc
spec.volumes.persistentVolumeClaim 指定了卷使用哪一个 PVC
spec.containers.volumeMounts 指定了挂载哪一个卷(name)到容器哪一个目录(mountPath)中微信
在容器挂载目录中写入一个 index.html 文件spa
kubectl exec -it mypod -- touch /usr/share/nginx/html/index.html
在远程 NFS 上能够看到新建的文件code
[root@work03 ~]# ls /data/nfs/ index.html
说明挂载成功了。
在 Pod 运行的 node,即 work01 上
# df -h | grep nfs 192.168.10.107:/data/nfs 15G 6.7G 6.8G 50% /var/lib/kubelet/pods/6adcbab7-63cd-4c4e-8db7-7234b9b49999/volumes/kubernetes.io~nfs/nfs1-pv
运行 df 能够看到,K8S 把 NFS 目录 mount 到了宿主机的 /var/lib/kubelet/pods/{pod id}/volumes/kubernetes.io~nfs/{PV名称} ,这个本地目录中,而后在容器中挂载该目录。
PVC 不关心后端存储提供者是 NFS 仍是 GFS,具体使用哪一种类型的存储由 PV 来定义,PVC 只和隐藏了存储实现细节的 PV 对接。
本方式为静态分配,若是有一千个 Pod,每一个 Pod 有一个 PVC,那么管理员须要人工开设一千个 PV,随着集群规模的扩大,将致使没法有效管理。
K8S 提供了一种能够动态分配的工做机制,能够自动建立 PV,该机制依赖一个叫作 StorageClass 的 API 对象。
微信公众号:zuolinux_com