09-Kubernetes中使用NFS做pod持久化存储
1.0 节点环境
ip地址 | 主机名称 | 角色 |
---|---|---|
10.0.0.70 | master1.lec.org | K8s 集群主节点 1,Master和etcd |
10.0.0.71 | node1.lec.org | K8s 集群工作节点 1 |
10.0.0.72 | node2.lec.org | K8s 集群工作节点 2 |
10.0.0.73 | node3.lec.org | K8s 集群工作节点 3 |
10.0.0.80 | nfs | nfs服务器 |
1.1 NFS存储卷
nfs存储卷
◼ 将nfs服务器上导出(export)的文件系统用作存储卷
◼ nfs是文件系统级共享服务,它支持多路挂载请求,可由多个Pod对象同时用作存储卷后端
配置参数
◼ server :NFS服务器的IP地址或主机名,必选字段
◼ path :NFS服务器导出(共享)的文件系统路径,必选字段
◼ readOnly :是否以只读方式挂载,默认为false
1.2 基于NFS的多pod示例
1.3 搭建nfs服务
- nfs机器10.0.0.80
# 1、安装nfs服务端,2049端口
root@nfs:~# apt install nfs-kernel-server -y
# 2、创建共享目录
root@nfs:~# mkdir /nfs-data
# 3、设置共享,把目录进行共享,赋予读写权限,不做权限映射,是哪个用户写的就是哪个用户的uid和gid权限
root@nfs:~# echo -e "/nfs-data 10.0.0.0/24(no_root_squash,no_subtree_check,rw)" >> /etc/exports
/nfs-data 10.0.0.0/24(no_root_squash,no_subtree_check,rw)
# 4、立即生效配置
root@nfs:~# exportfs -r
# 查看
root@nfs:~# exportfs -v
/nfs-data 10.0.0.0/24(sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)
1.4 每个node节点安装showmount命令客户端
- node节点
# 1、安装showmount命令客户端
root@node2:~# apt install nfs-common -y
# 2、检查能否识别到nfs服务器,和权限
root@node2:~# showmount -e 10.0.0.80
Export list for 10.0.0.80:
/nfs-data 10.0.0.0/24
1.5 测试nfs
1.5.1 创建pod: redis-nfs-001,并写入数据
- master节点
# yaml文件
vi nfs-1.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: redis-nfs-001
spec:
nodeName: node1.lec.org
containers:
- name: redis
image: redis:6
imagePullPolicy: IfNotPresent
volumeMounts:
- name: redisdata
mountPath: /data
volumes:
- name: redisdata
nfs:
server: 10.0.0.80
path: /nfs-data
# 创建pod
kubectl apply -f nfs-1.yaml
# 查看pod
kubectl get pod -o wide
# 进入容器并向redis中写入数据
root@master1:~/yaml# kubectl exec -it redis-nfs-001 -- /bin/sh
# redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> set name lec
OK
127.0.0.1:6379> get name
"lec"
127.0.0.1:6379> save
OK
127.0.0.1:6379> exit
# ls /data
dump.rdb
- nfs节点
# nfs服务上查看文件
root@nfs:~# ls -lrt /nfs-data
total 4
-rw-r--r-- 1 systemd-coredump systemd-coredump 107 Feb 4 11:27 dump.rdb
- master节点
# master上删除pod
kubectl delete -f nfs-1.yaml
1.5.2 创建pod: redis-nfs-002,并查看数据是否是nfs上的数据
- master节点
# yaml文件
vi nfs-2.yaml
---
apiVersion: v1
kind: Pod
metadata:
name: redis-nfs-002
spec:
nodeName: node2.lec.org
containers:
- name: redis
image: redis:6
imagePullPolicy: IfNotPresent
volumeMounts:
- name: redisdata
mountPath: /data
volumes:
- name: redisdata
nfs:
server: 10.0.0.80
path: /nfs-data
# 创建pod
kubectl apply -f nfs-2.yaml
# 查看pod
kubectl get pod -o wide
# 进入容器,并查看redis数据(发现和nfs上数据一致)
root@master1:~/yaml# kubectl exec -it redis-nfs-002 -- /bin/sh
# redis-cli
127.0.0.1:6379> keys *
1) "name"
127.0.0.1:6379> get name
"lec"
# 删除pod
kubectl delete -f nfs-2.yaml