一. pv卷的分类

1.静态pv卷      #我们自己使用pv类型的yaml部署的存储卷
               #(包含远程存储,如nfs的地址、目录等)
               #通过pvc调用   

2.动态pv卷     #我们手动创建pv卷,不需要创建pvc
              #但是要指定应用pod要使用的“storageclass”
              #集群会自动创建pvc去帮你绑定应用容器和pv

动态绑定机制

1. 用户创建一个PVC(或者之前就已经就为动态供给创建了),指定要求存储的大小和访问模式。           
2. master中有一个控制回路用于监控新的PVC,查找匹配的PV(如果有),并把PVC和PV绑定在一起。
3. 如果一个PV曾经动态供给到了一个新的PVC,那么这个回路会一直绑定这个PV和PVC。
4. 另外,用户总是至少能得到它们所要求的存储,但是volume可能超过它们的请求。
5. 一旦绑定了,PVC绑定就是专属的,无论它们的绑定模式是什么。

ps:
    #如果没找到匹配的PV,那么PVC会无限期得处于unbound未绑定状态,一旦PV可用了,PVC就会又变成绑定状态。
    #比如,如果一个供给了很多50G的PV集群,不会匹配要求100G的PVC。直到100G的PV添加到该集群时,PVC才会被绑定。

小知识

数据卷有一种保护机制,正在使用的pvc是不可以删除的(因为删除会导致数据丢失)

当启动pvc保护功能时,如果尝试删除一个pod正在使用的pvc,则不会立刻删除,pvc将在pod删除后再进行删除

(在pv中存储是以插件形式存在的,下图是一些常见的插件)(简单看看就好,大部分都不怎么用(* ̄3 ̄)╭)

#"PersistentVolume" 可以以资源提供者支持的任何方式挂载到主机上。
#如下图,供应商具有不同的功能,每个PV 的访问模式都将被设置为该卷支持的特定模式。

例如,NFS 可以支持多个读/写客户端,但特定的NFS PV可能以只读方式导出到服务器上。
(每个 PV 都有一套自己的用来描述特定功能的访问模式)

常见资源插件

kubernetes使用 (二十)   动态pv存储_kubernetes

 

二. pv卷的访问模式

1. ReadWriteOnce——该卷可以被"单个节点以读/写模式挂载"
2. ReadOnlyMany——该卷可以被"多个节点以只读模式挂载"
3. ReadWriteMany——该卷可以被"多个节点以读/写模式挂载"


#在命令行中,访问模式缩写为: 
1. RWO - ReadWriteOnce 
2. ROX - ReadOnlyMany 
3. RWX - ReadWriteMany

三. 回收策略

1. Retain(保留) #——手动回收   #pv不再使用时,也会保存等待管理员删除
2. Recycle(回收)#——基本擦除(rm -rf /thevolume/*)     
            #相当于对应卷下的所有内容 执行该命令*/
            #在新版本中以及废弃

3. Delete(删除)
              #——关联的存储资产(例如 AWS EBS、GCE PD、Azure Disk 
              #和 OpenStack Cinder 卷) 将被删除
              #可以被动态调度的就直接删除掉


#注意:
当前,只有 NFS 和 HostPath 支持回收策略。
AWS EBS、GCE PD、Azure Disk 和 Cinder 卷支持删除策略

四. pv的状态

#卷可以处于以下的某种状态:

1. Available(可用)#一块空闲资源还没有被任何声明绑定
2. Bound(已绑定)  #——卷已经被声明绑定
3. Released(已释放)#——声明被删除,但是资源还未被集群重新声明(等待k8s声明)
4. Failed(失败)  #——该卷的自动回收失败


#命令行会显示绑定到 PV 的 PVC 的名称

 

案例1 nfs (动态pv)

1. 所有节点安装nfs客户端

#所有节点安装nfs客户端
yum -y install nfs-utils

2. 配置nfs服务端

#安装nfs服务
yum install -y nfs-common nfs-utils rpcbind 


#创建共享目录(nfs服务端)
mkdir /nfsdata{1..5}
chmod 777 /nfsdata{1..5}
chown nfsnobody /nfsdata{1..5}


#添加共享配置
vim /etc/exports
#添加
/nfsdata1 *(rw,no_root_squash,no_all_squash,sync)
/nfsdata2 *(rw,no_root_squash,no_all_squash,sync)
/nfsdata3 *(rw,no_root_squash,no_all_squash,sync)
/nfsdata4 *(rw,no_root_squash,no_all_squash,sync)
/nfsdata5 *(rw,no_root_squash,no_all_squash,sync)


#重启服务
systemctl restart rpcbind
systemctl restart nfs


#查看共享
[root@k8s-node02 nfs]# showmount -e 192.168.1.22
Export list for 192.168.1.22:
/nfsdata5 *
/nfsdata4 *
/nfsdata3 *
/nfsdata2 *
/nfsdata1 *
/data/nfs *   #这个是上一次剩的

1. 创建pv卷

cat > pv-nfs.yaml <<EOF
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv1         
spec:
  capacity:        #
    storage: 10Gi   #设置卷大小为10G
  accessModes:      #类型
    - ReadWriteOnce   #只允许并发1个连接读写
  persistentVolumeReclaimPolicy: Retain     #回收机制,手动清除
  storageClassName: nfs    #类名,nfs. 自定义
  nfs:
    path: /nfsdata1        #访问路径
    server: 192.168.1.22
---
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv2      
spec:
  capacity:        
    storage: 5Gi        #5G大小
  accessModes:      
    - ReadOnlyMany      #多节点只读挂载
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs   
  nfs:
    path: /nfsdata2       
    server: 192.168.1.22
---
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv3         
spec:
  capacity:        
    storage: 1Gi        #1G容量
  accessModes:      
    - ReadOnlyMany      #多节点只读挂载
  persistentVolumeReclaimPolicy: Retain
  storageClassName: slow            #修改类名  
  nfs:
    path: /nfsdata3    #     
    server: 192.168.1.22
EOF

部署

kubectl create -f pv-nfs.yaml

查看pv卷

[root@k8s-master01 ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM            STORAGECLASS   REASON   AGE
my-pv    5Gi        RWX            Retain           Bound       default/my-pvc                           69m
nfspv1   10Gi       RWO            Retain           Available                    nfs                     7s
nfspv2   5Gi        ROX            Retain           Available                    nfs                     7s
nfspv3   1Gi        ROX            Retain           Available                    slow                    7s

 

2. 创建服务,直接调用pv

cat > sts-nginx.yaml <<EOF
apiVersion: v1
kind: Service
metadata:
  name: nginx
  labels:
    app: nginx
spec:
  ports:
  - port: 80
    name: web
  clusterIP: None        #无头服务,如果要使用StatefulSet控制器,就必须要设置这么一个svc调度
  selector:
    app: nginx          #匹配规则,匹配app信息为nginx的主机
---
apiVersion: apps/v1
kind: StatefulSet
metadata:
  name: web
spec:
  selector:
    matchLabels:
      app: nginx
  serviceName: "nginx"       #指定svc为nginx名称的pod
  replicas: 3
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: wangyanglinux/myapp:v2
        ports:
        - containerPort: 80
          name: web
        volumeMounts:
        - name: www
          mountPath: /usr/share/nginx/html

  volumeClaimTemplates:  #声明卷的请求模板
  - metadata:
      name: www
    spec:
      accessModes: [ "ReadWriteOnce" ]   #匹配绑定的类型,如果有RWO类型的pv卷
      storageClassName: "nfs"            #并且满足类型是nfs类型的才会被绑定
      resources:
        requests:
          storage: 1Gi  #指定调度卷时,卷大小必须满足1G大小
EOF

部署

kubectl create -f sts-nginx.yaml

查看信息

[root@k8s-master01 ~]# kubectl get pod | grep web
web-0                                              1/1     Running   0          40s
web-1                                              0/1     Pending   0          38s



#发现有一个pod没有调度成功,查看状态
kubectl describe pod web-1


返回信息
Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  running "VolumeBinding" 
filter plugin for pod "web-1": pod has unbound immediate PersistentVolumeClaims
  Warning  FailedScheduling  <unknown>  default-scheduler  running "VolumeBinding" 
filter plugin for pod "web-1": pod has unbound immediate PersistentVolumeClaims

#中文翻译

警告FailedScheduling<unknown>运行“VolumeBinding”的默认计划程序
pod“web-1”的过滤器插件:pod具有未绑定的立即PersistentVolumeClaimes 

这里pod没起来是因为他没有绑定到pv卷,为什么没有绑定到呢?

[root@k8s-master01 ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
my-pv    5Gi        RWX            Retain           Bound       default/my-pvc                              81m
nfspv1   10Gi       RWO            Retain           Bound       default/www-web-0   nfs                     11m
nfspv2   5Gi        ROX            Retain           Available                       nfs                     11m
nfspv3   1Gi        ROX            Retain           Available                       slow                    11m


#再回去看刚才应用的yaml
      accessModes: [ "ReadWriteOnce" ]   #匹配绑定的类型,如果有RWO类型的pv卷
#以上的pv卷,只要nfspv1满足这个条件(RWO),这个就是卷的类型的匹配机制
#并且每个pv卷都只能绑定一个pvc

查看pvc

[root@k8s-master01 ~]# kubectl get pvc
NAME        STATUS    VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc      Bound     my-pv    5Gi        RWX                           83m
www-web-0   Bound     nfspv1   10Gi       RWO            nfs            9m45s
www-web-1   Pending                                      nfs            9m36s


#可以看到上面的nfspv1已经被使用了,pvc也被创建了出来
#pvc来自于storageclass 存储类创建
#这个就是动态存储

 

修改pv卷信息

cat > pv-nfs.yaml <<EOF
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv1         
spec:
  capacity:      
    storage: 10Gi   
  accessModes:     
    - ReadWriteOnce   
  persistentVolumeReclaimPolicy: Retain    
  storageClassName: nfs  
  nfs:
    path: /nfsdata1      
    server: 192.168.1.22
---
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv2      
spec:
  capacity:        
    storage: 5Gi      
  accessModes:      
    - ReadWriteOnce     #修改模式
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs   
  nfs:
    path: /nfsdata2       
    server: 192.168.1.22
---
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv3         
spec:
  capacity:        
    storage: 1Gi        
  accessModes:      
    - ReadWriteOnce     #修改模式
  persistentVolumeReclaimPolicy: Retain
  storageClassName: slow             
  nfs:
    path: /nfsdata3    #     
    server: 192.168.1.22
EOF

更新配置

 kubectl apply -f pv-nfs.yaml 

查看

[root@k8s-master01 ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
my-pv    5Gi        RWX            Retain           Bound       default/my-pvc                              89m
nfspv1   10Gi       RWO            Retain           Bound       default/www-web-0   nfs                     20m
nfspv2   5Gi        RWO            Retain           Bound       default/www-web-1   nfs                     20m
nfspv3   1Gi        RWO            Retain           Available                       slow                    20m



#查看pod
[root@k8s-master01 ~]# kubectl get pod
NAME                                               READY   STATUS    RESTARTS   AGE
web-0                                              1/1     Running   0          15m
web-1                                              1/1     Running   0          15m
web-2                                              0/1     Pending   0          42s

发现还有一个pod没起来,再次查看

 

#查看pod信息
kubectl describe pod web-2


Events:
  Type     Reason            Age        From               Message
  ----     ------            ----       ----               -------
  Warning  FailedScheduling  <unknown>  default-scheduler  running "VolumeBinding" filter plugin for pod "web-2": pod has unbound immediate PersistentVolumeClaims
  Warning  FailedScheduling  <unknown>  default-scheduler  running "VolumeBinding" filter plugin for pod "web-2": pod has unbound immediate PersistentVolumeClaims

#Warning FailedScheduling<unknown>运行pod“web-2”的“VolumeBinding”筛选器插件的默认计划程序:pod已解除立即PersistentVolumeClaims的绑定 

#说明没有指定正确的sc,没有可用的pv进行分配


#查看pv卷
[root@k8s-master01 ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM               STORAGECLASS   REASON   AGE
my-pv    5Gi        RWX            Retain           Bound       default/my-pvc                              92m
nfspv1   10Gi       RWO            Retain           Bound       default/www-web-0   nfs                     23m
nfspv2   5Gi        RWO            Retain           Bound       default/www-web-1   nfs                     23m
nfspv3   1Gi        RWO            Retain           Available                       slow                    23m

#可以看到这块nfs的pv的类型为slow类型的
#回去看yaml
      storageClassName: "nfs"           
#发现,请求的是nfs模式的pv卷,所以不可用

修改pv卷的yaml

cat > pv-nfs.yaml <<EOF
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv1         
spec:
  capacity:      
    storage: 10Gi   
  accessModes:     
    - ReadWriteOnce   
  persistentVolumeReclaimPolicy: Retain    
  storageClassName: nfs  
  nfs:
    path: /nfsdata1      
    server: 192.168.1.22
---
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv2      
spec:
  capacity:        
    storage: 5Gi      
  accessModes:      
    - ReadWriteOnce     
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs   
  nfs:
    path: /nfsdata2       
    server: 192.168.1.22
---
apiVersion: v1
kind: PersistentVolume     
metadata:
  name: nfspv3         
spec:
  capacity:        
    storage: 1Gi        
  accessModes:      
    - ReadWriteOnce     
  persistentVolumeReclaimPolicy: Retain
  storageClassName: nfs              #修改sc的名称为nfs  
  nfs:
    path: /nfsdata3    #     
    server: 192.168.1.22
EOF

更新

kubectl apply -f pv-nfs.yaml

 查看

[root@k8s-master01 ~]# kubectl get pod | grep web
web-0                                              1/1     Running   0          28m
web-1                                              1/1     Running   0          28m
web-2                                              1/1     Running   0          13m


[root@k8s-master01 ~]# kubectl get pv
NAME     CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM               STORAGECLASS   REASON   AGE
my-pv    5Gi        RWX            Retain           Bound    default/my-pvc                              104m
nfspv1   10Gi       RWO            Retain           Bound    default/www-web-0   nfs                     34m
nfspv2   5Gi        RWO            Retain           Bound    default/www-web-1   nfs                     34m
nfspv3   1Gi        RWO            Retain           Bound    default/www-web-2   nfs                     34m


[root@k8s-master01 ~]# kubectl get pvc
NAME        STATUS   VOLUME   CAPACITY   ACCESS MODES   STORAGECLASS   AGE
my-pvc      Bound    my-pv    5Gi        RWX                           104m
www-web-0   Bound    nfspv1   10Gi       RWO            nfs            30m
www-web-1   Bound    nfspv2   5Gi        RWO            nfs            30m
www-web-2   Bound    nfspv3   1Gi        RWO            nfs            14m

还有sc的使用,下次再说o(* ̄▽ ̄*)o