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

二、静态申请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

创建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

创建测试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

验证 PV

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

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

进入pod查看挂载情况

kubectl exec -it nfspodtest /bin/bash

root@nfs-pod001:/# df -h

删除pv

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

删除POD命令: kubectl delete pod nfspodtest

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

删除PVC命令: kubectl delete pvc nfspvc01

删除pv

删除PV命令: kubectl delete pv nfspv01

动态申请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

创建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

创建测试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,它们的绑定关系:

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

创建测试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,实际目录有无产生文件:

清理测试环境

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

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

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

nfs服务器_Kubernetes集群下部署NFS持久存储相关推荐

  1. 【云原生之kubernetes实战】在k8s集群下部署Weave Scope监控平台

    [云原生之kubernetes实战]在k8s集群下部署Weave Scope监控平台 一.Weave Scope介绍 1.Weave Scope简介 2.Weave Scope的特点 3.Weave ...

  2. 二进制_Kubernetes集群二进制部署

    一.环境规划 操作系统:CentOS7.4_x64 kubernetes安装目录:/opt/kubernetes 版本说明: Kubernetes:v1.9 Docker:v17.12.0-ce Et ...

  3. linux nfs共享目录集群,CentOS7通过NFS共享文件夹,主要用于集群部署时候,文件的共享...

    要点:文件所在的服务器设置共享文件夹,其它应用服务器挂载该文件夹 环境: 文件所在的服务器:192.168.25.101 文件夹为/home/nfs_data 应用服务器:192.168.25.102 ...

  4. 8s nfs 挂载文件_Kubernetes集群使用网络存储NFS

    NFS存储 NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功 ...

  5. Hadoop集群管理与NFS网关

    目录 一.Hadoop集群管理 1.访问集群文件系统 2.重新初始化集群 3.增加新的节点 4.修复节点 5.删除节点 二.NFS网关 1.NFS网关概述 2.NFS网关架构图 3.HDFS用户授权 ...

  6. linux下,redis 3.2.1双节点集群安装部署

    为什么80%的码农都做不了架构师?>>>    一.环境准备 1.JDK环境准备,需卸载掉自带JDK (1)检查服务器是否自带jdk环境 [root@redis1 /]# rpm - ...

  7. 利用docker搭建服务器集群并部署大数据生态软件

    1.集群搭建与配置 本来想使用centos镜像搭建服务器集群,但最小化安装版的镜像也需要1G左右,如果后面再部署一些大数据软件,单是多台服务器环境部署就会占用大量空间,加上此版本镜像在不同电脑环境的安 ...

  8. centos7 下google Kubernetes(k8s)集群安装部署

    centos7 下google Kubernetes(k8s)集群安装部署 简介 安装环境 安装前准备 ECTD集群配置 命令含义: master节点配置 1.安装kubernetes和etcd 2. ...

  9. centos6.5环境下zookeeper-3.4.6集群环境部署及单机部署详解

    centos6.5环境下Zookeeper-3.4.6集群环境部署 [系统]Centos 6.5 集群部署 [软件]准备好jdk环境,此次我们的环境是open_jdk1.8.0_101 zookeep ...

最新文章

  1. iOS开发多线程篇—多线程简介
  2. SpringBoot - 优雅的实现【业务校验】高级进阶
  3. python wmi读取网卡MAC地址、CPU序列号、硬盘序列号、主板序列号、BIOS序列号
  4. 2018蚂蚁金服NLP用户意图的精准识别,复赛f1 = 0.7327
  5. 通过分析如何一个人的性格笔迹?
  6. 《红周刊》独家对话芒格:你可以随自己喜欢一辈子不理性,那必然承受糟糕结果
  7. 删除Directory Opus后从快捷方式无法转到文件夹
  8. 【Decouple】《Improving Semantic Segmentation via Decoupled Body and Edge Supervision》
  9. 程序员快速成长的核心原则
  10. windriver下pcmcia驱动程序编写的疑问
  11. 优秀IT顾问的七大能力之七--持续战斗能力
  12. 网络连接正常但IP却Ping不通解答
  13. python基础教程(第三版)学习笔记(十八)
  14. 重磅开讲 | 图灵奖得主—— Joseph Sifakis
  15. 3种有效的小米手机数据恢复方法
  16. AD18中高速信号等长线使用
  17. JAVA JAV,javjava
  18. iOS 获取汉字的拼音 CFStringTransform
  19. iOS开发那些事-Passbook详解与开发案例
  20. 计算机音乐数字乐谱fade,Faded钢琴简谱-数字双手-Alan Walker

热门文章

  1. 【剑指offer】面试题16:数值的整数次方(Java)
  2. 计算机组成原理——机器字长、指令字长、存储字长
  3. 服务器数据库2008怎么备份数据库文件,怎么备份SQL Server2008数据库
  4. 无法安装64位版本的office,因为在您的PC上找到了以下32位程序:microsoft visio professional 2013
  5. 正整数 n 所有可能的和式的组合
  6. openMP的简单使用
  7. 图像拼接1 特征提取
  8. pytorch实现Dropout与正则化防止过拟合
  9. C++学习之路 | PTA乙级—— 1020 月饼 (25分)(带注释)(精简)
  10. java正则匹配的坑_java正则表达式入坑指南