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的容器 ...
随机推荐
- xutils工具上传日志文件--使用https并且带进度条显示
package logback.ecmapplication.cetcs.com.myapplication; import android.app.Activity; import android. ...
- MyBatis学习笔记(2)--缓存
一.什么是缓存 --存在于内存中的临时数据. 为什么使用缓存?--减少和数据库的交互次数,提高执行效率. 适用于缓存的数据: 1.经常查询并且不经常改变的数据. 2.数据的正确与否对最终结果影响较小的 ...
- Python三大器之生成器
Python三大器之生成器 生成器初识 什么是生成器 生成器本身属于迭代器.继承了迭代器的特性,惰性求值,占用内存空间极小. 为什么要有生成器 我们想使用迭代器本身惰性求值的特点创建出一个可以容纳百万 ...
- 安全测试中session和cookie
很多朋友做过安全测试应该都知道session和cookies他们的不同点: 1.存取方式不同.----cookie不支持中文,需要编码,仅支持ascll值.session能够存取任何类型的数据,包括j ...
- 自定义Springboot全局异常类
一.简要说明 如何实现网上文章基本是随便一搜就可以很快找到, 这里不再赘述. 二.Spring-web和Spring-webmvc 通过idea查看到两个注解位于 spring-web-5.2.2.R ...
- .NET Core控制台利用【Options】读取Json配置文件
创建一个 .NET Core控制台程序 添加依赖 Microsoft.Extensions.Configuration Microsoft.Extensions.Configuration.FileE ...
- Spring拦截器和SpringAop实现
一.拦截器 1.aop是面向切面编程,原理是java的发射技术. 2.分为三类,before.after.arround 3.springMvc为我们提供了一个适配器HandlerIntercepto ...
- Wooden Stricks——两个递增条件的线性DP
题目 一堆n根木棍.每个棒的长度和重量是预先已知的.这些木棒将由木工机械一一加工.机器需要准备一些时间(称为准备时间)来准备处理木棍.设置时间与清洁操作以及更换机器中的工具和形状有关.木工机械的准备时 ...
- angular入门--自定义过滤器
<html ng-app='app1'> <head> <meta name="generator" content="HTML Tidy ...
- MRCTF 2020-“TiKi小组”
题目状态: OPEN - 正在试图解这道题CLOSED - 这道题还没有打开SOLVED - 解决了!鼓掌撒花! 赛事信息 Flag格式:MRCTF{}起止时间:2020-03-27 18:00:00 ...