今天遇到一个需求就是我们在安装k3s的时候需要指定对应的安装目录,我们发现 k3s 自带有一个安装的参数可供我们指定 --data-dir
但是安装完成后发现日志的目录还是在 /var/log/pods 下面,想着这个日志目录的参数能不能修改
Google 发现容器的日志目录实际上是由kubelet来创建的,这个目录改不了,是 hard-code 进去的
但是也有人提出了对应的issule,但是也是一直被官网搁置了
参考下面的文章将日志目录软链到指定的安装目录
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 这个目录是否存在,不存在的话才会创建
-
如果我们使用
ln -s /my/path/pods /var/log/pods,现在 /var/log/pods 是一个软链接但是这个链接指向的真实/my/path/pods目录并没有提前创建出来 -
则 Stat 接口就会返回 IsNotExist 的错误,从而就会去创建这个目录 /var/log/pods ,但是这个目录名已经被软链接的名占用了,创建就会报错 Failed to create pod log directory
-
所以创建 软链 接的时候,一定要把链接的真实路径名提前创建出来
-
上面问题的解法就是我们在执行 ln -s 之前先把
/my/path/pods这个目录创建出来即可