默认情况下容器中的磁盘文件是非持久化的,对于运行在容器中的应用来说面临两个问题,
第一:当容器挂掉kubelet将重启启动它时,文件将会丢失;
第二:当Pod中同时运行多个容器,容器之间需要共享文件时,Kubernetes的Volume解决了这两个问题。
PV/PVC
PersistentVolume(PV持久卷)是集群中已由管理员配置的一段网络存储,集群中的存储资源就像一个node节点是一个集群
资源,PV是诸如卷之类的卷插件,但是具有独立于使用PV的任何单个pod的生命周期, 该API对象捕获存储的实现细节,
即NFS,iSCSI或云提供商特定的存储系统,PV是由管理员添加的的一个存储的描述,是一个全局资源即不隶属于任何
namespace,包含存储的类型,存储的大小和访问模式等,它的生命周期独立于Pod,例如当使用它的Pod销毁时对PV没
有影响。
PersistentVolumeClaim(PVC持久卷声明)是用户存储的请求。它与 Pod 相似。Pod 消耗节点资源,PVC 消耗 PV 资源。Pod 可以请求特定级别的
资源(CPU 和内存)。PVC可以请求特定的大小和访问模式(例如,可以以读/写一次或 只读多次模式挂载)。
kubernetes 从1.0版本开始支持PersistentVolume和PersistentVolumeClaim。
PV/PVC实现pod和storage的解耦,这样我们修改storage的时候不需要修改pod,也可以实现存储和应用权限的隔离
PV是对底层网络存储的抽象,即将网络存储定义为一种存储资源,将一个整体的存储资源拆分成多份后给不同的业务使用。
PVC是对PV资源的申请调用,就像POD消费node节点资源一样,pod是通过PVC将数据保存至PV,PV在保存至存储。
pv没有namespace概念,属于全局性的,pvc则有namespace概念
删除pvc的时候需要先把正在使用pvc的deploy或者pod删掉或吧使用的pvc删掉,要不然会一直显示delete不动
删除pvc之后k8s会创建一个回收的pod----根据pv的回收策略回收,回收完了之后,pv的状态就会变成可被绑定的状态,也就是空闲状态,其他的pvc匹配到这个pv就会和这个pv绑定
创建pvc之后一直绑定不上pv
1.pvc的空间申请大小大于pv的大小
2.pvc的storageclassName没有和pv的一致
3.pvc的accessModes和pv的不一致
创建挂载pvc之后一直处于pending状态
1.pvc没有创建成功或者被创建
2.pvc和pod不在同一个anmespace
PersistentVolume参数:
Capacity: #当前PV空间大小,kubectl explain PersistentVolume.spec.capacity
accessModes : #访问模式, kubectl explain PersistentVolume.spec.accessModes
ReadWriteOnce #PV只能被单个节点以读写权限挂载,RWO
ReadOnlyMany #PV以可以被多个节点挂载但是权限是只读的,ROX
ReadWriteMany #PV可以被多个节点是读写方式挂载使用,RWX
persistentVolumeReclaimPolicy #删除机制即删除存储卷卷时候,已经创建好的存储卷由以下删除操作:#kubectl explain PersistentVolume.spec.persistentVolumeReclaimPolicy
Retain #删除PV后保持原装,最后需要管理员手动删除
Recycle #空间回收,及删除存储卷上的所有数据(包括目录和隐藏文件),目前仅支持NFS和hostPath
Delete #自动删除存储卷
volumeMode #卷类型,kubectl explain PersistentVolume.spec.volumeMode定义存储卷使用的文件系统是块设备还是文件系统,默认为文件系统
mountOptions #附加的挂载选项列表,实现更精细的权限控制 如:ro
示例:
apiVersion: v1
kind: PersistentVolume #定义kind类型为PV
metadata:
name: zookeeper-datadir-pv-1
namespace: magedu #pv没有namespace概念,属于全局性的,此参数可以不设置。
spec:
capacity:
storage: 20Gi
accessModes:
- ReadWriteOnce
nfs: #NFS服务器
server: 172.31.1.103
path: /data/k8sdata/magedu/zookeeper-datadir-1
PersistentVolumeClaim创建参数:
accessModes : #PVC 访问模式,#kubectl explain PersistentVolumeClaim.spec.volumeMode
ReadWriteOnce #PVC只能被单个节点以读写权限挂载,RWO
ReadOnlyMany #PVC以可以被多个节点挂载但是权限是只读的,ROX
ReadWriteMany #PVC可以被多个节点是读写方式挂载使用,RWX
resources: #定义PVC创建存储卷的空间大小
volumeName #要绑定的PV名称
volumeMode #卷类型,定义PVC使用的文件系统是块设备还是文件系统,默认为文件系统
selector: #标签选择器,选择要绑定的PV
matchLabels #匹配标签名称
matchExpressions #基于正则表达式匹配
示例:
apiVersion: v1
kind: PersistentVolumeClaim #定义kind类型为PVC
metadata:
name: zookeeper-datadir-pvc-1 #定义PVC名称,容器调用使用。
namespace: magedu
spec:
accessModes: #访问模式,
- ReadWriteOnce
volumeName: zookeeper-datadir-pv-1 #调用PV名称。
resources: #定义PVC创建存储卷的空间大小
requests:
storage: 10Gi #使用大小,要比PV的值小,如果容器已运行,不随意变更大小。
示例:
安装nfs服务器
[root@localhost7B ]# cat /etc/exports
/data/k8sdata *(rw,no_root_squash)
[root@localhost7B ]# mkdir /data/k8sdata/magedu/zookeeper-datadir-1 -p
[root@localhost7B ]# mkdir /data/k8sdata/magedu/zookeeper-datadir-2 -p
[root@localhost7B ]# mkdir /data/k8sdata/magedu/zookeeper-datadir-3 -p
[root@localhost7B ]# systemctl restart nfs-server.service
#写数据测试
mount -t nfs 192.168.80.110:/data/k8sdata/magedu/zookeeper-datadir-1 /mnt
cp /etc/passwd /mnt
umount /mnt/
#创建PV
[root@localhost7C pv]# cat persistentvolume.yaml
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: zookeeper-datadir-pv-1
namespace: default
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.80.110
path: /data/k8sdata/magedu/zookeeper-datadir-1
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: zookeeper-datadir-pv-2
namespace: default
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.80.110
path: /data/k8sdata/magedu/zookeeper-datadir-2
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: zookeeper-datadir-pv-3
namespace: default
spec:
capacity:
storage: 5Gi
accessModes:
- ReadWriteOnce
nfs:
server: 192.168.80.110
path: /data/k8sdata/magedu/zookeeper-datadir-3
#创建PVC
[root@localhost7C pv]# cat persistentvolumeclaim.yaml
apiVersion: v1
kind: PersistentVolumeClaim #定义kind类型为PVC
metadata:
name: zookeeper-datadir-pvc-1
namespace: default
spec:
accessModes: #访问模式,
- ReadWriteOnce
volumeName: zookeeper-datadir-pv-1 #调用PV名称。
resources: #定义PVC创建存储卷的空间大小
requests:
storage: 2Gi #使用大小,要比PV的值小,如果容器已运行,不随意变更大小。
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-datadir-pvc-2
namespace: default
spec:
accessModes:
- ReadWriteOnce
volumeName: zookeeper-datadir-pv-2
resources:
requests:
storage: 3Gi
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: zookeeper-datadir-pvc-3
namespace: default
spec:
accessModes:
- ReadWriteOnce
volumeName: zookeeper-datadir-pv-3
resources:
requests:
storage: 4Gi
#pod调用
[root@localhost7C pv]# cat nginx.yaml
kind: Deployment
apiVersion: apps/v1
metadata:
name: nginx1
namespace: default
spec:
replicas: 1
selector:
matchLabels:
app: nginx-selector
template:
metadata:
labels:
app: nginx-selector
spec:
containers:
- name: magedu-nginx-container
image: harbor.zzhz.com/baseimage/nginx:latest
#command: ["/apps/tomcat/bin/run_tomcat.sh"]
#imagePullPolicy: IfNotPresent
imagePullPolicy: Always
ports:
- containerPort: 80
protocol: TCP
name: http
volumeMounts:
- mountPath: "/zookeeper/data" #pod挂载路径
name: zookeeper-datadir-pvc-1 #调用volumes名称
volumes: #定义类型
- name: zookeeper-datadir-pvc-1 #自定义名称
persistentVolumeClaim:
claimName: zookeeper-datadir-pvc-1 #调用PVC
---
kind: Service
apiVersion: v1
metadata:
labels:
app: magedu-nginx-service-label
name: magedu-nginx-service
namespace: default
spec:
type: NodePort
ports:
- name: http
port: 80
protocol: TCP
targetPort: 80
nodePort: 30080
selector:
app: nginx-selector
[root@localhost7C pv]# kubectl get persistentvolumes
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
zookeeper-datadir-pv-1 5Gi RWO Retain Bound default/zookeeper-datadir-pvc-1 15m
zookeeper-datadir-pv-2 5Gi RWO Retain Bound default/zookeeper-datadir-pvc-2 16m
zookeeper-datadir-pv-3 5Gi RWO Retain Bound default/zookeeper-datadir-pvc-3 16m
[root@localhost7C pv]# kubectl get persistentvolumeclaims
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
zookeeper-datadir-pvc-1 Bound zookeeper-datadir-pv-1 5Gi RWO 16m
zookeeper-datadir-pvc-2 Bound zookeeper-datadir-pv-2 5Gi RWO 16m
zookeeper-datadir-pvc-3 Bound zookeeper-datadir-pv-3 5Gi RWO 16m
[root@localhost7C pv]# kubectl describe persistentvolume zookeeper-datadir-pv-1
Name: zookeeper-datadir-pv-1
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolume","metadata":{"annotations":{},"name":"zookeeper-datadir-pv-1"},"spec":{"accessModes":["ReadWri...
pv.kubernetes.io/bound-by-controller: yes
Finalizers: [kubernetes.io/pv-protection]
StorageClass:
Status: Bound
Claim: default/zookeeper-datadir-pvc-1
Reclaim Policy: Retain
Access Modes: RWO
VolumeMode: Filesystem
Capacity: 5Gi
Node Affinity: <none>
Message:
Source:
Type: NFS (an NFS mount that lasts the lifetime of a pod)
Server: 192.168.80.110
Path: /data/k8sdata/magedu/zookeeper-datadir-1
ReadOnly: false
Events: <none>
[root@localhost7C pv]# kubectl describe persistentvolumeclaims zookeeper-datadir-pvc-1
Name: zookeeper-datadir-pvc-1
Namespace: default
StorageClass:
Status: Bound
Volume: zookeeper-datadir-pv-1
Labels: <none>
Annotations: kubectl.kubernetes.io/last-applied-configuration:
{"apiVersion":"v1","kind":"PersistentVolumeClaim","metadata":{"annotations":{},"name":"zookeeper-datadir-pvc-1","namespace":"default"},"sp...
pv.kubernetes.io/bind-completed: yes
Finalizers: [kubernetes.io/pvc-protection]
Capacity: 5Gi
Access Modes: RWO
VolumeMode: Filesystem
Mounted By: nginx1-5b7d98d47c-58zjd
Events: <none>
#测试
[root@localhost7C pv]# kubectl exec -it nginx1-5b7d98d47c-58zjd bash
root@nginx1-5b7d98d47c-58zjd:/# df -h
Filesystem Size Used Avail Use% Mounted on
overlay 15G 5.0G 10G 34% /
tmpfs 64M 0 64M 0% /dev
tmpfs 982M 0 982M 0% /sys/fs/cgroup
/dev/mapper/centos-root 15G 5.0G 10G 34% /etc/hosts
192.168.80.110:/data/k8sdata/magedu/zookeeper-datadir-1 20G 9.2G 11G 46% /zookeeper/data
shm 64M 0 64M 0% /dev/shm
[root@localhost7C pv]# kubectl exec -it nginx1-5b7d98d47c-58zjd bash
root@nginx1-5b7d98d47c-58zjd:/# ls /zookeeper/data/
passwd