配置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 等系统中。

 

posted @ 2025-07-03 15:26  羊脂玉净瓶  阅读(28)  评论(0)    收藏  举报