kubernetes存储—动态pv、StatefulSet控制器

1.动态pv

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,根据官方教程一步步来实现。
kubernetes存储—动态pv、StatefulSet控制器_第1张图片
kubernetes存储—动态pv、StatefulSet控制器_第2张图片
开始配置之前,先将环境清理一下:
kubernetes存储—动态pv、StatefulSet控制器_第3张图片
kubernetes存储—动态pv、StatefulSet控制器_第4张图片

cd vol
kubectl delete -f .   ##将上次实验设置的内容都清除一下

kubernetes存储—动态pv、StatefulSet控制器_第5张图片
kubernetes存储—动态pv、StatefulSet控制器_第6张图片
kubernetes存储—动态pv、StatefulSet控制器_第7张图片
开始配置:
(1)首先创建rbac.yml文件,此文件是基于角色,用来做认证的。

cd vol 
mkdir nfs-client
cd nfs-client
\vi rbac.yml
vim rbac.yml   ## 直接从官方文档复制进去,不用做改变。

kubernetes存储—动态pv、StatefulSet控制器_第8张图片
(2)接着创建部署文件deployment.yml

vim deployment.yml

kubernetes存储—动态pv、StatefulSet控制器_第9张图片
kubernetes存储—动态pv、StatefulSet控制器_第10张图片
kubernetes存储—动态pv、StatefulSet控制器_第11张图片
kubernetes存储—动态pv、StatefulSet控制器_第12张图片
kubernetes存储—动态pv、StatefulSet控制器_第13张图片
kubernetes存储—动态pv、StatefulSet控制器_第14张图片
(3)接着创建存储类class.yml文件

vim class.yml

kubernetes存储—动态pv、StatefulSet控制器_第15张图片
(4)创建pvc文件pvc.yml。就是官网上的test-claim.yml文件

vim pvc.yml

kubernetes存储—动态pv、StatefulSet控制器_第16张图片
(5)创建pod.yml文件

vim pod.yml

kubernetes存储—动态pv、StatefulSet控制器_第17张图片
(6)运行生效

kubectl apply -f .

kubernetes存储—动态pv、StatefulSet控制器_第18张图片
kubernetes存储—动态pv、StatefulSet控制器_第19张图片
kubernetes存储—动态pv、StatefulSet控制器_第20张图片
kubernetes存储—动态pv、StatefulSet控制器_第21张图片
kubernetes存储—动态pv、StatefulSet控制器_第22张图片
kubernetes存储—动态pv、StatefulSet控制器_第23张图片
kubernetes存储—动态pv、StatefulSet控制器_第24张图片
在这里插入图片描述
kubernetes存储—动态pv、StatefulSet控制器_第25张图片
如果需要保留,我们可以将打包设置为true,这样当删除pvc时,他会自动为我们打包一份。

vim class.yml

kubernetes存储—动态pv、StatefulSet控制器_第26张图片

kubectl delete -f class.yml
kubectl apply -f class.yml

kubernetes存储—动态pv、StatefulSet控制器_第27张图片
kubernetes存储—动态pv、StatefulSet控制器_第28张图片
kubernetes存储—动态pv、StatefulSet控制器_第29张图片
在这里插入图片描述
kubernetes存储—动态pv、StatefulSet控制器_第30张图片
kubernetes存储—动态pv、StatefulSet控制器_第31张图片
这种打包,会消耗nfs服务器的空间容量。根据自己的需求而设定是否打包。

vim class.yml  ##我们还是设置不打包

kubernetes存储—动态pv、StatefulSet控制器_第32张图片

kubectl delete -f class.yml
kubectl apply -f class.yml

kubernetes存储—动态pv、StatefulSet控制器_第33张图片
pvc的需求我们也可以随时更改。

vim pvc.yml

kubernetes存储—动态pv、StatefulSet控制器_第34张图片
kubernetes存储—动态pv、StatefulSet控制器_第35张图片
在这里插入图片描述
kubernetes存储—动态pv、StatefulSet控制器_第36张图片
kubernetes存储—动态pv、StatefulSet控制器_第37张图片
【注】:
默认的 StorageClass 将被用于动态的为没有特定 storage class 需求的 PersistentVolumeClaims 配置存储:(只能有一个默认StorageClass)
如果没有默认StorageClass,PVC 也没有指定storageClassName 的值,那么意 味着它只能够跟 storageClassName 也是“”的 PV 进行绑定。
pvc当静态pv没有匹配,会去匹配动态pv,如果动态pv也不能匹配,就只能去匹配default。

vim pvc.yml

kubernetes存储—动态pv、StatefulSet控制器_第38张图片
kubernetes存储—动态pv、StatefulSet控制器_第39张图片
kubernetes存储—动态pv、StatefulSet控制器_第40张图片
在这里插入图片描述

2.StatefulSet控制器

StatefulSet如何通过Headless Service维持Pod的拓扑状态
(1)创建Headless service

kubectl delete -f pvc.yml  ##先将pvc给删除
mkdir nginx  ##创建nginx目录
cd nginx
vim service.yml

kubernetes存储—动态pv、StatefulSet控制器_第41张图片
kubernetes存储—动态pv、StatefulSet控制器_第42张图片
(2)创建StatefulSet控制器:

vim statefulset.yml

kubernetes存储—动态pv、StatefulSet控制器_第43张图片

kubectl apply -f statefulset.yml
kubectl get pod

kubernetes存储—动态pv、StatefulSet控制器_第44张图片
kubernetes存储—动态pv、StatefulSet控制器_第45张图片
kubernetes存储—动态pv、StatefulSet控制器_第46张图片
kubernetes存储—动态pv、StatefulSet控制器_第47张图片
kubernetes存储—动态pv、StatefulSet控制器_第48张图片

vim statefulset.yml   ##再多创建几个pod

kubernetes存储—动态pv、StatefulSet控制器_第49张图片
kubernetes存储—动态pv、StatefulSet控制器_第50张图片
kubernetes存储—动态pv、StatefulSet控制器_第51张图片
kubernetes存储—动态pv、StatefulSet控制器_第52张图片
上面使用statefulset控制器来增加pod,他是从web-0到web-n有序生成。我们还可以使用statefulset控制器来收缩,收缩他是从web-n到web-0有序减少的。

vim statefulset.yml

kubernetes存储—动态pv、StatefulSet控制器_第53张图片
kubernetes存储—动态pv、StatefulSet控制器_第54张图片
当回收完之后,再来解析域名就解析不到了
kubernetes存储—动态pv、StatefulSet控制器_第55张图片
statefulset控制器通过pod名称编号来使每个pod具备唯一的网络标识。这时我们就有了有序而稳定的网络标识。接着我们就需要要持久的pvc

vim statefulset.yml

kubernetes存储—动态pv、StatefulSet控制器_第56张图片
kubernetes存储—动态pv、StatefulSet控制器_第57张图片

kubectl delete -f statefulset.yml
kubectl apply -f statefulset.yml

kubernetes存储—动态pv、StatefulSet控制器_第58张图片
kubernetes存储—动态pv、StatefulSet控制器_第59张图片
kubernetes存储—动态pv、StatefulSet控制器_第60张图片
在这里插入图片描述
kubernetes存储—动态pv、StatefulSet控制器_第61张图片
kubernetes存储—动态pv、StatefulSet控制器_第62张图片
在这里插入图片描述
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

kubernetes存储—动态pv、StatefulSet控制器_第63张图片
kubernetes存储—动态pv、StatefulSet控制器_第64张图片
kubernetes存储—动态pv、StatefulSet控制器_第65张图片
kubernetes存储—动态pv、StatefulSet控制器_第66张图片

vim statefulset.yml

kubernetes存储—动态pv、StatefulSet控制器_第67张图片
kubernetes存储—动态pv、StatefulSet控制器_第68张图片
statefullset可以用于部署mysal主从集群
kubernetes存储—动态pv、StatefulSet控制器_第69张图片

你可能感兴趣的:(kubernetes存储—动态pv、StatefulSet控制器)