一、nfs-client-provisioner简介

nfs-client-provisioner 可动态为kubernetes提供pv卷,是Kubernetes的简易NFS的外部provisioner,本身不提供NFS,需要现有的NFS服务器提供存储。持久卷目录的命名规则为:${namespace}-${pvcName}-${pvName}。

K8S的外部NFS驱动可以按照其工作方式(是作为NFS server还是NFS client)分为两类:

nfs-client:

它通过K8S内置的NFS驱动挂载远端的NFS服务器到本地目录;然后将自身作为storage provider关联storage class。当用户创建对应的PVC来申请PV时,该provider就将PVC的要求与自身的属性比较,一旦满足就在本地挂载好的NFS目录中创建PV所属的子目录,为Pod提供动态的存储服务。

nfs-server:

与nfs-client不同,该驱动并不使用k8s的NFS驱动来挂载远端的NFS到本地再分配,而是直接将本地文件映射到容器内部,然后在容器内使用ganesha.nfsd来对外提供NFS服务;在每次创建PV的时候,直接在本地的NFS根目录中创建对应文件夹,并export出该子目录。

本文将介绍使用nfs-client-provisioner这个应用,利用NFS Server给Kubernetes作为持久存储的后端,并且动态提供PV。前提条件是有已经安装好的NFS服务器,并且NFS服务器与Kubernetes的Slave节点网络能够连通。将nfs-client驱动做为一个deployment部署到K8S集群中,然后对外提供存储服务

二、准备NFS服务端

2.0 当前环境信息

[root@k8s-master]-[~/nfs-provisioner]-#kubectl get node -o wide
NAME         STATUS   ROLES           AGE     VERSION   INTERNAL-IP   EXTERNAL-IP   OS-IMAGE                KERNEL-VERSION                CONTAINER-RUNTIME
k8s-master   Ready    control-plane   4d19h   v1.24.0   10.0.0.16     <none>        CentOS Linux 7 (Core)   3.10.0-1160.45.1.el7.x86_64   containerd://1.6.2
k8s-node-1   Ready    <none>          4d19h   v1.24.0   10.0.0.17     <none>        CentOS Linux 7 (Core)   3.10.0-1160.45.1.el7.x86_64   containerd://1.6.2
k8s-node-2   Ready    <none>          4d19h   v1.24.0   10.0.0.18     <none>        CentOS Linux 7 (Core)   3.10.0-1160.45.1.el7.x86_64   containerd://1.6.2

2.1 通过yum安装nfs server端

rpm -qa|egrep "nfs|rpc"
yum -y install nfs-utils rpcbind

2.2 启动服务和设置开机启动

#启动nfs-server,并加入开机启动
systemctl start rpcbind.service
systemctl enable rpcbind.service
systemctl start nfs
systemctl enable nfs-server --now#查看nfs server是否已经正常启动
systemctl status nfs-server

2.3  编辑配置文件,设置共享目录

[root@k8s-node-2]-[/data/nfs_provisioner]-#vim /etc/exports
/data/nfs_provisioner   10.0.0.0/24(rw,no_root_squash)#不用重启nfs服务,配置文件就会生效
exportfs -arv 

用于配置NFS服务程序配置文件的参数:

2.4 客户端尝试挂载

2.4.1 客户端需要安装nfs-utils,否则将无法进行nfs的挂载

yum -y install nfs-utils
systemctl start nfs
systemctl enable nfs
systemctl status nfs

2.4.2 nfs-server创建共享目录

mkdir /nfs_data

2.4.3 客户端测试

#查看nfs-server共享的目录
[root@k8s-master]-[~]-#showmount -e 10.0.0.18
Export list for 10.0.0.18:
/data/nfs_provisioner 10.0.0.0/24#本地创建一个目录作为挂载点
mount  -t nfs 10.0.0.18:/data/nfs_provisioner /nfs_data
#将nfs-server的共享目录挂载到本地#通过df -Th
[root@k8s-node-1]-[~]-#df -Th /nfs_data/
Filesystem              Type  Size  Used Avail Use% Mounted on
/dev/mapper/centos-root xfs    39G  7.9G   31G  21% /

三、部署nfs-provisioner

3.1 创建ServiceAccount

apiVersion: v1
kind: ServiceAccount
metadata:name: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
---
kind: ClusterRole
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: nfs-client-provisioner-runner
rules:- apiGroups: [""]resources: ["nodes"]verbs: ["get", "list", "watch"]- 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: ClusterRoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: run-nfs-client-provisioner
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: ClusterRolename: nfs-client-provisioner-runnerapiGroup: rbac.authorization.k8s.io
---
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
rules:- apiGroups: [""]resources: ["endpoints"]verbs: ["get", "list", "watch", "create", "update", "patch"]
---
kind: RoleBinding
apiVersion: rbac.authorization.k8s.io/v1
metadata:name: leader-locking-nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
subjects:- kind: ServiceAccountname: nfs-client-provisioner# replace with namespace where provisioner is deployednamespace: default
roleRef:kind: Rolename: leader-locking-nfs-client-provisionerapiGroup: rbac.authorization.k8s.io
kubectl apply -f sa.yaml

3.2 创建Deployment

注意镜像需要用比较新的,不然会报错:unexpected error getting claim reference: selfLink was empty, can't make reference

注意:千万不要使用以下方式来解决selfLink的问题,k8s1.24.0版本默认是true,不支持修改为false,否则apiserver会启动失败!

kind: Deployment
apiVersion: apps/v1
metadata:name: nfs-client-provisioner
spec:replicas: 1selector:matchLabels:app: nfs-client-provisionerstrategy:type: Recreatetemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: registry.cn-beijing.aliyuncs.com/mydlq/nfs-subdir-external-provisioner:v4.0.0volumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: nfs-provisioner # 和3.Storage中provisioner保持一致便可- name: NFS_SERVERvalue: 10.0.0.18- name: NFS_PATHvalue: /data/nfs_provisionervolumes:- name: nfs-client-rootnfs:server: 10.0.0.18path: /data/nfs_provisioner
kubectl apply -f deployment.yaml

3.3 创建storageclass

kind: StorageClass
apiVersion: storage.k8s.io/v1
metadata:annotations:storageclass.kubernetes.io/is-default-class: "true"name: nfs-storage
provisioner: nfs-provisioner
volumeBindingMode: Immediate
reclaimPolicy: Delete
kubectl apply -f sc.yaml

四、创建应用测试动态添加PV

4.1 创建一个nginx应用

kubectl apply -f nginx_sts_pvc.yaml
apiVersion: v1
kind: Service
metadata:name: nginxlabels:app: nginx
spec:ports:- port: 80name: webclusterIP: Noneselector:app: nginx
---
apiVersion: apps/v1
kind: StatefulSet
metadata:name: web
spec:serviceName: "nginx"replicas: 2selector:matchLabels:app: nginxtemplate:metadata:labels:app: nginxspec:containers:- name: nginximage: nginxports:- containerPort: 80name: webvolumeMounts:- name: wwwmountPath: /usr/share/nginx/htmlvolumeClaimTemplates:- metadata:name: wwwspec:accessModes: [ "ReadWriteOnce" ]storageClassName: "nfs-storage"  #使用新建的scresources:requests:storage: 10Mi

4.2 检查结果

检查nfs-server服务器是否创建pv持久卷:

-----------------后期会继续分享k8s1.24.0高版本的新变化和新特性,请大家多多关注!-----------------

k8s 1.24.0版本使用nfs-provisioner4.0.0动态创建PV相关推荐

  1. Servlet3.0 版本问题,以及Servlet3.0中Annotation的使用

    今天看到书上对于Servlet3.0的讲解,结合自身遇到的问题总结如下: 1.首先确定你使用的Servlet 的版本,查看版本的方式有两种: A  -在tomcat安装文件下\lib下的servlet ...

  2. 火狐linux 32位,火狐浏览器32.0版本-Firefox(火狐浏览器)32.0版下载 v32.0官方版--pc6下载站...

    Firefox32.0版带有一个新的HTTP缓存后端,其他改进包括请求排序的优化,以提供更快的加载时间以及对崩溃和挂起应变能力提升,而且可以查看密码管理器中存储的登录的历史使用信息.. Firefox ...

  3. android版本怎么升级8.0,安卓怎么升级8.0版本_安卓升级8.0版本方法_一聚教程网

    相信现在对于安卓手机的使用也是非常多的,不过对于安卓系统手机的使用,各个最新版本一直是很多人都在追求的.不过大多数人还不知道升级8.0版本方法,这里文章就给大家具体介绍下,感兴趣的下面我们具体来了解下 ...

  4. 多多自走棋改动_《多多自走棋》2.0版本有哪些改动 2.0版本更新改动内容汇总...

    导 读 多多自走棋将于近期进行一次大型改版,全新的2.0版本会在体验服更新,完成测试后就会在正式服实装了.那么,多多自走棋2.0版本有什么新内容呢?下面就是多多自走棋体验服更新前瞻了,小伙伴们都来看看 ...

  5. 关于mysql 5.0版本java项目导入mysql8.0的问题

    java项目是mysql5.0版本的,本机mysql是8.0版本的,不兼容,解决方法如下: 1.更换数据库驱动,数据库连接驱动下载链接http://central.maven.org/maven2/m ...

  6. k8s数据持久化之statefulset的数据持久化,并自动创建PV与PVC

    StatefulSet是为了解决有状态服务的问题,对应的Deployment和ReplicaSet是为了无状态服务而设计,其应用场景包括: 稳定的持久化存储,即Pod重新调度后还是能访问到相同的持久化 ...

  7. 微信android 7.0版本下载地址,微信7.0官方版本下载,微信7.0官方版本下载 v7.0.15-安卓乐园安卓软件网...

    微信7.0官方版本是微信的一个非常好用的新版本,让你的社交互动可以更加的方便有意思,发送的消息和表情包都是可以知己制作的哦,还可以让你的文件传送速度更快更及时哦! 微信7.0官方版本软件特色: 1.可 ...

  8. oracle 8.0版本下载,Oracle Linux 8.0 发布

    早在5月初,就在Red Hat Enterprise Linux 8.0发布之前,我们看到了Oracle Linux 8的公测版,而今天,Oracle Linux 8.0已经升级到稳定的版本,并且已经 ...

  9. Vue3使用element-plus1.3.0版本的el-menu菜单组件引入动态渲染icon图标时,图标组件刚好是Menu时报错,菜单不显示的解决方法

    目前在升级前端框架,UI组件element-plus升级到了目前最新的1.3.0beta8版本,图标也换成了官方提供的SvgIcon图标,官方提供了组件导入的方式使用图标.而我的图标是全局导入的,默认 ...

最新文章

  1. Cosmos的基石:IL2CPU编译器--.net/C#开源操作系统学习系列三
  2. ROS初级教程1---官方ROS文件系统导览
  3. gdb 10.2的安装
  4. 6款html5模板下载
  5. 实例浅析javascript call by value与call by reference
  6. 三星大翻身?Galaxy Fold已售出100万台,进账160亿元?结果尴尬了…
  7. 沉淀再出发:关于java中的AQS理解
  8. B. 基本概念:类和对象
  9. Extjs中renderer:function函数用法
  10. ASPNET MVC Error 403.14
  11. AtCoder Beginner Contest 223
  12. (转)美国进入智能投顾竞争时代
  13. Sigar使用详解(免费)
  14. 2021-07-22-第一次实训(HTML+CSS+JS)
  15. iTextSharp操作PDF
  16. Typora上传图片终于解决了
  17. EasyExcel自适应列宽(官方文档的不好用,个人修改了下)
  18. 7-20 表达式转换(中缀转后缀)
  19. 分治法一个整数数列求最大值最小值_五大常见算法策略之丨递归与分治策略
  20. HDU 1265 浮点数

热门文章

  1. java中接口可不可以继承一般类,为什么?
  2. 世界四大汽车生产公司
  3. matlab如何求矩阵特征值
  4. python:彩色照转黑白照
  5. java毕业设计免税商品优选购物商城设计mybatis+源码+调试部署+系统+数据库+lw
  6. 基于titanic数据集介绍数据分析处理流程
  7. 四缸汽油机曲轴及凸轮轴信号生成(基于STM32)
  8. Vue2.0开发之——Vue基础用法-axios(29)
  9. Centos7 修改SSH端口,以及修改密码
  10. 一场羽绒服直播GMV狂涨430%,反季热销的秘诀原来是这个?