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   项目架构:

  1. 存储工程师创建存储类。
  2. 集群管理员维护集群中的存储资源。
  3. 用户或开发人员提交需求,(如在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

参考下一篇

 

posted on 2019-10-14 13:51  光阴8023  阅读(2523)  评论(0编辑  收藏  举报