此前在存储卷类型中介绍过pvc,以及其他的存储卷类型,本节笔记介绍pvc和nfs的使用
PVC
在pod中只需要定义存储卷,定义时只需要说明需要用到的大小,这个类型就是pvcl类型存储卷
而pvc存储卷必须与当前名称空间中的pvc,建立直接绑定关系,而pvc必须与pv建立绑定关系,而pv则是某个真正存储设备的存储空间,如下:
pv与pvs是kubernetes上抽象的,且标准的资源,与创建其他的pod中资源一样
用法
在存储类型中有很多存储类型被划分成预想的存储空间,这些存储空间被kubernetes映射到pv,在创建资源时,定义pod,且定义pod中的pvc即可。前提是pvc已经被创建好。pvc与pv之间没有被调用则空载,当pvc调用时则会与某个pv进行绑定(数据存放在pv之上)
pvc绑定那个pv取决于pod创建的用户定义volumes请求,如下:
1. 满足空间大小则绑定,不满足则不绑定
2. 满足访问类型:单读,单写,单读/写(pv只有)。多读写,多读,多写,
这样一来就分成大小三组来定义kubernetes。如下:
对于存储设备由存储管理员进行管理,pv与pvc由k8s集群管理员或者用户来管理。集群管理员将存储空间引入到集群内定义为PV,随后用户(创建pod用户)创建pvc(pv create),(创建pod之前创建pvc)pvc根据配置信息查找合适pv申请(如果没有适当的pv则绑定失败,直到创建一个合适的符合条件的pv)。
- pv与pvc是一 一对应的,一旦pv被某个pvc占用,显示绑定状态,就不会被其他pvc使用。但是,一旦pvc创建完成(与pv绑定),pvc就相当于一个存储卷,而存储卷(绑定过pv的pvc)能够被多个pod使用。而多个pod挂载一个pvc存储卷,这种方式就是多路访问(是否支持取决于accessMode)。
claimName: pvc名称
可以使用kubectl explain pvc
查看标准使用,其中pvc kind是PersistentVolumeClaim
,在spec中需要指明:
accessMode
(访问模型。是否支持多人读写,或者单人读写等。accessmode支持列表,意味着可以支持多中模式。这里定义的权限只能是存储设备的子集)
ReadWriteOnce
– 卷可以由单个节点以读写方式挂载
ReadOnlyMany
– 卷可以由许多节点以只读方式挂载
ReadWriteMany
– 卷可以由许多节点以读写方式挂载
RWO – 单路读写
ROX – 多路只读
RWX – 多路读写
并不是每个卷都支持多路,参考官网的表格,NFS多路单路都支持
resources
:资源限制。(至少多少空间)
selector
: 标签选择器。使用标签选择器进行绑定
storageClassName
:存储类名称
volumeMode
: 后端存储卷模式。PV类型限制。如果有合适的pv则会绑定,如果没有则会挂起
volumeName
: 存储卷名称。填写则直接绑定。
capacity
: 指定空间大小通过资源访问模型进行定义,关注resources,我们可以定义成Ei,Pi,Ti,Gi,Mi,Ki
storage
: 5Gi表示5G
apiSersion: v1
kind: PersistentVolume
metadata:
name: linuxea-5
labels:
name: v5
spec:
nfs:
path: /data/volumes/linuxea-5
server: 10.0.1.61
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 5Gi
创建
1. 准备存储(NFS)
10.0.1.61 创建几个目录进行单独的挂载,分别是linuxea-1-5
[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# mkdir linuxea-{1,2,3,4,5}
[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# ls
index.html linuxea-1 linuxea-2 linuxea-3 linuxea-4 linuxea-5 linuxea.html
[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# cat /etc/exports
/data/linuxea-volumes/linuxea-1 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-2 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-3 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-4 10.0.0.0/8(rw,no_root_squash)
/data/linuxea-volumes/linuxea-5 10.0.0.0/8(rw,no_root_squash)
[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# exportfs -arv
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-5
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-4
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-3
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-2
exporting 10.0.0.0/8:/data/linuxea-volumes/linuxea-1
[root@Linuxea-VM-Node_10_0_1_61 /data/linuxea-volumes]# showmount -e
Export list for Linuxea-VM-Node_10_0_1_61.dwhd.org:
/data/linuxea-volumes/linuxea-5 10.0.0.0/8
/data/linuxea-volumes/linuxea-4 10.0.0.0/8
/data/linuxea-volumes/linuxea-3 10.0.0.0/8
/data/linuxea-volumes/linuxea-2 10.0.0.0/8
/data/linuxea-volumes/linuxea-1 10.0.0.0/8
2. 创建pv
这里定义pv时候,不能定义在namespace。pv是集群级别的,不在名称空间中,所有的名称空间都可以用。但是pvc是属于名称空间的
namespace不能嵌套,namespcace属于集群资源 ,不能定义在名称空间中。所谓集群资源就是不能定义在名称空间中的。而pod,service必须定义在名称空间中。属于名称空间级别
我们之前,事先分别定义了5个pv,分别是1-5Gi的pv大小,支持单点读写和多路读写(稍后方便写入数据测试)。yaml如下:
[root@linuxea volume]# cat pv-demo.yaml
apiVersion: v1
kind: PersistentVolume
metadata:
name: linuxea-1
labels:
name: v1
spec:
nfs:
path: /data/volumes/linuxea-1
server: 10.0.1.61
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 1Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: linuxea-2
labels:
name: v2
spec:
nfs:
path: /data/volumes/linuxea-2
server: 10.0.1.61
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 2Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: linuxea-3
labels:
name: v3
spec:
nfs:
path: /data/volumes/linuxea-3
server: 10.0.1.61
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 3Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: linuxea-4
labels:
name: v4
spec:
nfs:
path: /data/volumes/linuxea-4
server: 10.0.1.61
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 4Gi
---
apiVersion: v1
kind: PersistentVolume
metadata:
name: linuxea-5
labels:
name: v5
spec:
nfs:
path: /data/volumes/linuxea-5
server: 10.0.1.61
accessModes: ["ReadWriteMany","ReadWriteOnce"]
capacity:
storage: 5Gi
定义完成后apply启动
[root@linuxea volume]# kubectl apply -f pv-demo.yaml
persistentvolume/linuxea-1 created
persistentvolume/linuxea-2 created
persistentvolume/linuxea-3 created
persistentvolume/linuxea-4 created
persistentvolume/linuxea-5 created
启动后使用kubectl get pv查看状态信息
[root@linuxea volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
linuxea-1 1Gi RWO,RWX Retain Available 3s
linuxea-2 2Gi RWO,RWX Retain Available 3s
linuxea-3 3Gi RWO,RWX Retain Available 3s
linuxea-4 4Gi RWO,RWX Retain Available 3s
linuxea-5 5Gi RWO,RWX Retain Available 3s
其中RECLAIM POLICY 叫回收策略:当一个pvc绑定某个pv,并且存储了数据,如果pv删掉,那么绑定就会失效。删除前存放有数据就会丢失,Retain保留。Recycle(回收),删除数据,将pv制空,让其他pv绑定。当然还有delelte,默认delete。参考https://kubernetes.io/docs/tasks/administer-cluster/change-pv-reclaim-policy/
。Available表示当前处于可用状态。
3. 创建pvc
resources的选择是要大于等于定义的resources值
当创建好pvc后,就算删除pvc,pod数据也会保留,因为pv的回收策略是Retain(取决于回收策略),也不会删除。因此,只要不删除pvc,而删除pod,就算pv策略是Recycle(回收),也不会被删除数据。
pvc是标准的k8s资源,存储在etcd中,只要etcd没有问题,pvc就没有问题,而pod是节点资源,运行在节点之上。其他资源保存在api server集群状态存储etcd当中。
- 在最新的版本中pv被绑定的状态下是不能够单独删除的。
kubectl delete pv PVNAME
PersistentVolumeClaim
是独特的kind,pvc需要定义namespace
在pvc中的accessModes
是pv accessModes
的子集,也就是说pv有权限,这里才有权限。在之前定义了PV的大小是1-5Gi,在这里定义的spec中storage: 5Gi
(这里打大小至少要大于等于才行),假如这里定义的大小在pv中不存在则会失效。这里仍然可以使用标签管理器管理。而后在pod中定义pvc名称和volumes挂载到相应的目录
-
我们事先已经定了pv大小,现在才能进行绑定
yaml
[root@linuxea volume]# cat pvc-demo.yaml
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: linuxea-pvc
namespace: default
spec:
accessModes: ["ReadWriteMany"]
resources:
requests:
storage: 5Gi
---
apiVersion: v1
kind: Pod
metadata:
name: linuxea-pvc-pod
namespace: default
spec:
containers:
- name: linuxea-pod1-pvc
image: "marksugar/nginx:1.14.a"
ports:
- containerPort: 88
volumeMounts:
- name: linuxea-image
mountPath: /data/wwwroot/
volumes:
- name: linuxea-image
persistentVolumeClaim:
claimName: linuxea-pvc
apply创建
[root@linuxea volume]# kubectl apply -f pvc-demo.yaml
persistentvolumeclaim/linuxea-pvc created
pod/linuxea-pvc-pod created
可使用kubectl get pvc查看已经创建好的pvc已经被Bound
[root@linuxea volume]# kubectl get pvc
NAME STATUS VOLUME CAPACITY ACCESS MODES STORAGECLASS AGE
linuxea-pvc Bound linuxea-5 5Gi RWO,RWX 6s
以及pod
[root@linuxea volume]# kubectl get pods -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE
linuxea-pvc-pod 1/1 Running 0 22s 172.16.4.7 linuxea.node-2.com <none>
而后创建pvc之后,可查看pv已经被绑定到linuxea-5上的pv上(大于等于5G)
[root@linuxea volume]# kubectl get pv
NAME CAPACITY ACCESS MODES RECLAIM POLICY STATUS CLAIM STORAGECLASS REASON AGE
linuxea-1 1Gi RWO,RWX Retain Available 2m
linuxea-2 2Gi RWO,RWX Retain Available 2m
linuxea-3 3Gi RWO,RWX Retain Available 2m
linuxea-4 4Gi RWO,RWX Retain Available 2m
linuxea-5 5Gi RWO,RWX Retain Bound default/linuxea-pvc 2m
也可以使用kubectl describe pods linuxea-pvc-pod|grep root查看信息
[root@linuxea volume]# kubectl describe pods linuxea-pvc-pod|grep root
/data/wwwroot/ from linuxea-image (rw)
pv写入测试
在集群内访问
[root@linuxea volume]# curl 172.16.4.7
linuxea-linuxea-pvc-pod.com-127.0.0.1/8 172.16.4.7/24
而后回到nfs修改
[root@Linuxea-VM-Node_10_0_1_61 ~]# echo `date` >> /data/linuxea-volumes/linuxea-5/index.html
在集群内第二次访问查看
[root@linuxea volume]# curl 172.16.4.7
linuxea-linuxea-pvc-pod.com-127.0.0.1/8 172.16.4.7/24
2018年 09月 23日 星期日 18:22:49 CST
[root@linuxea volume]#
由此可见,创建多大的pv,可能需要事先设定好,pvc才能适配,这种方式有些麻烦,可以考虑使用动态供给