K8S的PV和PVC
PV是对底层网络共享存储的抽象,将共享存储定义为一种“资源”。
PV由管理员创建和配置
PVC则是用户对存储资源的一个“申请”。
就像Pod消费Node的资源一样,PVC能够“消费”PV资源
PVC可以申请特定的存储空间和访问模式
PV和PVC的生命周期
PV的状态:
- Avaliable(可用):表示可用状态,还未被任何PVC绑定
- Bound(可绑定):表示PV已经被PVC绑定
- Released(已释放):PVC被删除,但是资源还未被集群重新声明
- Failed(失败):表示该PV的自动回收失败
PVC和PV是一一对应的,PV和PVC之间的相互作用遵循以下生命周期:
- 资源供应:管理员手动创建底层存储和PV
- 资源绑定:用户创建PVC,kubernetes负责根据PVC的声明去寻找PV,并绑定 在用户定义好PVC之后,系统将根据PVC对存储资源的请求在已存在的PV中选择一个满足条件的
- 一旦找到,就将该PV与用户定义的PVC进行绑定,用户的应用就可以使用这个PVC了
- 如果找不到,PVC则会无限期处于Pending状态,直到等到系统管理员创建了一个符合其要求的PV PV一旦绑定到某个PVC上,就会被这个PVC独占,不能再与其他PVC进行绑定了
- 资源使用:用户可在pod中像volume一样使用pvc Pod使用Volume的定义,将PVC挂载到容器内的某个路径进行使用。
- 资源释放:用户删除pvc来释放pv 当存储资源使用完毕后,用户可以删除PVC,与该PVC绑定的PV将会被标记为“已释放”,但还不能立刻与其他PVC进行绑定。通过之前PVC写入的数据可能还被留在存储设备上,只有在清除之后该PV才能再次使用。
- 资源回收:kubernetes根据pv设置的回收策略进行资源的回收 对于PV,管理员可以设定回收策略,用于设置与之绑定的PVC释放资源之后如何处理遗留数据的问题。只有PV的存储空间完成回收,才能供新的PVC绑定和使用
PVC绑定PV的条件
创建PVC之后,k8s就会去查找满足我们声明要求的PV,比如 storageClassName , accessModes 以及容量这些是否满足要求,如果满足要求就将PV和PVC绑定在一起
- 1. storageClassName (名称)
- 2. accessModes (类型)
- 3. size (大小)
需要注意的是目前PV和PVC之间是一对一绑定的关系,也就是说一个PV只能被一个PVC绑定。
PV 资源清单
capacity: PV存储的容量
accessModes: 访问模式,k8s支持的访问模式如下
------------------------------------------------------
ReadWriteOnce(RWO): 读写权限,并且只能被单个Node挂载
ReadOnlyMany(ROX): 只读权限,允许被多个Node挂载
ReadWriteMany(RWX): 读写权限,允许被多个Node挂载
------------------------------------------------------
persistentVolumeReclaimPolicy: 回收策略
------------------------------------------------------
Retain: 保留数据,需要手工处理
Recycle: 简单清除文件的操作(例如运行rm -rf /dada/* 命令)
Delete: 与PV相连的后端存储完成Volume的删除操作
目前只有NFS和HostPath两种类型的PV支持Recycle策略。
------------------------------------------------------
storageClassName: 存储类别
具有特定类别的PV只能与请求了该类别的PVC绑定。未指定类型的PV则只能对与不请求任何类别的PVC绑定。
## 资源清单
apiVersion: v1 # API 版本,指定使用的 Kubernetes API 版本
kind: PersistentVolume # 资源类型为 PersistentVolume
metadata: # 元数据部分
name: pv01 # PV 的名称
spec: # 规范部分
capacity: # 存储容量部分
storage: 5Gi # PV 的存储容量为 5 GiB
accessModes: # 访问模式部分
- ReadWriteOnce # PV 的挂载类型,表示可以被单个节点以读写方式挂载
persistentVolumeReclaimPolicy: Recycle # PV 的回收策略,表示在删除 PVC 后,将 PV 回收并重新可用
storageClassName: cs-nfs # 存储类名称,用于绑定 PVC 的存储类
nfs: # NFS 配置部分
path: /data # NFS 服务器上存储的路径
server: 172.16.1.31 # NFS 服务器的 IP 地址
apiVersion: v1
kind: PersistentVolume
metadata:
name: pv01
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
persistentVolumeReclaimPolicy: Recycle
storageClassName: cs-nfs
nfs:
path: /data
server: 172.16.1.31
## 运行
[root@master pvc]# kubectl apply -f pv001.yaml
persistentvolume/pv01 created
#### 创建多个pv
[root@master pvc]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
pv01 3Gi ROX Recycle Available kjt-nfs 6m2s
pv02 5Gi RWO Recycle Available kjt-nfs 2m12s
pv03 3Gi RWO Recycle Available kkk-nfs 2m9s
pv04 2Gi RWO Recycle Available kjt-nfs 2m6s
PVC 资源清单
apiVersion: v1 # API 版本,指定使用的 Kubernetes API 版本
kind: PersistentVolumeClaim # 资源类型为 PersistentVolumeClaim
metadata: # 元数据部分
name: kjt-pvc # PVC 的名称
spec: # 规范部分
accessModes: # 访问模式部分
- ReadWriteOnce # 请求的挂载类型,表示可以被单个节点以读写方式挂载
resources: # 资源请求部分
requests: # 请求资源的具体配置
storage: 3Gi # 请求的存储容量为 3 GiB
storageClassName: kjt-nfs # 指定 PVC 绑定的存储类名称
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: kjt-pvc
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 3Gi
storageClassName: kjt-nfs
PVC的选PV模式
第一梯队 :名称 类型
第二梯队 :大小
POD管理PVC
spec: # 规范部分
volumes: # 定义 Pod 中使用的卷
- name: mysql-pvc # 卷的名称,方便在容器中引用
persistentVolumeClaim: # 声明该卷为 PersistentVolumeClaim 类型 PVC类型
claimName: kjt-pvc # 绑定的 PVC 名称,用于指定所需的存储
#### 资源清单
apiVersion: v1
kind: Pod
metadata:
name: mysql57
spec:
volumes:
- name: mysql-pvc
persistentVolumeClaim:
claimName: kjt-pvc
containers:
- name: mysql57
image: mysql:5.7
imagePullPolicy: IfNotPresent
env:
- name: MYSQL_ROOT_PASSWORD
value: '123'
volumeMounts:
- name: mysql-pvc
mountPath: /var/lib/mysql
挂载之后 删除pvc 后 pv为自由的
不要挂载mysql!!!!! 问题没解决 无权限写入