NFS存储

NFS即网络文件系统Network File System,它是一种分布式文件系统协议,最初是由Sun MicroSystems公司开发的类Unix操作系统之上的一款经典网络存储方案,其功能是在允许客户端主机可以像访问本地存储一样通过网络访问服务端文件。

Kubernetes的NFS存储用于将某事先存在的NFS服务器导出export的存储空间挂载到Pod中来供Pod容器使用。与emptyDir不同的是,NFS存储在Pod对象终止后仅是被卸载而非删除。另外,NFS是文件系统及共享服务,它支持同时存在多路挂载请求。定义NFS存储时,常用到以下字段。

•server:NFS服务器的IP地址或者主机名,必选字段。

•path:NFS服务器导出(共享)的文件系统路径,必选字段。

•readOnly:是否以只读挂载,默认为false。

1.部署一个NFS服务 在集群之外的节点192.168.31.241

  1. #ubuntu部署
  2. sudo apt install nfs-kernel-server
  3.  
  4. #centos部署
  5. yum -y install rpcbind nfs-utils
  1. #创建要共享的目录
  2. mkdir /data/redis -p
  3.  
  4. #编辑NFS配置并加入以下内容
  5. vim /etc/exports
  6. /data/redis 192.168.31.0/(rw,sync,no_all_squash,no_subtree_check)
  7.  
  8. #载入配置
  9. exportfs -rv

•/data/redis:NFS服务要共享的目录

•192.168.31.0/24:允许访问NFS服务器的网段,也可以写 * ,表示所有地址都可以访问NFS服务

•rw:访问到此目录的服务器都具备读写权限

•sync:数据同步写入内存和硬盘

•no_all_squash:所有用户对根目录具备完全管理访问权限

•no_subtree_check:不检查父目录的权限

启动NFS服务

  1. #ubuntu启动
  2. systemctl start nfs-kernel-server
  3.  
  4. #centos启动
  5. systemctl start rpcbind nfs

服务检查

  1. #查看NFS配置是否生效
  2. cat /var/lib/nfs/etab
  3. /data/redis 192.168.31.0/(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=,anongid=,sec=sys,rw,secure,root_squash,no_all_squash)
  4.  
  5. #通过showmount命令查看NFS共享情况
  6. showmount -e 192.168.31.241
  7. Export list for 192.168.31.241:
  8. /data/redis 192.168.31.0/

2.创建Pod资源配置清单 Pod中使用Redis镜像来运行容器,将Redis数据持久化至NFS服务器上,下面是简单实用Redis的一个示例:

  1. cat redis-nfs.yaml
  2. apiVersion: v1
  3. kind: Pod
  4. metadata:
  5. name: vol-nfs-pod
  6. labels:
  7. app: redis
  8. spec:
  9. containers:
  10. - name: redis
  11. image: redis:5.0 #镜像版本
  12. ports:
  13. - containerPort: #容器端口
  14. name: redisport
  15. volumeMounts:
  16. - mountPath: /data #卷挂载到容器中的目录
  17. name: redisdata #卷名称
  18. volumes:
  19. - name: redisdata #卷名称
  20. nfs: #使用NFS网络存储卷
  21. server: 192.168.31.241 #NFS服务器地址
  22. path: /data/redis #NFS服务器共享的目录
  23. readOnly: false #是否为只读

上面的示例定义在资源配置文件vol-nfs.yaml中,其中的Pod资源拥有一个关联至NFS服务器192.168.31.241的存储卷,Redis容器将其挂载到容器中的/data目录上,它是运行于容器中的redis-server数据的持久保持位置。

  1. 提示:这里应确保事先要存在一个名为192.168.31.241NFS服务器,其输出了/data/redis目录,并授权给Kubernetes集群中的节点访问。主机和目录都可以按需进行调整。

整整127页的《阿里云内部超全K8s实战手册》免费分享给大家哦!点击后方链接免费领:https://apprhKAAI3V6603.h5.xeknow.com/st/9W8SJYDIn

3.创建Pod对象并查看配置信息

  1. kubectl apply -f redis-nfs.yaml

如下vol-nfs-pod被调度到了k8s-node03上

  1. kubectl get pods -o wide -l app=redis
  2. NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
  3. vol-nfs-pod / Running 106s 172.20.3.31 k8s-node03 <none> <none>
  1. kubectl describe pods/vol-nfs-pod
  2. Name: vol-nfs-pod
  3. Namespace: default
  4. Priority:
  5. Node: k8s-node03/192.168.31.233
  6. Start Time: Tue, Jun :: +
  7. Labels: app=redis
  8. Annotations: Status: Running
  9. IP: 172.20.3.31
  10. IPs:
  11. IP: 172.20.3.31
  12. Containers:
  13. redis:
  14. Container ID: docker://dfa1a8202b39460db9e1d9849d6a4d416ab50a33e48fae556d1248a8efb3193b
  15. Image: redis:5.0
  16. Image ID: docker-pullable://redis@sha256:faea2a6e7fbd7e144cdb15e12ff16c24a5b8d9469e25796ec6d3b7a82a817e1b
  17. Port: /TCP
  18. Host Port: /TCP
  19. State: Running
  20. Started: Tue, Jun :: +
  21. Ready: True
  22. Restart Count:
  23. Environment: <none>
  24. Mounts:
  25. /data from redisdata (rw) #挂载到容器中的路径
  26. /var/run/secrets/kubernetes.io/serviceaccount from default-token-xxqkj (ro)
  27. Conditions:
  28. Type Status
  29. Initialized True
  30. Ready True
  31. ContainersReady True
  32. PodScheduled True
  33. Volumes:
  34. redisdata:
  35. Type: NFS (an NFS mount that lasts the lifetime of a pod) #NFS类型挂载
  36. Server: 192.168.31.241 #Server是192.168.31.
  37. Path: /data/redis #Server的路径
  38. ReadOnly: false #不是只读
  39. default-token-xxqkj:
  40. Type: Secret (a volume populated by a Secret)
  41. SecretName: default-token-xxqkj
  42. Optional: false
  43. QoS Class: BestEffort
  44. Node-Selectors: <none>
  45. Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
  46. node.kubernetes.io/unreachable:NoExecute for 300s
  47. Events:
  48. Type Reason Age From Message
  49. ---- ------ ---- ---- -------
  50. Normal Scheduled 2m29s default-scheduler Successfully assigned default/vol-nfs-pod to k8s-node03
  51. Normal Pulled 2m28s kubelet, k8s-node03 Container image "redis:5.0" already present on machine
  52. Normal Created 2m28s kubelet, k8s-node03 Created container redis
  53. Normal Started 2m28s kubelet, k8s-node03 Started container redis

4.查看容器挂载情况

  1. kubectl exec -it vol-nfs-pod -- df -hT | grep data
  2. Filesystem Type Size Used Avail Use% Mounted on
  3. 192.168.31.241:/data/redis nfs4 59G .4G 47G % /data
  4.  
  5. #查看/data目录下的数据
  6. kubectl exec -it vol-nfs-pod -- ls /data
  7. dump.rdb

5.资源创建完成后,可通过其命令客户端redis-cli创建测试数据,并手动触发其同步于存储系统中

  1. kubectl exec -it vol-nfs-pod -- redis-cli
  2. 127.0.0.1:> set mykey 'hello world'
  3. OK
  4. 127.0.0.1:> get mykey
  5. "hello world"
  6. 127.0.0.1:> BGSAVE
  7. Background saving started
  8. 127.0.0.1:> exit

6.测试数据持久化 为了测试数据持久化效果,下面删除Pod资源vol-nfs-pod,然后再对该Pod重建查看数据是否能够正常访问

  1. #删除Pod
  2. kubectl delete pods vol-nfs-pod
  3.  
  4. #重建Pod
  5. kubectl apply -f redis-nfs.yaml
  6.  
  7. #连接到Redis容器并查看数据持久化效果
  8. kubectl exec -it vol-nfs-pod -- redis-cli
  9. 127.0.0.1:> keys *
  10. ) "mykey"
  11. 127.0.0.1:> get mykey
  12. "hello world"

如上所示可以看到,此前创建的mykey及其数据在Pod资源重建后依然存在。

k8s教程:Kubernetes集群使用网络存储NFS的更多相关文章

  1. 三十二、kubernetes集群的网络实现

    Kubernetes集群的网络实现 CNI介绍及集群网络选型 容器网络接口(Container Network Interface),实现kubernetes集群的Pod网络通信及管理.包括: CNI ...

  2. Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从

    1. kubernetes介绍 1.1 kubernetes简介 kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理.目的是实现资源管理的自动 ...

  3. k8s技术--Kubernetes集群kubectl命令的常见使用方法

    简介:kubectl是一个命令行界面,用于运行针对Kubernetes群集的命令. 语法: kubectl [command] [TYPE] [NAME] [flags] command:指定您希望对 ...

  4. 二进制文件方式安装kubernetes集群

    所有操作全部用root使用者进行,高可用一般建议大于等于3台的奇数,我们使用3台master来做高可用 练习环境说明: 参考GitHub master: kube-apiserver,kube-con ...

  5. 灵雀云开源网络插件Kube-OVN 1.4.0 版发布!支持跨集群容器网络、NetworkPolicy 日志

    从 1.4 开始 Kube-OVN 支持将多个 Kubernetes 集群容器网络打通,不同集群之间的 Pod 可以通过 Pod IP 直接互相通信.本版本还支持 ACL 日志,可以记录因 Netwo ...

  6. 在Kubernetes集群中使用calico做网络驱动的配置方法

    参考calico官网:http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm ...

  7. 二进制安装部署kubernetes集群---超详细教程

    本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...

  8. K8S学习笔记之二进制的方式创建一个Kubernetes集群

    0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...

  9. kubernetes(k8s)容器集群管理

    Kubernetes介绍 Kubernetes是google在2014年6月开源的一个容器集群管理系统,使用go语言开发,Kubernetes也称k8s. k8s是google内部一个叫borg的容器 ...

随机推荐

  1. Jenkins自动化测试脚本的构建

    [准备环境] 自动化测试框架脚本 Linux下的Python环境    https://www.cnblogs.com/xinhua19/p/12836522.html [思路] 测试顺序是,测试通过 ...

  2. http 的8中请求方式:

    http 的8中请求方式: 1.OPTIONS 返回服务器针对特定资源所支持的HTTP请求方法,也可以利用向web服务器发送‘*’的请求来测试服务器的功能性 2.HEAD 向服务器索与GET请求相一致 ...

  3. class 类组件:

    ES6  中的class 类组件: // class 关键字:确定一个类型student以类的概念存在 class student{ //构造函数 是默认自动执行 // 初始化 name age 属性 ...

  4. 计算机网络之DNS协议

    DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换为IP地址的工 ...

  5. 入门大数据---Spark_Structured API的基本使用

    一.创建DataFrame和Dataset 1.1 创建DataFrame Spark 中所有功能的入口点是 SparkSession,可以使用 SparkSession.builder() 创建.创 ...

  6. eclipse导入git项目

    复制项目的git路径 Eclipse打开 Git Repostitories 视图 弹出show view窗口 选择ok ,进入git repositories 视图窗口 我这里已经导入从我的git仓 ...

  7. 联通BSS-ESS-CBSS系统安装相关

    前言 1. 版本信息 版本 日期 记录 1.0 2016.08.15 初始版本 2. 作者信息 信息 内容 部门 夷陵区分公司 作者 Z.J.T 邮箱 coralfoxzjt@163.com 必须操作 ...

  8. TJOI2013 奖学金—大根堆实现(洛谷P3963)

    奖学金 题目描述 小张学院有 \(c\) 名学生,第 \(i\) 名学生的成绩为 \(ai\) ​,要获得的奖学金金额为 \(bi\) . 要从这 \(c\) 名学生中挑出 \(n\) 名学生发奖学金 ...

  9. PE文件格式详解(七)

    PE文件格式详解(七)   Ox00 前言 前面好几篇在讲输入表,今天要讲的是输出表和地址的是地址重定位.有了前面的基础,其实对于怎么找输出表地址重定位的表已经非常熟悉了.   0x01 输出表结构 ...

  10. ubuntu docker安装与部署java,mysql,nginx镜像

    docker 安装与部署java,mysql,nginx docker 配置 安装docker $ sudo apt-get remove docker docker-engine docker.io ...