我正在尝试使用nginx和logrotate sidecar部署测试平台。 Logrotate边车取自:logrotate
我的Pod Yaml配置:
apiVersion: v1
kind: Pod
metadata:
name: nginx-apache-log
labels:
app: nginx-apache-log
spec:
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: logs
mountPath: /var/log
- name: logrotate
image: path/to/logrtr:sidecar
volumeMounts:
- name: logs
mountPath: /var/log
volumes:
- name: logs
emptyDir: {}
我想要实现的是Logrotate容器监视/var/log//.log,但是使用上述配置,nginx容器失败了,因为没有/ var / log / nginx :
nginx: [alert] could not open error log file: open() "/var/log/nginx/error.log" failed (2: No such file or directory)
2018/10/15 10:22:12 [emerg] 1#1: open() "/var/log/nginx/error.log" failed (2: No such file or directory)
但是,如果我从
更改了nginx的mountPath,mountPath: /var/log
收件人:
mountPath: /var/log/nginx
然后启动,登录到/var/log/nginx/access.log和error.log,但是logrotate sidecar看到/ var / log中的所有日志,而不是/ var / log / nginx /。仅使用一个nginx容器不是问题,但是我计划让更多的容器应用程序记录到它们自己的/ var / log / appname文件夹中。
有什么办法可以解决/解决这个问题?我不想为每个应用程序运行sidecar。
如果我将pod配置更改为:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
volumeMounts:
- name: logs
mountPath: /var/log
initContainers:
- name: install
image: busybox
command:
- mkdir -p /var/log/nginx
volumeMounts:
- name: logs
mountPath: "/var/log"
然后它失败并显示:
Warning Failed 52s (x4 over 105s) kubelet, k8s-slave1 Error: failed to start container "install": Error response from daemon: OCI runtime create failed: container_linux.go:348: starting container process caused "exec: \"mkdir -p /var/log/nginx\": stat mkdir -p /var/log/nginx: no such file or directory": unknown
答案 0 :(得分:1)
将安装路径保留为/var/log
。在您的nginx容器中,在启动脚本中执行mkdir /var/log/nginx
。您可能需要稍微调整目录权限才能使其正常工作。
答案 1 :(得分:0)
如果您在kubernetes中运行nginx,它可能正在登录到stdout
。运行kubectl logs <nginx pod> nginx
时,它将显示访问和错误日志。这些日志由kubernetes自动进行logrotate,因此在这种情况下,您将不需要logrotate sidecar。
如果您运行的是未登录到stdout的Pod,则这是kubernetes中的反模式。始终登录到stdout对您更有好处:kubernetes可以为您处理日志轮换,并且使用kubectl logs
查看日志比运行kubectl exec
和在运行中翻腾更容易。容器