kubernetes部署nfs持久存储(静态和动态)

NFS简介

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

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

1.手动方式静态创建所需要的PV和PVC。
2.通过创建PVC动态地创建对应PV,无需手动创建PV。

部署NFS

集群Masrer节点192.168.5.11作为NFS server服务器,这里作为测试,使用docker部署NFS服务器:

docker run -d --name nfs-server \--privileged \--restart always \-p 2049:2049 \-v /nfs-share:/nfs-share \-e SHARED_DIRECTORY=/nfs-share \itsthenetwork/nfs-server-alpine:latest

手动方式部署nfs服务器

#master节点安装nfs
yum -y install nfs-utils#创建nfs目录
mkdir -p /nfs/data/#修改权限
chmod -R 777 /nfs/data#编辑export文件,这个文件就是nfs默认的配置文件
vim /etc/exports
/nfs/data *(rw,no_root_squash,sync)#配置生效
exportfs -r
#查看生效
exportfs#启动rpcbind、nfs服务
systemctl restart rpcbind && systemctl enable rpcbind
systemctl restart nfs && systemctl enable nfs#查看 RPC 服务的注册状况
rpcinfo -p localhost#showmount测试
showmount -e 192.168.5.11

所有node节点安装客户端,开机启动

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

准备工作,我们已经在master-1(192.168.5.11) 节点上搭建了一个 NFS 服务器,目录为 /nfs/data

静态PV卷

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

创建NFS挂载点

#创建pv卷对应的目录
mkdir -p /nfs/data/pv001
mkdir -p /nfs/data/pv001#配置exportrs(我觉得可以不用这步,因为父目录/nfs/data,已经设为共享文件夹)
vim /etc/exports
/nfs/data/pv001 *(rw,no_root_squash,sync)
/nfs/data/pv002 *(rw,no_root_squash,sync)#配置生效
exportfs -r
#重启rpcbind、nfs服务
systemctl restart rpcbind && systemctl restart nfs

创建PV–nfs-pv001.yml

apiVersion: v1
kind: PersistentVolume
metadata:name: nfs-pv001labels:pv: nfs-pv001
spec:capacity:storage: 1GiaccessModes:- ReadWriteOncepersistentVolumeReclaimPolicy: RecyclestorageClassName: nfsnfs:path: /nfs/data/pv001server: 192.168.5.11

配置说明:
① capacity 指定 PV 的容量为 1G。
② accessModes 指定访问模式为 ReadWriteOnce,支持的访问模式有:

2.1ReadWriteOnce – PV 能以 read-write 模式 mount 到单个节点。
2.2ReadOnlyMany – PV 能以 read-only 模式 mount 到多个节点。
2.3ReadWriteMany – PV 能以 read-write 模式 mount 到多个节点。

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

3.1Retain – 需要管理员手工回收。
3.2Recycle – 清除 PV 中的数据,效果相当于执行 rm -rf /thevolume/*。
3.3Delete – 删除 Storage Provider 上的对应存储资源,例如 AWS EBS、GCE PD、Azure
Disk、OpenStack Cinder Volume 等。

④ storageClassName 指定 PV 的 class 为 nfs。相当于为 PV 设置了一个分类,PVC 可以指定 class 申请相应 class 的 PV。
⑤ 指定 PV 在 NFS 服务器上对应的目录。

创建PV

[root@master-1 pv]# kubectl apply -f nfs-pv001.yml
persistentvolume/nfs-pv001 created
[root@master-1 pv]# kubectl get pv
NAME  CAPACITY  ACCESS MODES   RECLAIM POLICY  STATUS  CLAIM  STORAGECLASS   REASON   AGE
nfs-pv001    1Gi  RWO           Recycle        Available      nfs                     7s

创建PVC–nfs-pvc001.yml

apiVersion: v1
kind: PersistentVolumeClaim
metadata:name: nfs-pvc001
spec:accessModes:- ReadWriteOnceresources:requests:storage: 1GistorageClassName: nfsselector:matchLabels:pv: nfs-pv001

创建PVC

[root@master-1 pv]# kubectl apply -f nfs-pvc001.yml
persistentvolumeclaim/nfs-pvc001 created
[root@master-1 pv]# kubectl get pvc
NAME       STATUS   VOLUME                  CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc001 Bound    nfs-pv001                 1Gi        RWO            nfs            7s
[root@master-1 pv]# kubectl get pv
NAME CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS  CLAIM STORAGECLASS   REASON   AGE
nfs-pv001 1Gi   RWO            Recycle          Bound    ingress-nginx/nfs-pvc001               nfs      26m

从 kubectl get pvc 和 kubectl get pv 的输出可以看到 pvc001绑定到pv001,申请成功。注意pvc绑定到对应pv通过labels标签方式实现,也可以不指定,将随机绑定到pv。

Pod中使用存储–nfs-pod001.yml

apiVersion: v1
kind: Pod
metadata:name: nfs-pod001
spec:containers:- name: frontendimage: nginxvolumeMounts:- mountPath: "/var/www/html"name: nfs-pv001volumes:- name: nfs-pv001persistentVolumeClaim:claimName: nfs-pvc001

nginx的pod使用存储

[root@master-1 pv]# kubectl apply -f nfs-pod001.yml
pod/nfs-pod001 created[root@master-1 pv]# kubectl get pod
NAME                                        READY   STATUS      RESTARTS       AGE
nfs-pod001                                  1/1     Running     0              53s查看PV挂载情况
[root@master-1 pv]# kubectl exec -it nfs-pod001 /bin/bash
kubectl exec [POD] [COMMAND] is DEPRECATED and will be removed in a future version. Use kubectl exec [POD] -- [COMMAND] instead.
root@nfs-pod001:/# df -h  /var/www/html
Filesystem                    Size  Used Avail Use% Mounted on
192.168.5.11:/nfs/data/pv001   50G  4.0G   47G   8% /var/www/htmlpv下面创建一个文件
root@nfs-pod001:/var/www/html# echo "hello world!" >/var/www/html/index.html在master上查看文件
[root@master-1 pv]# ls /nfs/data/pv001/
index.html

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

[root@master-1 pv]# kubectl delete -f nfs-pod001.yml
pod "nfs-pod001" deleted
[root@master-1 pv]# kubectl get pv
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                  STORAGECLASS   REASON   AGE
nfs-pv001                 1Gi        RWO            Recycle          Bound    ingress-nginx/nfs-pvc001               nfs                     117m
[root@master-1 pv]# kubectl get pvc
NAME                     STATUS   VOLUME                    CAPACITY   ACCESS MODES   STORAGECLASS   AGE
nfs-pvc001               Bound    nfs-pv001                 1Gi        RWO            nfs            93m[root@master-1 pv]# ls /nfs/data/pv001/
index.html

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

[root@master-1 pv]# kubectl delete -f nfs-pvc001.yml
persistentvolumeclaim "nfs-pvc001" deleted
[root@master-1 pv]# ls /nfs/data/pv001/[root@master-1 pv]# kubectl get pv
NAME                      CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS      CLAIM                                  STORAGECLASS   REASON   AGE
nfs-pv001                 1Gi        RWO            Recycle          Available                                          nfs                     128m

继续删除pv

[root@master-1 pv]# kubectl delete -f nfs-pv001.yml
persistentvolume "nfs-pv001" deleted

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

(在master上操作,即192.168.5.11)
首先克隆仓库获取yaml文件

git clone https://github.com/kubernetes-incubator/external-storage.git
cp -R external-storage/nfs-client/deploy/ $HOME
cd deploy

创建权限rbac.yaml

# Set the subject of the RBAC objects to the current namespace where the provisioner is being deployed
$ NS=$(kubectl config get-contexts|grep -e "^\*" |awk '{print $5}')
$ NAMESPACE=${NS:-default}
$ sed -i'' "s/namespace:.*/namespace: $NAMESPACE/g" ./deploy/rbac.yaml ./deploy/deployment.yaml
$ kubectl create -f deploy/rbac.yaml

配置NFS-Client provisioner

配置deploy/class.yaml

apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:name: managed-nfs-storage
provisioner: fuseim.pri/ifs # or choose another name, must match deployment's env PROVISIONER_NAME'
parameters:archiveOnDelete: "false" # When set to "false" your PVs will not be archived# by the provisioner upon deletion of the PVC.

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

[root@master-1 deploy]# cat deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:name: nfs-client-provisionerlabels:app: nfs-client-provisionernamespace: default
spec:replicas: 1strategy:type: Recreateselector:matchLabels:app: nfs-client-provisionertemplate:metadata:labels:app: nfs-client-provisionerspec:serviceAccountName: nfs-client-provisionercontainers:- name: nfs-client-provisionerimage: quay.io/external_storage/nfs-client-provisioner:latestvolumeMounts:- name: nfs-client-rootmountPath: /persistentvolumesenv:- name: PROVISIONER_NAMEvalue: fuseim.pri/ifs- name: NFS_SERVERvalue: 192.168.5.11- name: NFS_PATHvalue: /nfs/datavolumes:- name: nfs-client-rootnfs:server: 192.168.5.11path: /nfs/data

测试环境

部署

kubectl create -f deploy/test-claim.yaml -f deploy/test-pod.yaml

检查NFS Server 文件是否成功,下面情况说明成功了。

[root@master-1 nfs-client]# cd /nfs/data/pv002
[root@master-1 pv002]# ls
archived-ingress-nginx-test-claim-pvc-efd702ba-102d-4d61-9a5f-6fc4805f12c0

查看pvc,pv状态

[root@master-1 pv002]# kubectl get pvc,pv
NAME                                           STATUS   VOLUME                                                              CAPACITY   ACCESS MODES   STORAGECLASS          AGE
persistentvolumeclaim/test-claim               Bound    ingress-nginx-test-claim-pvc-efd702ba-102d-4d61-9a5f-6fc4805f12c0   1Mi        RWX            managed-nfs-storage   25mNAME                                                                                 CAPACITY   ACCESS MODES   RECLAIM POLICY   STATUS   CLAIM                                  STORAGECLASS          REASON   AGE
persistentvolume/ingress-nginx-test-claim-pvc-efd702ba-102d-4d61-9a5f-6fc4805f12c0   1Mi        RWX            Delete           Bound    ingress-nginx/test-claim               managed-nfs-storage            19m

删除

kubectl delete -f deploy/test-pod.yaml -f deploy/test-claim.yaml

部署自己的PVC和pod

确保storage-class是正确的,在deploy/class.yaml中定义的。

apiVersion: v1
metadata:name: sc-claimannotations:volume.beta.kubernetes.io/storage-class: "managed-nfs-storage"
spec:accessModes:- ReadWriteManyresources:requests:storage: 1Mi

pod.yaml

apiVersion: v1
kind: Pod
metadata:name: nginx-sc-pod
spec:volumes:- name: task-pv-storagepersistentVolumeClaim:claimName: sc-claimcontainers:- name: task-pv-containerimage: nginxports:- containerPort: 80name: "http-server"volumeMounts:- mountPath: "/usr/share/nginx/html"name: task-pv-storage

问题: 创建pvc后状态一直是pending

  1. pvc 报错
# kubectl describe pvc test-claim
Events:Type    Reason                Age                 From                         Message----    ------                ----                ----                         -------Normal  ExternalProvisioning  15s (x25 over 80s)  persistentvolume-controller  waiting for a volume to be created, either by external provisioner "fuseim.pri/ifs" or manually created by system administrator
  1. nfs-client-provisioner报错
kubectl logs nfs-client-provisioner-5ff56b5cfc-fqnzv
E0205 02:12:39.764761       1 controller.go:756] Unexpected error getting claim reference to claim "ingress-nginx/test-claim": selfLink was empty, can't make reference
  1. 通过第二步的报错,查到1.20版本默认禁止使用selfLink。
  • Stop propagating SelfLink (deprecated in 1.16) in kube-apiserver (#94397, @wojtek-t) [SIG API Machinery and Testing]

解决办法:

/etc/kubernetes/manifests/kube-apiserver.yaml 添加这段" - --feature-gates=RemoveSelfLink=false "

...- command:- kube-apiserver- --advertise-address=192.168.5.11- --allow-privileged=true- --feature-gates=RemoveSelfLink=false
...

保存退出,kubernetes会自动重建apiserver。

kubernetes部署nfs持久存储(静态和动态)相关推荐

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

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

  2. 使用Rook+Ceph在Kubernetes上作持久存储

    使用Rook+Ceph在Kubernetes上作持久存储 作者:Earl C. Ruby III 我想在新的Kubernetes集群上安装Prometheus和Grafana,但为了使这些软件包能够工 ...

  3. K8s 1.23.x版本nfs持久存储报错 persistentvolume-controller waiting for a volume to be created, either by ext

    最近在学习k8s的相关知识,嗯,出现一些问题,记录下. 说明 Docker 20.10.12 kubeadm-v1.23.4 kubelet-v1.23.4 kubectl-v1.23.4 对,需要对 ...

  4. 02.Kubernetes 和 KubeSphere 集群安装配置持久化存储(nfs)并通过StatefulSet动态为pod生成pv挂载

    Kubernetes 和 KubeSphere 集群安装配置持久化存储(nfs)并通过StatefulSet动态为pod生成pv挂载 简介 1. 安装配置前置环境 1.1 安装nfs文件系统 1.1. ...

  5. 使用nfs为k8s提供pv动态供给存储

    环境:k8s一主两从 k8s version: 1.20.2 k8s-master: 192.168.31.200 k8s-node1: 192.168.31.201 k8s-node2: 192.1 ...

  6. 基于NFS共享存储实现kvm虚拟主机动态迁移

    所有主机关闭防火墙与selinux [root@localhost ~]# iptables -F [root@localhost ~]# systemctl stop firewalld [root ...

  7. KVM 虚拟机在物理主机之间迁移的实现 -- 静态迁移/动态迁移/存储迁移

    原文转自:http://www.ibm.com/developerworks/cn/linux/l-cn-mgrtvm2/ 静态迁移 静态迁移:也叫做常规迁移.离线迁移(Offline Migrati ...

  8. C中静态存储区和动态存储区

    c语言中需要内存来存放数据.而内存主要分为两类:静态存储区和动态存储区. 1.静态存储区 (1)分为数据区(只读数据区(代码区?在linux中又叫文本段.text).读写数据区.data).未初始化区 ...

  9. Linux网络系列--YUM仓库部署与NFS服务(YUM本地源仓库与远程ftp仓库部署、YUM命令使用、NFS共享存储服务讲解及实验)

    文章目录 一. 构建YUM软件仓库 1.1 本地源YUM仓库配置 1.2 远程yum仓库(借助FTP协议) 1.2.1 准备网络安装源(服务器端) 1.2.2 配置软件仓库位置(客户机端) 二. YU ...

最新文章

  1. 动手动脑课后实验性的问题
  2. BCH:“变法”是以史为鉴
  3. SOA与微服务基本原则及对比
  4. C# 学习笔记(17)操作SQL Server 上
  5. input的onkeyup效果 超级简短代码
  6. python有几种打开方式_Python中几个以“__”开头的方法介绍总结
  7. 又栽了?苹果侵犯高通三项专利需赔偿3100万美元
  8. 计算机硬件物理设备包含,计算机硬件
  9. mongodb启动很慢:[initandlisten] found 1 index(es) that
  10. Solr搜索引擎——中文分词器
  11. 矩阵分解 Cholesky分解
  12. aria2Android服务器教程,Aria2自动更新BT Tracker服务器列表的方法
  13. 使用smtp服务器发送邮件_如何使用SMTP服务器发送WordPress电子邮件
  14. Windows10台式机前面板插孔声音和麦克风不可用
  15. 学生宿舍(寝室)管理系统设计与实现(JavaWeb 附 演示、源码下载地址)
  16. “不一样的六一儿童节”——暨线上公益跳绳颁奖活动圆满结束
  17. 网上店铺怎样给宝贝定价
  18. 后版权时代,网易云用IPO开启进击之路
  19. Socket编程入门C++
  20. 搜狗号码通与天翼开放平台达成合作 可识别号码扩容

热门文章

  1. 在哪个范围内的计算机网络可以称为局域网,计算机网络概述 习题
  2. petalinux 1144文档 安装流程
  3. 在html中写for循环表格trtd,嵌套的HTML表格在javascript for循环
  4. Hadoop入门及官网教程
  5. 标准型微电脑酸碱度氧化还原电位控制器(UPH -100C)
  6. pythonn 安装包 清华镜像_Python 清华镜像设置
  7. lcd和oled的区别哪个好
  8. C++ 中transform方法的疑惑和自己的感受
  9. 强大的达梦数据库图形界面工具
  10. c语言windows.h头文件详解