30、K8S-数据存储之NFS
1、基础知识
1.1、需求
根据我们对hostpath的了解,我们发现,虽然hostpath可以根据pod的配置自动创建关联的宿主机目录,但
是宿主机目录下面没有我们想要的数据文件,所以,在集群场景中,我们想要基于hostpath方式实现更强大的配置效果,就需要把所有的数据文件进行同步,而这不是我们想要的。
基于此,我们需要一种可以实现网络存储的方式。
1.2、nfs存储
使用NFS网络文件系统提供的共享目录存储数据时,需要在系统中部署一个NFS环境,通过volume的配置,实现pod内的容器间共享nfs目录。
1.3、nfs-属性解析
1.3.1、配置属性
kubectl explain pod.spec.volumes.nfs
path 指定nfs服务器暴露的共享地址
readOnly 是否只能读,默认false
server 指定nfs服务器的地址
1.3.2、配置格式
volumes: - name: 卷名称 nfs: server: nfs_server_address path: "共享目录"
1.3.3、注意事项
要求k8s所有集群都必须支持nfs命令,即所有节点都必须执行 yum install nfs-utils -y
2、NFS-实践
2.1、给演示主机增加一块10G硬盘
增加硬盘后,记得重新一下系统
2.2、磁盘准备
2.2.1、格式化硬盘
# 列出增加硬盘 register ~]# fdisk -l /dev/sdb Disk /dev/sdb: 10.7 GB, 10737418240 bytes, 20971520 sectors # 格式化硬盘 register ~]# mkfs.ext4 /dev/sdb # 格式化完成 register ~]# blkid | grep sdb /dev/sdb: UUID="c14897c9-7acd-4857-9a6a-5720f725c38c" TYPE="ext4"
2.2.2、挂载硬盘并且设置开启自动挂载
# 挂载硬盘 register ~]# mkdir /nfs-data register ~]# mount /dev/sdb /nfs-data/ # 获取该磁盘的uuid register ~]# blkid | grep sdb | awk '{print $2}' | sed 's#"##g' UUID=c14897c9-7acd-4857-9a6a-5720f725c38c # 设置开机挂载 UUID=$(blkid | grep sdb | awk '{print $2}' | sed 's#"##g') echo "$UUID /nfs-data ext4 defaults 0 0" >> /etc/fstab 属性解析 第一个0代表不备份数据 第二个0代表启动系统时候,不校验磁盘 # 挂载所有,检查是否能挂载成功 mount -a # 挂载成功 register ~]# df -h | grep nfs /dev/sdb 9.8G 37M 9.2G 1% /nfs-data
2.3、安装NFS
2.3.1、安装方法
2.3.2、配置共享目录
echo '/nfs-data *(rw,no_root_squash,sync)' > /etc/exports # 命令验证 exportfs # 启动服务设置开机自启动 systemctl start nfs systemctl enable nfs
2.3.3、测试效果
# 查询可挂载点 register ~]# showmount -e 192.168.10.33 Export list for 192.168.10.33: /nfs-data * # 测试挂载是否成功 register ~]# mount -t nfs 192.168.10.33:/nfs-data /mnt/ # 挂载是否成功的查询 register ~]# mount | grep nfs sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime) nfsd on /proc/fs/nfsd type nfsd (rw,relatime) 192.168.10.33:/nfs-data on /mnt type nfs4 (rw,relatime,vers=4.1,rsize=262144,wsize=262144,namlen=255,
hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=192.168.10.33,local_lock=none,addr=192.168.10.33) # 卸载挂载点 register ~]# umount /mnt/
2.3.4、注意事项
如果客户端想要使用nfs的功能,必须提前安装软件和启动服务,否则会发生找不到资源的报错。
2.4、redis服务使用NFS作持久化数据-实践
2.4.1、定义资源配置清单
cat >volumes-nfs.yml<<'EOF' apiVersion: v1 kind: Pod metadata: name: volumes-nfs spec: volumes: - name: redisdatapath nfs: server: 192.168.10.33 path: /nfs-data containers: - name: redis image: 192.168.10.33:80/k8s/redis:latest volumeMounts: - mountPath: /data name: redisdatapath EOF kubectl apply -f volumes-nfs.yml
2.4.2、验证是否成功
# 启动pods成功后,进入pod写数据保存 master1 ]# kubectl exec -it volumes-nfs -- /bin/bash root@volumes-nfs:/data# redis-cli 127.0.0.1:6379> set name cyc OK 127.0.0.1:6379> set age 19 OK 127.0.0.1:6379> bgsave Background saving started register ~]# ll /nfs-data/ total 4 -rw------- 1 polkitd input 111 Mar 24 23:26 dump.rdb # 删除pod,再创建看看redis数据是否还存在 master1 ]# kubectl delete pod volumes-nfs master1 ]# kubectl exec -it volumes-nfs -- /bin/bash root@volumes-nfs:/data# redis-cli 127.0.0.1:6379> KEYS * 1) "name" 2) "age" 127.0.0.1:6379> get name "cyc" 127.0.0.1:6379> get age "19" # 证明数据已持久化成功
3、其它配置
3.1、GlusterFS资源配置清单
apiVersion: v1 kind: Pod metadata: name: volumes-glusterfs-demo labels: app: redis spec: containers: - name: redis image: redis:alpine ports: - containerPort: 6379 name: redisport volumeMounts: - mountPath: /data name: redisdata volumes: - name: redisdata glusterfs: endpoints: glusterfs-endpoints path: kube-redis
3.2、CephFS资源配置清单
apiVersion: v1 kind: Pod metadata: name: volumes-cephfs-demo spec: containers: - name: redis image: redis:alpine volumeMounts: - mountPath: "/data" name: redis-cephfs-vol volumes: - name: redis-cephfs-vol cephfs: monitors: - 10.0.0.21:6789 - 10.0.0.22:6789 - 10.0.0.23:6789 path: /kube/namespaces/default/redis1 user: fsclient secretFile: "/etc/ceph/fsclient.key"
3.3、cender资源配置清单
apiVersion: v1 kind: Pod metadata: name: volume-cinder-demo spec: containers: - image: mysql name: mysql args: - "--ignore-db-dir" - "lost+found" env: - name: MYSQL_ROOT_PASSWORD value: YOUR_PASS ports: - containerPort: 3306 name: mysqlport volumeMounts: - name: mysqldata mountPath: /var/lib/mysql volumes: - name: mysqldata cinder: volumeID: e2b8d2f7-wece-90d1-a505-4acf607a90bc fsType: ext4