k8s的pv和pvc简述

pvc:资源需要指定:
1.accessMode:访问模型;对象列表:
    ReadWriteOnce – the volume can be mounted as read-write by a single node:  RWO - ReadWriteOnce一人读写
    ReadOnlyMany – the volume can be mounted read-only by many nodes:          ROX - ReadOnlyMany 多人只读
    ReadWriteMany – the volume can be mounted as read-write by many nodes:     RWX - ReadWriteMany多人读写
2.resource:资源限制(比如:定义5GB空间,我们期望对应的存储空间至少5GB。)    
3.selector:标签选择器。不加标签,就会在所有PV找最佳匹配。
4.storageClassName:存储类名称:
5.volumeMode:指后端存储卷的模式。可以用于做类型限制,哪种类型的PV可以被当前claim所使用。
6.volumeName:卷名称,指定后端PVC(相当于绑定)

PV和PVC是一一对应关系,当有PV被某个PVC所占用时,会显示banding,其它PVC不能再使用绑定过的PV。
PVC一旦绑定PV,就相当于是一个存储卷,此时PVC可以被多个Pod所使用。(PVC支不支持被多个Pod访问,取决于访问模型accessMode的定义)。
PVC若没有找到合适的PV时,则会处于pending状态。
PV是属于集群级别的,不能定义在名称空间中。
PVC时属于名称空间级别的。
PV的reclaim policy选项:
   默认是Retain保留,保留生成的数据。
   可以改为recycle回收,删除生成的数据,回收pv
   delete,删除,pvc解除绑定后,pv也就自动删除。

例:在nfs服务器上,使用nfs创建多个数据卷,在k8s集群中定义PV/PVC,让pod关联PVC
1.在/data/volumes/创建多个目录:v1,v2,v3,v4,v5,修改/etc/exports文件,使数据卷单独输出。

1 /data/volumes/v1  192.168.1.0/24(rw,no_root_squash)
2 /data/volumes/v2  192.168.1.0/24(rw,no_root_squash)
3 /data/volumes/v3  192.168.1.0/24(rw,no_root_squash)
4 /data/volumes/v4  192.168.1.0/24(rw,no_root_squash)
5 /data/volumes/v5  192.168.1.0/24(rw,no_root_squash)

exportfs -arv:显示nfs当前输出的可以挂载的数据卷。
showmount -e :显示nfs导出的数据卷
2.在k8s集群中定义pv:

 1 vim pv-demo.yaml
 2 apiVersion: v1
 3 kind: PersistentVolume
 4 metadata:
 5   name: pv001
 6   labels:
 7     name: pv001
 8 spec:
 9   nfs:
10     path: /data/volumes/v1
11     server: k8s-node2
12   accessModes: ["ReadWriteMany","ReadWriteOnce","ReadOnlyMany"]
13   capacity:
14     storage: 2Gi  
15 ---
16 ...pv002
17 ---
18 ...pv003
19     ...创建5个以上内容,修改name和path等参数

应用:kubectl apply -f pv-demo.yaml
查看:kubectl get pv

1 NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
2 pv001   2Gi        RWO,ROX,RWX    Retain           Available                                           56m
3 pv002   5Gi        RWO,ROX        Retain           Available                                           56m
4 pv003   3Gi        ROX,RWX        Retain           Available                                           56m
5 pv004   10Gi       RWO            Retain           Available                                           56m
6 pv005   15Gi       ROX            Retain           Available                                           56m

3.创建PVC和pod

 1 vim pod-pvc.yaml
 2 apiVersion: v1
 3 kind: PersistentVolumeClaim
 4 metadata:
 5   name: mypvc
 6   namespace: default
 7 spec:
 8   accessModes: ["ReadWriteOnce"]  ##注:这个访问模型必须是PV中存在的访问模型的子集,否则会找不到合适的PV,会一直Pending。
 9   resources:
10     requests:
11       storage: 6Gi
12 ---
13 apiVersion: v1
14 kind: Pod
15 metadata:
16   name: myapp-pv
17   namespace: default
18 spec:
19   containers:
20   - name: myapp
21     image: ikubernetes/myapp:v1
22     imagePullPolicy: IfNotPresent
23     ports:
24     - name: html
25       containerPort: 80
26     volumeMounts:
27     - name: nfs
28       mountPath: "/usr/share/nginx/html"    
29   volumes:
30   - name: nfs
31     persistentVolumeClaim:
32       claimName: mypvc

应用:kubectl apply -f pod-pvc.yaml

 1 查看pvc:kubectl get pvc
 2 NAME    STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
 3 mypvc   Bound    pv004    10Gi       RWO                           4s
 4 查看pv:kubectl get pv
 5 NAME    CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM           STORAGECLASS   REASON   AGE
 6 pv001   2Gi        RWO,ROX,RWX    Retain           Available                                           56m
 7 pv002   5Gi        RWO,ROX        Retain           Available                                           56m
 8 pv003   3Gi        ROX,RWX        Retain           Available                                           56m
 9 pv004   10Gi       RWO            Retain           Bound       default/mypvc                           56m
10 pv005   15Gi       ROX            Retain           Available                                           56m 、

如此pvc就绑定在合适的pv上了。绑定的pv是pv004,说明pod的/usr/share/nginx/html挂载在nfs服务器/data/volumes/v4目录下。
4.查看pod:kubectl get pods -owide

1 NAME       READY   STATUS    RESTARTS   AGE   IP             NODE        NOMINATED NODE   READINESS GATES
2 myapp-pv   1/1     Running   0          24s   10.244.1.141   k8s-node2   <none>           <none>

5.在nfs服务器上,找到/data/volumes/v4目录,写个测试文件:

1 vi /data/volumes/v4/index.html
2 <h1>Smbands</h1>

测试:访问podIP

1 curl 10.244.1.141
2 <h1>Smbands</h1>

 

posted @ 2019-05-13 18:04  zh_Revival  阅读(12784)  评论(0编辑  收藏  举报