首页 > 解决方案 > Kubernetes - 挂载容器标准输出标准错误日志

问题描述

我使用“ chentex/random-logger ”图像,它将标准输出/标准错误写入容器。我想制作部署 yaml,它运行 chentex 的图像,并将它的日志放在共享卷内的文件中。我可以在不修改图像的情况下做到这一点吗?

这是镜像的简单部署:

apiVersion: v1
kind: Deployment
metadata:
  name: random-logger
spec:
  replicas: 1
  template:
    metadata:
      labels:
        app: random-logger
    spec:
      containers:
      - name: random-logger
        image: chentex/random-logger:latest

标签: dockerkubernetescontainersstdoutstderr

解决方案


stdout为在容器中运行的应用程序发送日志消息是最佳实践。chentex/random-logger只是遵循这种方法,没有任何选项来配置它,但我们可以提出这样的 hack:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: random-logger
spec:
  selector:
    matchLabels:
      app: random-logger
  template:
    metadata:
      labels:
        app: random-logger
    spec:
      containers:
      - name: random-logger
        image: chentex/random-logger:latest
        command: ["sh", "-c",  "./entrypoint.sh &> /logfile"]

从运行pod中请求日志时,什么都看不到:

$ kubectl logs random-logger-76c6fd98d5-8d5fm

应用程序日志写入logfile容器内:

$ kubectl exec random-logger-76c6fd98d5-8d5fm cat /logfile
2019-02-28T00:23:23+0000 DEBUG first loop completed.
2019-02-28T00:23:25+0000 ERROR something happened in this execution.
2019-02-28T00:23:29+0000 INFO takes the value and converts it to string.
2019-02-28T00:23:31+0000 WARN variable not in use.
2019-02-28T00:23:37+0000 INFO takes the value and converts it to string.

虽然这是可能的,但一般不建议这样做。有关更多背景信息,请参阅有关日志架构的 Kubernetes 文档。


推荐阅读