kubernetes(14):k8s基于NFS部署storageclass实现pv自动供给
k8s基于NFS部署storageclass实现pv自动供给
https://www.cnblogs.com/Smbands/p/11059843.html
https://www.jianshu.com/p/1e870a8d6286
1. Storageclass解决PV手动创建需求
当每次创建 PVC 声明使用存储时,都需要去手动的创建 PV,来满足 PVC 的使用。
可以用一种机制来根据用户声明的存储使用量(PVC)来动态的创建对应的持久化存储卷(PV)。k8s 用 StorageClass 来实现动态创建 持久化存储。
1.1 实现原理:
存储控制器 Volume Controller,是用来专门处理持久化存储的控制器,其一个子控制循环 PersistentVolumeController 负责实现 PV 和 PVC 的绑定。
PersistentVolumeController 会 watch
kube-apiserver 的 PVC 对象。如果发现有 PVC对象创建,则会查看所有可用的 PV,
如果有则绑定,若没有,则会使用 StorageClass 的配置和 PVC 的描述创建 PV 进行绑定。
所谓将一个 PV 与 PVC 进行“绑定”,其实就是将这个PV对象的名字,填在了 PVC 对象的 spec.volumeName 字段上
1.2 使用方法
创建存储类,在资源清单中指明地址和共享挂载卷目录即可实现持久化存储
1.3 官网概念说明:
https://kubernetes.io/docs/concepts/storage/storage-classes/
1.4 项目地址:
https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
1.5 项目架构:
- 存储工程师创建存储类。
- 集群管理员维护集群中的存储资源。
- 用户或开发人员提交需求,(如在sts中只要在资源清单中编辑好volumeClaimTemplates中的需求,确保资源清单无误即可运行)这个过程不需要人工手动创建PVC。
2. 搭建storageclass
从官网中可以看出目前NFS并不支持做存储类,但是我们可以使用NFS的插件来支持。
NFS插件在Github中的项目地址:https://github.com/kubernetes-incubator/external-storage/tree/master/nfs-client/deploy
2.1 搭建NFS服务
与k8s集群同一网段下的主机,我这里选的是k8s-master
安装nfs服务:yum -y install nfs-utils (集群中的每个节点也要安装否则不支持)
启动nfs并设为开机自启:systemctl start nfs && systemctl enable nfs
创建共享挂载目录: mkdir -pv /data/volumes/{v1,v2,v3}
编辑/etc/exports文件,将目录共享到10.6.76.0/24这个网段中:
vi /etc/exports /data/volumes/v1 10.6.76.0/24(rw,no_root_squash) /data/volumes/v2 10.6.76.0/24(rw,no_root_squash) /data/volumes/v3 10.6.76.0/24(rw,no_root_squash) 发布:exportfs -avr exporting 10.6.76.0/24:/data/volumes/v3 exporting 10.6.76.0/24:/data/volumes/v2 exporting 10.6.76.0/24:/data/volumes/v1 查看:showmount –e 10.6.76.25 /data/volumes/v3 10.6.76.0/24 /data/volumes/v2 10.6.76.0/24 /data/volumes/v1 10.6.76.0/24
2.2 载/修改文件
下载项目:
for file in class.yaml deployment.yaml rbac.yaml test-claim.yaml ; do wget https://raw.githubusercontent.com/kubernetes-incubator/external-storage/master/nfs-client/deploy/$file ; done
修改资源清单(红色地方需要修改):
#vim deployment.yaml apiVersion: v1 kind: ServiceAccount metadata: name: nfs-client-provisioner --- kind: Deployment apiVersion: extensions/v1beta1 metadata: name: nfs-client-provisioner spec: replicas: 1 strategy: type: Recreate template: metadata: labels: app: nfs-client-provisioner spec: serviceAccountName: nfs-client-provisioner containers: - name: nfs-client-provisioner image: quay.io/external_storage/nfs-client-provisioner:v2.0.0 ##默认是latest版本 volumeMounts: - name: nfs-client-root mountPath: /persistentvolumes env: - name: PROVISIONER_NAME value: fuseim.pri/ifs ##这里的供应者名称必须和class.yaml中的provisioner的名称一致,否则部署不成功 - name: NFS_SERVER value: k8s-nfs ##这里写NFS服务器的IP地址或者能解析到的主机名 - name: NFS_PATH value: /data/volumes/v1 ##这里写NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending) volumes: - name: nfs-client-root nfs: server: k8s-nfs ##NFS服务器的IP或可解析到的主机名 path: /data/volumes/v1 ##NFS服务器中的共享挂载目录(强调:这里的路径必须是目录中最后一层的文件夹,否则部署的应用将无权限创建目录导致Pending)
2.3 部署
[root@k8s-master storageclass]# kubectl apply -f . storageclass.storage.k8s.io/managed-nfs-storage created serviceaccount/nfs-client-provisioner created deployment.extensions/nfs-client-provisioner created serviceaccount/nfs-client-provisioner unchanged clusterrole.rbac.authorization.k8s.io/nfs-client-provisioner-runner created clusterrolebinding.rbac.authorization.k8s.io/run-nfs-client-provisioner created role.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created rolebinding.rbac.authorization.k8s.io/leader-locking-nfs-client-provisioner created persistentvolumeclaim/test-claim created
2.4 查看服务
查看此NFS插件的pod是否部署成功
[root@k8s-master storageclass]# kubectl get pods NAME READY STATUS RESTARTS AGE nfs-client-provisioner-5558488b74-mkhbs 1/1 Running 0 24s [root@k8s-master storageclass]#
2.5 查看测试storageclass
[root@k8s-master storageclass]# kubectl get storageclasses.storage.k8s.io
NAME PROVISIONER AGE
managed-nfs-storage fuseim.pri/ifs 7m8s
这个就根据官方的 test-claim.yaml创建的
kind: PersistentVolumeClaim apiVersion: v1 metadata: name: test-claim annotations: volume.beta.kubernetes.io/storage-class: "managed-nfs-storage" spec: accessModes: - ReadWriteMany resources: requests: storage: 1Mi
3. 应用-参考statefulset
参考下一篇