nfs服务器_Kubernetes集群下部署NFS持久存储

NFS是网络文件系统Network File System的缩写,NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地的文件系统中,而在本地的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样。

kubernetes使用NFS共享存储有两种方式:

1.手动方式静态创建所需要的PV和PVC。

2.通过创建PVC动态地创建对应PV,无需手动创建PV。

下面对这两种方式进行配置并进行演示。

一、搭建NFS服务器

k8s集群准备,以这篇文章为例:https://www.toutiao.com/i6768745162030973447/?group_id=6768745162030973447

这里演示在master节点上部署NFS服务器。服务器操作系统:Centos7.5.

#master节点安装nfsyum -y install nfs-utils#创建nfs目录mkdir /data#修改权限chmod  -R 777 /data#编辑export文件vim /etc/exports/data *(rw,no_root_squash,sync)#配置生效exportfs -r#查看生效exportfs#启动rpcbind、nfs服务systemctl restart rpcbind && systemctl enable rpcbindsystemctl restart nfs && systemctl enable nfs#所有node节点安装客户端 (很重要)yum -y install nfs-utils systemctl start nfs && systemctl enable nfs #查看 RPC 服务的注册状况rpcinfo -p localhost#showmount测试showmount -e 10.211.55.4
fef9e6857355a8a64c22eda2cd2894c0.png
0fb844bb82c0e138b2735d3569b3e44a.png

二、静态申请PV卷

添加pv卷对应目录,这里创建1个pv卷,则添加1个pv卷的目录作为挂载点。

#创建pv卷对应的目录mkdir -p /data/pv01#配置exportrsvim /etc/exports/data *(rw,no_root_squash,sync)/data/pv01 *(rw,no_root_squash,sync)#配置生效exportfs -r#重启rpcbind、nfs服务systemctl restart rpcbind && systemctl restart nfs

创建PV

下面创建1个名为pv01的PV卷,配置文件 nfspv01.yaml 如下:

apiVersion: v1kind: PersistentVolumemetadata:  name: nfspv01  labels:    pv: nfspv01spec:  capacity:    storage: 1Gi  accessModes:    - ReadWriteOnce  persistentVolumeReclaimPolicy: Recycle  storageClassName: nfs  nfs:    path: /data/pv01    server: 10.211.55.4 

配置说明:

① capacity 指定 PV 的容量为 1G。

② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。

ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。

ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。

③ persistentVolumeReclaimPolicy 指定当 PV 的回收策略为 Recycle,支持的策略有:

Retain – 需要管理员手工回收。

Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*。

Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure

Disk、OpenStack Cinder Volume 等。

④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的PV。

⑤ 指定 PV 在 NFS 服务器上对应的目录

创建PV命令:kubectl create -f nfspv01.yaml

创建成功后查看PV:kubectl get pv

ea1fab676232fb9996c664fef87b0891.png

创建PVC

接下来创建一个名为pvc01的PVC,配置文件 nfspvc01.yaml 如下:

apiVersion: v1kind: PersistentVolumeClaimmetadata:  name: nfspvc01spec:  accessModes:    - ReadWriteOnce  resources:    requests:      storage: 1Gi  storageClassName: nfs  selector:    matchLabels:      pv: nfspv01

创建PVC命令: kubectl create -f nfspvc01.yaml

创建成功后查看PVC:kubectl get pvc

3b58afd589becc6d6c32e37b23866275.png

创建测试POD

Pod 配置文件 nfspodtest.yaml 如下:

kind: PodapiVersion: v1metadat:  name: nfspodtestspec:  containers:    - name: nfspodtest      image: nginx      volumeMounts:      - mountPath: "/var/www/html"        name: nfsvolumetest  volumes:    - name: nfsvolumetest      persistentVolumeClaim:        claimName: nfspvc01

创建POD命令:kubectl create -f nfspodtest.yaml

查看POD命令:kubectl get pod

484d1719d10c53fc80dc53a28807e6d5.png

验证 PV

进入容器目录创建文件:kubectl exec nfspodtest touch /var/www/html/test.html

查看NFS服务器真实目录: ll /data/pv01

6678be25db0c02a65caa780985ff9196.png

进入pod查看挂载情况

kubectl exec -it nfspodtest /bin/bash

root@nfs-pod001:/# df -h

4a8f19d4ad70d31ed8dbe73aae4332d3.png

删除pv

删除pod,pv和pvc不会被删除,nfs存储的数据不会被删除。

删除POD命令: kubectl delete pod nfspodtest

8ba0c07fec9eddfda5ded18d22b25c0a.png

删除pvc,pv将被释放,处于 Available 可用状态,并且nfs存储中的数据被删除。

删除PVC命令: kubectl delete pvc nfspvc01

e3e8cecacb75918fbed81c9e59691de1.png

删除pv

删除PV命令: kubectl delete pv nfspv01

e982f9bbef720aa6b6507d190e2e8440.png

动态申请PV卷

External NFS驱动的工作原理

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

1.nfs-client:

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

2.nfs:

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

利用NFS动态提供Kubernetes后端存储卷

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

部署nfs-client-provisioner

首先克隆仓库获取yaml文件

git clone https://github.com/kubernetes-incubator/external-storage.git

cp -R external-storage/nfs-client/deploy/ $HOME

cd deploy

配置授权

如果集群启用了RBAC,则必须执行如下命令授权provisioner,rbac.yaml文件内容:

apiVersion: v1kind: ServiceAccountmetadata: name: nfs-client-provisioner  # replace with namespace where provisioner is deployed  namespace: default---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: ServiceAccount    name: nfs-client-provisioner    # replace with namespace where provisioner is deployed    namespace: defaultroleRef:  kind: ClusterRole  name: nfs-client-provisioner-runner  apiGroup: rbac.authorization.k8s.io---kind: RoleapiVersion: rbac.authorization.k8s.io/v1metadata:  name: leader-locking-nfs-client-provisioner    # replace with namespace where provisioner is deployed  namespace: defaultrules:  - apiGroups: [""]    resources: ["endpoints"]    verbs: ["get", "list", "watch", "create", "update", "patch"]---kind: RoleBindingapiVersion: rbac.authorization.k8s.io/v1metadata:  name: leader-locking-nfs-client-provisionersubjects:  - kind: ServiceAccount    name: nfs-client-provisioner    # replace with namespace where provisioner is deployed    namespace: defaultroleRef:  kind: Role  name: leader-locking-nfs-client-provisioner  apiGroup: rbac.authorization.k8s.io

命令: kubectl create -f rbac.yaml

修改deployment.yaml文件

这里修改的参数包括NFS服务器所在的IP地址(10.211.55.4),以及NFS服务器共享的路径(/data),两处都需要修改为你实际的NFS服务器和共享目录。

apiVersion: apps/v1kind: Deploymentmetadata:  name: nfs-client-provisioner  labels:    app: nfs-client-provisioner  # replace with namespace where provisioner is deployed  namespace: defaultspec:  replicas: 1  selector:    matchLabels:      app: nfs-client-provisioner  strategy:    type: Recreate  selector:    matchLabels:      app: nfs-client-provisioner  template:    metadata:      labels:        app: nfs-client-provisioner    spec:      serviceAccountName: nfs-client-provisioner      containers:        - name: nfs-client-provisioner          image: willdockerhub/nfs-client-provisioner:latest          volumeMounts:            - name: nfs-client-root              mountPath: /persistentvolumes          env:            - name: PROVISIONER_NAME              value: fuseim.pri/ifs            - name: NFS_SERVER              value: 10.211.55.4            - name: NFS_PATH              value: /data      volumes:        - name: nfs-client-root          nfs:            server: 10.211.55.4            path: /data

执行命令:kubectl create-f deployment.yaml

查看POD:kubectl get pod

6aaa93a2b1212e87233dcc2627cb607b.png

创建StorageClass

class.yaml 文件内容: kubectl create -f class.yaml

apiVersion: storage.k8s.io/v1kind: StorageClassmetadata:  name: managed-nfs-storageprovisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'parameters:  archiveOnDelete: "false"

查看创建的storageclass: kubectl get sc

22289d24d283d48ddc311709e84c3b97.png

创建测试PVC

test-claim.yaml文件内容:

kind: PersistentVolumeClaimapiVersion: v1metadata:  name: test-claim  annotations:    volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"spec:  accessModes:    - ReadWriteMany  resources:    requests:      storage: 1Mi

命令:kubectl create -f test-claim.yaml

查看PVC,自动创建的PV,它们的绑定关系:

dcffd265455b3d619809669ec7906928.png

查看NFS服务器实际目录, 我们进入到NFS的export目录,可以看到对应该volume name的目录已经创建出来了。其中volume的名字是namespace,PVC name以及uuid的组合:

dd5754cc0b65573bb7c1effbb0483d2a.png

创建测试Pod

test-pod.yaml 文件内容:

kind: PodapiVersion: v1metadata:  name: test-podspec:  containers:  - name: test-pod    image: gcr.io/google_containers/busybox:1.24    command:      - "/bin/sh"    args:      - "-c"      - "touch /mnt/SUCCESS && exit 0 || exit 1"    volumeMounts:      - name: nfs-pvc        mountPath: "/mnt"  restartPolicy: "Never"  volumes:    - name: nfs-pvc      persistentVolumeClaim:        claimName: test-claim

命令:kubectl create -f test-pod.yaml

查看POD,实际目录有无产生文件:

ca3546c2363d68a8ef284346861ed8e1.png

清理测试环境

删除测试POD:kubectl delete -f test-pod.yaml

删除测试PVC: kubectl delete -f test-claim.yaml

发现在NFS服务器上的共享目录下查看NFS的PV卷已经被删除:

70f62d3444a3f8f12882862b6e3e0294.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/504158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言 指针_C 语言指针详解

(给CPP开发者加星标,提升C/C技能)作者:C语言与CPP编程 / 自成一派123(本文来自作者投稿)1为什么使用指针假如我们定义了 char a’A’ ,当需要使用 ‘A’ 时,除了直接调用变量 a ,还可以定义 char *p&a &#xff0c…

kettle 插入更新 数据增量_使用Kettle工具进行增量数据同步

增量同步的方式有很多种,我使用的是: 快照表 触发器需求:当主库库表发生增删改时,从库库表与主库库表数据保持一致。环境:1、Mysql2、kettle 7.1思路:1、在主库中,将需要同步的库表新建快照表,…

idea修改代码后不重启项目_使用DevTool实现SpringBoot项目热部署

前言最近在开发的时候,每次改动代码都需要启动项目,因为有的时候改动的服务比较多,所以重启的次数也就比较多了,想着每次重启等待也挺麻烦的,就打算使用DevTools工具实现项目的热部署热部署是什么大家都知道在项目开发…

vue 计算文件hash值_vue的hash值原理,也是table切换。

.pages>div{display: none;}aaabbbcccc首页关于我的页面用户中心//hash 和页面一一对应起来//router 配置var router [{path:"/",component:document.getElementById("home")},{path:"/about",component:document.getElementById("abou…

c++ 单例模式_Redis单例、主从模式、sentinel以及集群的配置方式及优缺点对比

redis作为一种高效的缓存框架,使用是非常广泛的,在数据存储上,在运行时其将数据存储在内存中,以实现数据的高效读写,并且根据定制的持久化规则不同,其会不定期的将数据持久化到硬盘中。另外相较于其他的NoS…

jenkins 插件目录_10 个 Jenkins 实战经验,助你轻松上手持续集成

众所周知,持续构建与发布是我们日常工作中要面对的的一个重要环节,目前很多公司都采用 Jenkins 来搭建符合需求的 CI/CD 流程,作为一个持续集成的开源工具,它以安装启动方便,配置简单,上手容易的特点&#…

手机python3l运行_Python3 os.lchflags() 方法

Python3 os.lchflags() 方法概述os.lchflags() 方法用于设置路径的标记为数字标记,类似 chflags(),但是没有软链接。只支持在 Unix 下使用。语法lchflags()方法语法格式如下:os.lchflags(path, flags)参数path -- 设置标记的文件路径flags --…

jdbc 批量insert_JDBC相关知识解答

1. JDBC_PreparedStatement插入大量数据_批处理插入_效率比较(1) jdbc新增大量数据时, 如何处理能提高效率?答:使用批处理提高效率(2) 什么是批处理? JDBC如何进行批处理?答:批处理:在与数据库的一次连接中,批量的执行条 SQL 语…

lin通信ldf文件解析_lin ldf

Baby-LIN 采用闪存来保存固件, 因此更新和升级非常简便。 Baby-LIN 的软件套装是 LINWorks。这个软件包包括几个不同的应用程序。 LINWorks LDF-Editor 可以检查、......并且在未加载 LDF/SDF 文件的情况下,也可以用来监测与记录总线数据。 Baby-LIN-DLL 库文件可让用户编写应用…

vue项目使用大华摄像头怎样初始化_Vue接入监控视频技术总结

最近一直在搞监控视频接入方面的事情,积累了不少的经验,这里总结一下。提前说一句,本文提到的视频接入均是以RTSP为基础转码而来的,至于用海康大华等插件播放的咱们就闭口不提了可以看这个文章,在vue中接入ocx控件播放…

python 实现显著性检测_强!汽车车道视频检测:python+OpenCV为主实现

1 说明:1.1 完整版:汽车车道动态视频检测讲解和注释版代码,小白秒懂。1.2 pythonOpenCVmoviepynumpy为主的技术要点。1.3 代码来源:https://github.com/linghugoogle/CarND-Advanced-Lane-Lines #虽然感觉也是fork别人的&#xff…

var和function谁先优先执行_变量var声明和函数function声明优先级

变量声明优先级使用var关键字和function关键字声明的变量,会被JS的解释器优先解析执行,具有优先级使用var关键字声明变量1. 看代码说话// 在script中直接打印输出变量aconsole.log(a); // Uncaught ReferenceError: a is not defined2. 看代码说话consol…

python的变量名有哪些_【python字符串做变量名的方法有哪些?这些方法对python应用很重要】- 环球网校...

【摘要】python的功能都是建立在代码之上的,不过你知道python字符串做变量名的方法有哪些?这些方法对python应用很重要,如果你想学好python,那么本文内容一定要自己试试,毕竟实践出真知,那么python字符串做变量名的方…

如何学习c语言 零基础20天学会C语言

C语言开发 学习C语言不是一朝一夕的事情,但也不需要花费十年时间才能精通。如何以最小的代价学习并精通C语言是本文的主题。请注意,即使是“最小的代价”,也绝不是什么捷径,而是以最短的时间取得最多的收获,同时也意味…

钟平逻辑英语语法_逻辑英语-钟平笔记.pdf

英语主干定位:(状1 )主 (定1)谓 (状2 )( 宾 )(定 2 、状 1 )中文主干定位:(状1 、定 1)主 (状2 )谓 (定2 )( 宾 )(状 1 )主语:句首的独立名词性结构谓语:排除过程首先排除从句中和介词短语中动词宾语:谓语后的独立名词…

python爬虫分析_Python爬虫解析网页的4种方式

文章目录 爬虫的价值 正则表达式 requests-html BeautifulSoup lxml的XPath 爬虫的价值 常见的数据获取方式就三种:自有数据、购买数据、爬取数据。用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来&a…

学习C/C++的简单方法

如何学习C呢。C和C是很多专业的必修课,尤其对计算机专业来说,更是重中之重。C语言是早期发展的高级语言,具备执行速度快,语法优美等特点。是底层高效率系统的首选开发语言。今天就和大家分享一下怎么学好C/C语言吧 _ 怎么学好C、…

python3环境运行python2代码_使用Anaconda实现Python2和Python3共存及相互转换

前言 初学Python时,总是被python的两个不太兼容的版本搞得头昏脑胀。按目前的发展趋势,python未来的主流版为python3。但是我们经常会遇到一些很有意思代码使用的是python2版本。于是我们需要同时拥有python2和python3的运行环境。这里介绍一个强大的软件…

python中用于标识字符串的定界符_001.python-基础-Template的字符串格式化

Template是Python string模板中定义的一种字符串类型。用途:用于字符串替换操作。默认的定界符:$。# -*- coding: utf-8 -*-from string import Template# # 在python中Template可以将字符串的格式固定下来,重复利用。# Template属于string中…

零基础自学编程应读书籍

如果你是一个程序员,除了编码之外,你还需要大量的阅读。书籍是知识和智慧的重要来源。但不幸的是,现在很多人已经不愿意看书了。程序员更是罕见地会去读书,最常见的是依靠互联网搜索结果来找寻答案。  技术向前的步伐比人类历史上…