Kubernetes与logrotate sidecar挂载点问题

时间:2018-10-15 10:45:03

标签: kubernetes logrotate

我正在尝试使用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

2 个答案:

答案 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和在运行中翻腾更容易。容器