配置NFS类型的卷存储日志
在k8s部署应用,有个很重要的问题需要考虑,那就是日志。pod中的日志会随着pod的销毁而丢失,所以如何把日志持久化保存,就是非常重要的一件事。
第一种方案:
创建HostPath的类型的卷,也就是说把pod中的日志目录映射到宿主机上,这样就可以实现日志的持久化存储,先来看下这种方案。【简单介绍这个,重点还是NFS类型】
第二种方案:
大概思路是:采用NFS共享存储来存储日志,将pod的日志路径挂载到NFS的共享目录下,来实现日志的集中存储。
实现步骤:
1. 部署NFS服务器【我的是ubuntu22.04系统】
apt install nfs-kernel-server -y
2. 配置共享目录
假设我的NFS共享目录是/data/nfs_share/
编辑/etc/exports 配置文件,添加如下内容
/data/nfs_share *(rw,sync,no_all_squash,no_root_squash,no_subtree_check)
3. 启动服务
systemctl start nfs-kernel-server
systemctl status nfs-kernel-server
输出结果如下:
这里有个点需要注意:
可以看到的是,nfs-server的状态是active(exited),起初我还很疑惑,认为是nfs服务器没启动成功,后来经过查询,才知道这是正常状态,因为内核中的nfs服务已经在运行了。
可以看下nfs进程是否存在
root@node2:/data/nfs_share/gateway-log# ps axu | grep nfs
root 13954 0.0 0.0 6480 2304 pts/1 S+ 15:40 0:00 grep --color=auto nfs
root 16214 0.0 0.0 5540 2868 ? Ss 13:47 0:00 /usr/sbin/nfsdcld
root 21517 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 21518 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 21519 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 21520 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 21521 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 21522 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 21523 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 21524 0.0 0.0 0 0 ? I 13:51 0:00 [nfsd]
root 52294 0.0 0.0 0 0 ? I< 15:16 0:00 [nfsiod]
可以看到nfs进程是运行状态。
在每个节点都安装以下软件,否则在挂载nfs卷后,pod启动会报错
apt install -y nfs-common -y
到这一步,就可以创建卷了。
然后添加NFS相关配置
挂载到pod
到这一步pod中的日志挂载到nfs共享目录就完成了。可以在nfs服务器上的/data/nfs_share/gateway-log 中看到pod中的日志了。
但是,这里还有个问题,假如我的deployment有多个pod,分布在不同的节点上,并且日志的名字都一样,那都往一个共享的目录里写日志,是不是会有问题呢?
先说结论:会有冲突风险!
如果两个副本的容器在不同节点,写入同一个路径下、同名日志文件,例如 app.log
,那么:
-
最终写入的是同一个物理文件;
-
容器写入操作可能会互相覆盖、交错、甚至造成日志错乱;
-
日志内容可能混合、丢失或覆盖。
那怎么解决呢?
方案 1:每个副本写入独立子目录(推荐!)
例如:/data/nfs_share/gateway-log/<pod-name>/app.log
实现方式:
增加一个变量,将pod名字作为目录名字传入
然后以yaml文件的形式编辑,如下图
打开之后,在文件中,添加如下内容:
volumeMounts:- mountPath: /app/logs
name: gateway-logs-nfs
subPathExpr: $(HOSTNAME)
实现的效果就是:POD中/app/logs 目录下的日志文件,会存在nfs共享文件夹/data/nfs_share/gateway-log中生成一个以pod名字命名的目录在存放这个pod的日志文件
看下效果:
方案 2:集中日志收集(FluentBit/Fluentd/Logstash)
如果只是为了收集日志,推荐将日志输出到 stdout/stderr,然后由 Sidecar 或 DaemonSet 方式统一收集,不需要写入共享卷。
这样可以避免所有 NFS 卷操作,日志直接收集到 Elasticsearch、Loki 等系统中。