30、K8S-数据存储之NFS

发布时间 2023-03-24 23:47:09作者: 小粉优化大师

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