怎么修改容器的日志目录

399 阅读2分钟

今天遇到一个需求就是我们在安装k3s的时候需要指定对应的安装目录,我们发现 k3s 自带有一个安装的参数可供我们指定 --data-dir

但是安装完成后发现日志的目录还是在 /var/log/pods 下面,想着这个日志目录的参数能不能修改

Google 发现容器的日志目录实际上是由kubelet来创建的,这个目录改不了,是 hard-code 进去的

但是也有人提出了对应的issule,但是也是一直被官网搁置了

github.com/kubernetes/…

参考下面的文章将日志目录软链到指定的安装目录

How to change default pod log directory(/var/log/pods) in kubernetes cluster? - General Discussions

ln -s /your/real/path /var/lib/pods

注意这里有个坑,我们如果软链的真实目录不存在,则执行上述命令仍然会执行成功,但是安装完成后会发现kubelet 报错创建 Failed to create pod log directory

参看源码如下

// If the container logs directory does not exist, create it.
// TODO: create podLogsRootDirectory at kubelet.go when kubelet is refactored to
// new runtime interface
if _, err := osInterface.Stat(podLogsRootDirectory); os.IsNotExist(err) {
    if err := osInterface.MkdirAll(podLogsRootDirectory, 0755); err != nil {
        klog.ErrorS(err, "Failed to create pod log directory", "path", podLogsRootDirectory)
    }
}

我们发现是先会判断对应的 /var/log/pods 这个目录是否存在,不存在的话才会创建

  1. 如果我们使用 ln -s /my/path/pods /var/log/pods,现在 /var/log/pods 是一个软链接但是这个链接指向的真实 /my/path/pods 目录并没有提前创建出来

  2. 则 Stat 接口就会返回 IsNotExist 的错误,从而就会去创建这个目录 /var/log/pods ,但是这个目录名已经被软链接的名占用了,创建就会报错 Failed to create pod log directory

  3. 所以创建 软链 接的时候,一定要把链接的真实路径名提前创建出来

  4. 上面问题的解法就是我们在执行 ln -s 之前先把 /my/path/pods 这个目录创建出来即可

参考文档

docs.k3s.io/cli/server