在讲PersistentVolume(PV)
以前,咱们须要先讲一下Volume
html
Volume详情可见上一章: kubernetes系列(十三) - 存储之Volume
nginx
Volume
是被定义在pod上的(emptyDir或者hostPath
),属于计算资源
的一部分。因此Volume
是有局限性的,由于在实际的运用过程当中,咱们一般会先定义一个网络存储,而后从中划出一个网盘并挂接到虚拟机上。web
为了屏蔽底层存储实现的细节,让用户方便使用,同时让管理员方便管理。Kubernetes从V1.0版本就引入了PersistentVolume(PV)
和与之相关联的PersistentVolumeClaim(PVC)
两个资源对象来实现对存储的管理shell
PV
能够被理解成kubernetes
集群中的某个网络存储对应的一块存储,它与Volume
相似,可是有以下的区别:api
Node
,可是能够在每一个Node
上访问pod
被删除了,PV
仍然存在,这点与Volume
不一样PersistentVolume(PV)
是由管理员设置的存储,它是群集的一部分。就像节点是集群中的资源同样,PV也是集群中的资源。PV是Volume之类的卷插件,但具备独立于使用PV的Pod的生命周期。此API对象包含存储实现的细节,即NFS
、iSCSl
或特定于云供应商的存储系统。服务器
PersistentVolumeClaim(PVC)
是用户存储的请求。它与Pod类似。Pod消耗节点资源,PVC
消耗PV
资源。Pod能够请求特定级别的资源(CPU和内存)。声明能够请求特定的大小和访问模式(例如,能够以读/写一次或只读屡次模式挂载)网络
pvc
是一种pv
的请求方案,PVC定义我当前须要什么样类型的PV,而后会自动在当前存在的pv中选取一个匹配度最高的pvapp
一个PVC
只能绑定一个PV
!!less
简单来讲spa
由集群管理员手动建立的一些PV
完整的概念
集群管理员建立一些PV。它们带有可供群集用户使用的实际存储的细节。它们存在于KubernetesAPl中,可用于消费。
简单来讲
配置了容许动态PV的策略后,若是当前存在的PV没法知足PVC的要求,则会动态建立PV.
动态PV了解便可
完整的概念
当管理员建立的静态PV都不匹配用户的PersistentVolumeClaim
时,集群可能会尝试动态地为PVC建立卷。此配置基于StorageClasses
,因此要启用基于存储级别的动态存储配置要求:
StorageClasses
StorageClasses
才能进行动态建立API server
上的DefaultStorageClass
[准入控制器]。例如,经过确保DefaultStorageClass
位于API server
组件的--admission-control
标志,使用逗号分隔的有序值列表中,能够完成此操做PVC保护的目的是确保由pod正在使用的PVC不会从系统中移除,由于若是被移除的话可能会致使数据丢失 当启用PVC保护alpha功能时,若是用户删除了一个pod正在使用的PVC,则该PVC不会被当即删除。PVC的删除将被推迟,直到PVC再也不被任何 pod使用
PersistentVolume
类型以插件形式实现. kubernetes
目前支持如下类型(排名不分前后):
跟上一集中的volume支持的类型差很少
GCEPersistentDisk
AWSElasticBlockStore
AzureFile
AzureDisk
FC(Fibre Channel)
FlexVolume
Flocker
NFS
iSCSI
RBD(Ceph Block Device)
CephFS
Cinder(OpenStack block storage)
Glusterfs
VsphereVolume
Quobyte
Volumes
HostPath
VMware
Photon
Portworx Volumes
Scalelo Volumes
StorageOS
apiVersion: v1 kind: PersistentVolume metadata: name:pve003 spec: capacity: # 卷的大小为5G storage: 5Gi # 存储卷的类型为:文件系统 volumeMode: Filesystem # 访问策略:该卷能够被单个节点以读/写模式挂载 accessModes: - ReadNriteOnce # 回收策略:回收 persistentVolumeReclaimPolicy: Recycle # 对应的具体底层存储的分级 # 好比有些固态或者其余存储类型比较快,就能够定义为strong storageClassName: slow # (可选的)挂载选项 mountOptions: - hard - nfsvers=4.1 # 具体对应的真实底层存储类型为nfs # 挂载到172服务器下的/tmp目录 nfs: path: /tmp server: 172.17.0.2
访问模式accessModes
一共有三种:
ReadWriteOnce
: 该卷能够被单个节点以读/写模式挂载ReadOnlyMany
: 该卷能够被多个节点以只读模式挂载ReadWriteMany
: 该卷能够被多个节点以读/写模式挂载在命令行cli中,三种访问模式能够简写为:
RWO
- ReadWriteOnce
ROX
- ReadOnlyMany
RWX
- ReadWriteMany
但不是全部的类型的底层存储都支持以上三种,每种底层存储类型支持的都不同!!
Volume Plugin | ReadWriteOnce | ReadOnlyMany | ReadWriteMany |
---|---|---|---|
AWSElasticBlockStore | ✓ | - | - |
AzureFile | ✓ | ✓ | ✓ |
AzureDisk | ✓ | - | - |
CephFS | ✓ | ✓ | ✓ |
Cinder | ✓ | - | - |
FC | ✓ | ✓ | - |
FlexVolume | ✓ | ✓ | - |
Flocker | ✓ | - | - |
GCEPersistentDisk | ✓ | ✓ | - |
Glusterfs | ✓ | ✓ | ✓ |
HostPath | ✓ | - | - |
iSCSI | ✓ | ✓ | - |
PhotonPersistentDisk | ✓ | - | - |
Quobyte | ✓ | ✓ | ✓ |
NFS | ✓ | ✓ | ✓ |
RBD | ✓ | ✓ | - |
VsphereVolume | ✓ | - | - |
PortworxVolume | ✓ | - | ✓ |
ScaleIO | ✓ | ✓ | - |
Retain
(保留): pv被删除后会保留内存,手动回收Recycle
(回收): 删除卷下的全部内容(rm-rf /thevolume/*
)Delete
(删除): 关联的存储资产(例如AWS EBS、GCE PD、Azure Disk 和OpenStack Cinder卷)将被删除。即直接把卷给删除了NFS
和HostPath
支持Recycle
回收策略最新版本中的
Recycle
已被废弃,截图以下
附:具体官网文档详细说明连接点击此处
Delete
删除策略PV能够处于如下的某种状态:
Available
(可用): 块空闲资源尚未被任何声明绑定Bound
(已绑定): 卷已经被声明绑定, 注意:可是不必定不能继续被绑定,看accessModes
而定Released
(已释放): 声明被删除,可是资源还未被集群从新声明Failed
(失败): 该卷的自动回收失败命令行会显示绑定到PV的PVC的名称
注:如下内容笔者没有实际尝试过,仅作记录使用
yum install -y nfs-common nfs-utils rpcbind mkdir /nfsdata chmod 777 /nfsdata chown nfsnobody /nfsdata cat /etc/exports /nfsdata *(rw,no_root_squash,no_all_squash,sync) systemctl start rpcbind systemctl start nfs
yum -y install nfs-utils rpcbind mkdir /test showmount -e 192.168.66.100 mount -t nfs 192.168.66.100:/nfsdata /test/ cd /test/ ls umount /test/
apiVersion: v1 kind: PersistentVolume metadata: name: nfspv1 spec: capacity: storage: 10Gi accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain storageClassName: nfs nfs: path: /nfsdata server: 192.168.66.100
apiVersion: v1 kind: Service metadata: name: nginx labels: app: nginx spec: ports: - port: 80 name: web clusterIP: None selector: app: nginx --- apiVersion: apps/v1 kind: StatefulSet metadata: name: web spec: selector: matchLabels: app: nginx serviceName: "nginx" replicas: 3 template: metadata: labels: app: nginx spec: containers: - name: nginx image: k8s.gcr.io/nginx-slim:0.8 ports: - containerPort: 80 name: web volumeMounts: - name: www mountPath: /usr/share/nginx/html volumeClaimTemplates: - metadata: name: www spec: accessModes: [ "ReadWriteOnce" ] storageClassName: "nfs" resources: requests: storage: 1Gi
StatefulSet
为每一个Pod副本建立了一个DNS域
名,这个域名的格式为:S(podname).(headless servername)
也就意味着服务间是经过Pod域名来通讯而非PodIP,由于当Pod所在Node发生故障时,Pod会被飘移到其它 Node上,PodIP会发生变化,可是Pod域名不会有变化
StatefulSet
使用Headless服务
来控制Pod的域名,这个域名的FQDN为:S(servicename).$(namespace).svc.cluster.local
其中,“cluster.local”指的是集群的域名
volumeClaimTemplates
,为每一个Pod 建立一个pvo,pvc的命名规则匹配模式:(volumeClaimTemplates.name)-(pod_name)
好比上面的
volumeMounts.name=www,Podname-web-[0-2]
,所以建立出来的PVC是www-web-0、www-web-一、 www-web-2