pv有俩种提供方式,静态和动态。前面我们讲述了静态方式,静态pv:由集群管理员创建多个pv,它们携带着真实存储信息。我们能看出静态方式是有缺陷的,当多个用户,有多种不同的需求,我们都要手动的为他配置存储。这样是非常繁琐的。所以我们需要用动态的。
动态pv: 当管理员创建的静态PV都不匹配用户的PVC时,集群可能会尝试专门地供给 volume给PVC。这种供给基于StorageClass。
(1)StorageClass提供了一种描述存储类(class)的方法,不同的class可能会映射到不同的服务质量等级和备份策略或其他策略等。
(2)每个 StorageClass 都包含 provisioner、parameters 和 reclaimPolicy 字段, 这些字段会在 StorageClass需要动态分配 PersistentVolume 时会使用到。
(3)StorageClass的属性
Provisioner(存储分配器):用来决定使用哪个卷插件分配 PV,该字段必须指定。可以指 定内部分配器,也可以指定外部分配器。外部分配器的代码地址为: kubernetes- incubator/external-storage,其中包括NFS和Ceph等。
Reclaim Policy(回收策略):通过reclaimPolicy字段指定创建的Persistent Volume的回收 策略,回收策略包括:Delete 或者 Retain,没有指定默认为Delete。
更多属性查看:https://kubernetes.io/zh/docs/concepts/storage/storage-classes/
NFS Client Provisioner是一个automatic provisioner,使用NFS作为存储,自动创建PV和对应的 PVC,本身不提供NFS存储,需要外部先有一套NFS存储服务。
PV以 ${namespace}-${pvcName}-${pvName}的命名格式提供(在NFS服务器上)
PV回收的时候以 archieved-${namespace}-${pvcName}-${pvName} 的命名格式(在NFS 服务器上)
nfs-client-provisioner源码地址:https://github.com/kubernetes-incubator/external- storage/tree/master/nfs-client
NFS动态分配PV方法步骤如下:
搜索nfs-client-provisioner源码地址:https://github.com/kubernetes-incubator/external- storage/tree/master/nfs-client,根据官方教程一步步来实现。
开始配置之前,先将环境清理一下:
cd vol
kubectl delete -f . ##将上次实验设置的内容都清除一下
开始配置:
(1)首先创建rbac.yml文件,此文件是基于角色,用来做认证的。
cd vol
mkdir nfs-client
cd nfs-client
\vi rbac.yml
vim rbac.yml ## 直接从官方文档复制进去,不用做改变。
vim deployment.yml
vim class.yml
(4)创建pvc文件pvc.yml。就是官网上的test-claim.yml文件
vim pvc.yml
vim pod.yml
kubectl apply -f .
如果需要保留,我们可以将打包设置为true,这样当删除pvc时,他会自动为我们打包一份。
vim class.yml
kubectl delete -f class.yml
kubectl apply -f class.yml
这种打包,会消耗nfs服务器的空间容量。根据自己的需求而设定是否打包。
vim class.yml ##我们还是设置不打包
kubectl delete -f class.yml
kubectl apply -f class.yml
vim pvc.yml
【注】:
默认的 StorageClass 将被用于动态的为没有特定 storage class 需求的 PersistentVolumeClaims 配置存储:(只能有一个默认StorageClass)
如果没有默认StorageClass,PVC 也没有指定storageClassName 的值,那么意 味着它只能够跟 storageClassName 也是“”的 PV 进行绑定。
pvc当静态pv没有匹配,会去匹配动态pv,如果动态pv也不能匹配,就只能去匹配default。
vim pvc.yml
StatefulSet如何通过Headless Service维持Pod的拓扑状态
(1)创建Headless service
kubectl delete -f pvc.yml ##先将pvc给删除
mkdir nginx ##创建nginx目录
cd nginx
vim service.yml
vim statefulset.yml
kubectl apply -f statefulset.yml
kubectl get pod
vim statefulset.yml ##再多创建几个pod
上面使用statefulset控制器来增加pod,他是从web-0到web-n有序生成。我们还可以使用statefulset控制器来收缩,收缩他是从web-n到web-0有序减少的。
vim statefulset.yml
当回收完之后,再来解析域名就解析不到了
statefulset控制器通过pod名称编号来使每个pod具备唯一的网络标识。这时我们就有了有序而稳定的网络标识。接着我们就需要要持久的pvc
vim statefulset.yml
kubectl delete -f statefulset.yml
kubectl apply -f statefulset.yml
StatefulSet将应用状态抽象成了两种情况:
(1)拓扑状态:应用实例必须按照某种顺序启动。新创建的Pod必须和原来Pod的网络标识一样
(2)存储状态:应用的多个实例分别绑定了不同存储数据。
StatefulSet给所有的Pod进行了编号,编号规则是: ( s t a t e f u l s e t 名 称 ) − (statefulset名称)- (statefulset名称)−(序号),从0开始。
Pod被删除后重建,重建Pod的网络标识也不会改变,Pod的拓扑状态按照Pod的“名字+编号”的方 式固定下来,并且为每个Pod提供了一个固定且唯一的访问入口,即Pod对应的DNS记录。
vim statefulset.yml
vim statefulset.yml