3.1
主旨
- PV&PVC概念原理
- PV&PVC&POD案例使用
创建示例
测试环境信息
// IP k8s单master测试环境
10.1.6.104
// k8s信息
# kubectl version --short
Client Version: v1.26.6
Kustomize Version: v4.5.7
Server Version: v1.26.6
// docker
# docker version
……此处省略……
Server: Docker Engine - Community
Engine:
Version: 20.10.6
API version: 1.41 (minimum version 1.12)
Go version: go1.13.15
Git commit: 8728dd2
Built: Fri Apr 9 22:43:57 2021
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: 1.6.24
GitCommit: 61f9fd88f79f081d64d6fa3bb1a0dc71ec870523
runc:
Version: 1.1.9
……此处省略……
本地创建示例
# tree
.
├── nginx-deployment.yaml
├── pvc.yaml
└── pv-local.yaml
0 directories, 3 files
# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv-common 10Gi RWO Retain Bound default/pv-common 27m
# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
pv-common Bound pv-common 10Gi RWO 27m
案例1-本地
创建pv
# cat pv-local.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv-common
labels:
app: pv-common
spec:
capacity:
storage: 10Gi
volumeMode: Filesystem
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Retain
local:
path: /var/local/common/pv
nodeAffinity:
required:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- master
pvc绑定pv
# cat pvc.yaml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: pv-common
namespace: default
spec:
volumeName: pv-common
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 1Gi
pod挂载pvc
# cat nginx-deployment.yaml
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
name: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- image: nginx:1.20.0
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/statics
volumes:
- name: html
persistentVolumeClaim:
claimName: pv-common
---
kind: Service
apiVersion: v1
metadata:
name: nginx
namespace: default
labels:
name: nginx
spec:
type: NodePort
ports:
- name: http
port: 80
targetPort: 80
nodePort: 30088
selector:
name: nginx

案例2-NFS
创建pv
# pv/test-pv.yml
apiVersion: v1
kind: PersistentVolume
metadata:
name: test
labels:
type: test
spec:
capacity:
storage: 10Gi # 提供 10G 的存储
accessModes:
- ReadWriteMany # 允许多个 Pod 同时读写
persistentVolumeReclaimPolicy: Recycle # pvc 的策略,允许回收
nfs:
path: "/data/k8s"
server: 192.168.208.130 #
readOnly: false # 取消只读,就是可写
pvc绑定pv
# test-pvc.yml
kind: PersistentVolumeClaim
apiVersion: v1
metadata:
name: nfs # pvc 的名字
spec:
accessModes:
- ReadWriteMany # 模式允许多人读写访问
resources:
requests:
storage: 1Gi # 需求资源 1G
pod挂载pvc
---
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
name: nginx
name: nginx
spec:
replicas: 1
selector:
matchLabels:
name: nginx
template:
metadata:
labels:
name: nginx
spec:
containers:
- image: nginx:1.20.0
name: nginx
volumeMounts:
- name: html
mountPath: /usr/share/nginx/html/statics
volumes:
- name: html
persistentVolumeClaim:
claimName: nfs
进阶剖析
主要名词解释
// PV & PVC
PersistentVolume (PV)
PV是集群中配置好的一个网络存储,是集群的全局资源,不属于任何namespace;
PV无法与pod直接关联,它的设计是用来和存储对接的,所以用于绑定后端存储,写入PV的数据最终都是存放在后端存储服务器上
PersistentVolumeClaim (PVC)
PVC可以直接被pod挂载,同时可以绑定PV,从而让pod使用PV;
PVC与挂载它的pod隶属于同一个namespace

主要参数解释
PV参数
访问模式:
ReadWriteOnce : PV只能被单个节点以读写权限挂载,rwo
ReadOnlyMany: PV可以被多个节点挂载但是权限是只读的,rox
ReadWrieMany: PV可以被多个节点以读写方式挂载使用, rwx
删除机制:
Retain : 删除PV后保持原状,如果需要删除数据需要管理员到存储上手动删除(建议)
Recycle : 空间回收,直接删除存储卷上所有数据,目前仅支持NFS和hostPath (不建议)
Delete : 自动删除存储卷
卷类型:
定义存储卷使用的文件系统是块设备还是文件系统,默认是文件系统
PVC参数
访问模式:
ReadWriteOnce : PVC只能被单个节点以读写权限挂载,rwo
ReadOnlyMany: PVC可以被多个节点挂载但是权限是只读的,rox
ReadWrieMany: PVC可以被多个节点以读写方式挂载使用, rwx
resources : 定义PVC创建存储卷的大小
PVC如何绑定PV:(两种方式)
1、seletcot : 标签选择器,用来选择需要绑定的PV
# matchLabels : 匹配标签名称
# matchExpressions : 基于正则表达式匹配
2、volumeName :
直接点名要绑定的PV名称(相较于上面的标签选择器更精准)
volumeMode : 卷类型
定义PVC使用的文件系统是块设备还是文件系统,默认是文件系统
// 注意
PVC空间要小于PV的空间
存储类StorageClass
……待继续补充完善……
常见问题
pvc无法绑定pv
// 日志描述
pvc pending
pvc Cannot bind to requested volume "": incompatible accessMode
// 排查
是否创建storageClassName,pv和pvc是否一致
accessModes 是否一致
pvc资源是否超过pv最远