k8s教程:Kubernetes集群使用网络存储NFS
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
#ubuntu部署
sudo apt install nfs-kernel-server #centos部署
yum -y install rpcbind nfs-utils
#创建要共享的目录
mkdir /data/redis -p #编辑NFS配置并加入以下内容
vim /etc/exports
/data/redis 192.168.31.0/(rw,sync,no_all_squash,no_subtree_check) #载入配置
exportfs -rv
•/data/redis:NFS服务要共享的目录
•192.168.31.0/24:允许访问NFS服务器的网段,也可以写 * ,表示所有地址都可以访问NFS服务
•rw:访问到此目录的服务器都具备读写权限
•sync:数据同步写入内存和硬盘
•no_all_squash:所有用户对根目录具备完全管理访问权限
•no_subtree_check:不检查父目录的权限
启动NFS服务
#ubuntu启动
systemctl start nfs-kernel-server #centos启动
systemctl start rpcbind nfs
服务检查
#查看NFS配置是否生效
cat /var/lib/nfs/etab
/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) #通过showmount命令查看NFS共享情况
showmount -e 192.168.31.241
Export list for 192.168.31.241:
/data/redis 192.168.31.0/
2.创建Pod资源配置清单 Pod中使用Redis镜像来运行容器,将Redis数据持久化至NFS服务器上,下面是简单实用Redis的一个示例:
cat redis-nfs.yaml
apiVersion: v1
kind: Pod
metadata:
name: vol-nfs-pod
labels:
app: redis
spec:
containers:
- name: redis
image: redis:5.0 #镜像版本
ports:
- containerPort: #容器端口
name: redisport
volumeMounts:
- mountPath: /data #卷挂载到容器中的目录
name: redisdata #卷名称
volumes:
- name: redisdata #卷名称
nfs: #使用NFS网络存储卷
server: 192.168.31.241 #NFS服务器地址
path: /data/redis #NFS服务器共享的目录
readOnly: false #是否为只读
上面的示例定义在资源配置文件vol-nfs.yaml中,其中的Pod资源拥有一个关联至NFS服务器192.168.31.241的存储卷,Redis容器将其挂载到容器中的/data目录上,它是运行于容器中的redis-server数据的持久保持位置。
提示:这里应确保事先要存在一个名为192.168.31.241的NFS服务器,其输出了/data/redis目录,并授权给Kubernetes集群中的节点访问。主机和目录都可以按需进行调整。
整整127页的《阿里云内部超全K8s实战手册》免费分享给大家哦!点击后方链接免费领:https://apprhKAAI3V6603.h5.xeknow.com/st/9W8SJYDIn

3.创建Pod对象并查看配置信息
kubectl apply -f redis-nfs.yaml
如下vol-nfs-pod被调度到了k8s-node03上
kubectl get pods -o wide -l app=redis
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
vol-nfs-pod / Running 106s 172.20.3.31 k8s-node03 <none> <none>
kubectl describe pods/vol-nfs-pod
Name: vol-nfs-pod
Namespace: default
Priority:
Node: k8s-node03/192.168.31.233
Start Time: Tue, Jun :: +
Labels: app=redis
Annotations: Status: Running
IP: 172.20.3.31
IPs:
IP: 172.20.3.31
Containers:
redis:
Container ID: docker://dfa1a8202b39460db9e1d9849d6a4d416ab50a33e48fae556d1248a8efb3193b
Image: redis:5.0
Image ID: docker-pullable://redis@sha256:faea2a6e7fbd7e144cdb15e12ff16c24a5b8d9469e25796ec6d3b7a82a817e1b
Port: /TCP
Host Port: /TCP
State: Running
Started: Tue, Jun :: +
Ready: True
Restart Count:
Environment: <none>
Mounts:
/data from redisdata (rw) #挂载到容器中的路径
/var/run/secrets/kubernetes.io/serviceaccount from default-token-xxqkj (ro)
Conditions:
Type Status
Initialized True
Ready True
ContainersReady True
PodScheduled True
Volumes:
redisdata:
Type: NFS (an NFS mount that lasts the lifetime of a pod) #NFS类型挂载
Server: 192.168.31.241 #Server是192.168.31.
Path: /data/redis #Server的路径
ReadOnly: false #不是只读
default-token-xxqkj:
Type: Secret (a volume populated by a Secret)
SecretName: default-token-xxqkj
Optional: false
QoS Class: BestEffort
Node-Selectors: <none>
Tolerations: node.kubernetes.io/not-ready:NoExecute for 300s
node.kubernetes.io/unreachable:NoExecute for 300s
Events:
Type Reason Age From Message
---- ------ ---- ---- -------
Normal Scheduled 2m29s default-scheduler Successfully assigned default/vol-nfs-pod to k8s-node03
Normal Pulled 2m28s kubelet, k8s-node03 Container image "redis:5.0" already present on machine
Normal Created 2m28s kubelet, k8s-node03 Created container redis
Normal Started 2m28s kubelet, k8s-node03 Started container redis
4.查看容器挂载情况
kubectl exec -it vol-nfs-pod -- df -hT | grep data
Filesystem Type Size Used Avail Use% Mounted on
192.168.31.241:/data/redis nfs4 59G .4G 47G % /data #查看/data目录下的数据
kubectl exec -it vol-nfs-pod -- ls /data
dump.rdb
5.资源创建完成后,可通过其命令客户端redis-cli创建测试数据,并手动触发其同步于存储系统中
kubectl exec -it vol-nfs-pod -- redis-cli
127.0.0.1:> set mykey 'hello world'
OK
127.0.0.1:> get mykey
"hello world"
127.0.0.1:> BGSAVE
Background saving started
127.0.0.1:> exit
6.测试数据持久化 为了测试数据持久化效果,下面删除Pod资源vol-nfs-pod,然后再对该Pod重建查看数据是否能够正常访问
#删除Pod
kubectl delete pods vol-nfs-pod #重建Pod
kubectl apply -f redis-nfs.yaml #连接到Redis容器并查看数据持久化效果
kubectl exec -it vol-nfs-pod -- redis-cli
127.0.0.1:> keys *
) "mykey"
127.0.0.1:> get mykey
"hello world"
如上所示可以看到,此前创建的mykey及其数据在Pod资源重建后依然存在。
k8s教程:Kubernetes集群使用网络存储NFS的更多相关文章
- 三十二、kubernetes集群的网络实现
		
Kubernetes集群的网络实现 CNI介绍及集群网络选型 容器网络接口(Container Network Interface),实现kubernetes集群的Pod网络通信及管理.包括: CNI ...
 - Kubeadm部署K8S(kubernetes)集群(测试、学习环境)-单主双从
		
1. kubernetes介绍 1.1 kubernetes简介 kubernetes的本质是一组服务器集群,它可以在集群的每个节点上运行特定的程序,来对节点中的容器进行管理.目的是实现资源管理的自动 ...
 - k8s技术--Kubernetes集群kubectl命令的常见使用方法
		
简介:kubectl是一个命令行界面,用于运行针对Kubernetes群集的命令. 语法: kubectl [command] [TYPE] [NAME] [flags] command:指定您希望对 ...
 - 二进制文件方式安装kubernetes集群
		
所有操作全部用root使用者进行,高可用一般建议大于等于3台的奇数,我们使用3台master来做高可用 练习环境说明: 参考GitHub master: kube-apiserver,kube-con ...
 - 灵雀云开源网络插件Kube-OVN 1.4.0 版发布!支持跨集群容器网络、NetworkPolicy 日志
		
从 1.4 开始 Kube-OVN 支持将多个 Kubernetes 集群容器网络打通,不同集群之间的 Pod 可以通过 Pod IP 直接互相通信.本版本还支持 ACL 日志,可以记录因 Netwo ...
 - 在Kubernetes集群中使用calico做网络驱动的配置方法
		
参考calico官网:http://docs.projectcalico.org/v2.0/getting-started/kubernetes/installation/hosted/kubeadm ...
 - 二进制安装部署kubernetes集群---超详细教程
		
本文收录在容器技术学习系列文章总目录 前言:本篇博客是博主踩过无数坑,反复查阅资料,一步步搭建完成后整理的个人心得,分享给大家~~~ 本文所需的安装包,都上传在我的网盘中,需要的可以打赏博主一杯咖啡钱 ...
 - K8S学习笔记之二进制的方式创建一个Kubernetes集群
		
0x00 单节点搭建和简述 minikube Minikube是一个工具,可以在本地快速运行一个单点的Kubernetes,尝试Kubernetes或日常开发的用户使用.不能用于生产环境. 官方地址: ...
 - kubernetes(k8s)容器集群管理
		
Kubernetes介绍 Kubernetes是google在2014年6月开源的一个容器集群管理系统,使用go语言开发,Kubernetes也称k8s. k8s是google内部一个叫borg的容器 ...
 
随机推荐
- Linux MySQL分库分表之Mycat
			
介绍 背景 当表的个数达到了几百千万张表时,众多的业务模块都访问这个数据库,压力会比较大,考虑对其进行分库 当表的数据达到几千万级别,在做很多操作都比较吃力,考虑对其进行分库或分表 数据切分(shar ...
 - Flink Table Api & SQL 初体验,Blink的使用
			
概述 Flink具有Table API和SQL-用于统一流和批处理. Table API是用于Scala和Java的语言集成查询API,它允许以非常直观的方式组合来自关系运算符(例如选择,过滤和联接) ...
 - 定量度量程序复杂度的McCabe方法
			
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 请画出下面代码的 ...
 - 06.DBUnit实际运用
			
在上面的代码中 package com.fjnu.service; import java.io.FileWriter; import java.sql.SQLException; import st ...
 - 观察者模式(Observer Pattern)(二):HeadFirst中的气象站的实现
			
1 观察者模式的原理,首先由一个主题,当主题发送变化的时候,通知该主题的订阅者 按照上面的分析我们来进行设计 1.抽象主题Subject public interface Subject { publ ...
 - mock api测试demo
			
前言 本测试demo基于Spring框架测试,这几个月也是刚刚接触Spring的项目.如果不对的地方请多谅解. 正文 1.创建测试类,添加注解 @RunWith(SpringRunner.class) ...
 - 前端进阶笔记之核心基础知识---那些HTML标签你熟悉吗?
			
目录 1.交互实现 1.1 meta标签:自动刷新/跳转 1.2 title标签:消息提醒 2.性能优化 2.1 script标签:调整加载顺序提升渲染速度 2.2 link标签:通过预处理提升渲染速 ...
 - codeforce 796C - Bank Hacking(无根树+思维)
			
题目 Although Inzane successfully found his beloved bone, Zane, his owner, has yet to return. To searc ...
 - day05数据绑定
			
流程:普通编辑-添加编辑模式 <text>数据绑定</text> <view>{{message}}</view> <button bindtap ...
 - IdentityServer4 4.x版本 配置Scope的正确姿势
			
前言 IdentityServer4 是为ASP.NET Core系列量身打造的一款基于 OpenID Connect 和 OAuth 2.0 认证的框架 IdentityServer4官方文档:ht ...