K8SNFSProvisioner
组件K8SNFSProvisioner是Kubernetes中存储资源动态分配器,不过现在已经已经停止维护,且在Kubernetes1.20.x及以后版本已经不兼容。
官方比较推荐的NFS动态分配器组组件为NFSSubdirExternalProvisioner,本文将介绍并部署如何使用该组件。
系统环境:
操作系统:CentOS7.9Docker版本:19.03.13Kubernetes版本:1.20.2NFSSubdirExternalProvisioner版本:v4.0.0一、什么是NFS-Subdir-External-Provisioner存储组件NFSsubdirexternalprovisioner是一个存储资源自动调配器,它可用将现有的NFS服务器通过持久卷声明来支持Kubernetes持久卷的动态分配。自动新建的文件夹将被命名为{namespace}-{pvcName}-{pvName},由三个资源名称拼合而成。
此组件是对nfs-client-provisioner的扩展,nfs-client-provisioner已经不提供更新,且nfs-client-provisioner的Github仓库已经迁移到NFS-Subdir-External-Provisioner的仓库。
二、创建NFSServer端我们先创建NFSServer端才能够正常使用NFS文件系统,下面介绍下如何在CentOS7系统中安装NFSServer的过程。
关闭防火墙为了方便部署,我们直接将防火墙关闭,可以执行下面命令:
systemctlstopfirewalldsystemctldisablefirewalld安装nfs-utils和rpcbind
为了能够正常使用NFS,我们需要在使用Kubernetes集群中的所有服务器上安装以下依赖,命令如下:
yuminstall-ynfs-utilsrpcbind创建存储数据的文件夹
创建用于共享数据的文件夹,命令如下:
#创建文件夹mkdir/nfs#更改归属组与用户chown-Rnfsnobody:nfsnobody/nfs配置NFSServer
配置NFSServer,指定共享文件夹目录以及能够使用共享文件夹的IP段,命令如下:
#编辑exportsvi/etc/exports#输入以下内容(格式:FS共享的目录NFS客户端地址1(参数1,参数2,...)客户端地址2(参数1,参数2,...))/nfs..2.0/24(rw,async,no_root_squash)
如果设置为/nfs*(rw,async,no_root_squash)则对所以的IP都有效
常用选项:ro:客户端挂载后,其权限为只读,默认选项;rw:读写权限;sync:同时将数据写入到内存与硬盘中;async:异步,优先将数据保存到内存,然后再写入硬盘;Secure:要求请求源的端口小于用户映射:root_squash:当NFS客户端使用root用户访问时,映射到NFS服务器的匿名用户;no_root_squash:当NFS客户端使用root用户访问时,映射到NFS服务器的root用户;all_squash:全部用户都映射为服务器端的匿名用户;anonuid=UID:将客户端登录用户映射为此处指定的用户uid;anongid=GID:将客户端登录用户映射为此处指定的用户gid启动NFSServer可与执行下面命令启动且开机就启动NFSServer:
##重启rpcbindsystemctlrestartrpcbind##重启NFSServer并设置开机就启动systemctlenablenfssystemctlrestartnfs
到此我们就成功启动NFSServer,这里服务器IP为..2.11,NFS目录为/nfs。
三、创建ServiceAccount现在的Kubernetes集群大部分是基于RBAC的权限控制,所以我们需要创建一个拥有一定权限的ServiceAccount与后面要部署的NFSSubdirExternaProvisioner组件绑定。
创建RBAC资源文件创建RBAC资源文件nfs-rbac.yaml,文件内容如下:
apiVersion:v1kind:ServiceAccountmetadata:name:nfs-client-provisionernamespace:kube-system---kind:ClusterRoleapiVersion:rbac.authorization.k8s.io/v1metadata:name:nfs-client-provisioner-runnerrules:-apiGroups:[""]resources:["persistentvolumes"]verbs:["get","list","watch","create","delete"]-apiGroups:[""]resources:["persistentvolumeclaims"]verbs:["get","list","watch","update"]-apiGroups:["storage.k8s.io"]resources:["storageclasses"]verbs:["get","list","watch"]-apiGroups:[""]resources:["events"]verbs:["create","update","patch"]---kind:ClusterRoleBindingapiVersion:rbac.authorization.k8s.io/v1metadata:name:run-nfs-client-provisionersubjects:-kind:ServiceAccountname:nfs-client-provisionernamespace:kube-systemroleRef:kind:ClusterRolename:nfs-client-provisioner-runnerapiGroup:rbac.authorization.k8s.io---kind:RoleapiVersion:rbac.authorization.k8s.io/v1metadata:name:leader-locking-nfs-client-provisionernamespace:kube-systemrules:-apiGroups:[""]resources:["endpoints"]verbs:["get","list","watch","create","update","patch"]---kind:RoleBindingapiVersion:rbac.authorization.k8s.io/v1metadata:name:leader-locking-nfs-client-provisionernamespace:kube-systemsubjects:-kind:ServiceAccountname:nfs-client-provisionernamespace:kube-systemroleRef:kind:Rolename:leader-locking-nfs-client-provisionerapiGroup:rbac.authorization.k8s.io
注意:请提前修改里面的Namespace名称为你要想部署Namespace空间。
部署RBAC资源执行kubectl命令将RBAC文件部署到Kubernetes集群,命令如下:
-f:指定资源文件名称。kubectlapply-fnfs-rbac.yaml四、部署NFS-Subdir-External-Provisioner
设置NFS-Subdir-External-Provisioner部署文件,这里将其部署到kube-system命令空间中。
创建NFS-Subdir-External-Provisioner部署文件创建一个用于部署的Deployment资源文件nfs-provisioner-deploy.yaml,文件内容如下:
apiVersion:apps/v1kind:Deploymentmetadata:name:nfs-client-provisionerlabels:app:nfs-client-provisionerspec:replicas:1strategy:type:Recreate##设置升级策略为删除再创建(默认为滚动更新)selector:matchLabels:app:nfs-client-provisionertemplate:metadata:labels:app:nfs-client-provisionerspec:serviceAccountName:nfs-client-provisionercontainers:-name:nfs-client-provisioner#image:gcr.io/k8s-staging-sig-storage/nfs-subdir-external-provisioner:v4.0.0image:registry.cn-beijing.aliyuncs.