Kubernetes-如何读取写入Pod中而不是stdout / stderr的文件中的日志?

时间:2019-03-25 13:53:00

标签: kubernetes

我有一个状态为CrashLoopBackOff的吊舱,从kubectl logs <pod-name> -p中看到的日志只显示了一部分。在其他文件(例如/var/log/something/something.log)中找到其他日志。

由于该Pod崩溃,我无法kubectl exec进入那里的外壳并查看文件。

如何查看不再运行的容器产生的日志文件?

更具体地说,我正在$HOME/logs/es.log下查找日志文件(位于失败的容器中)

3 个答案:

答案 0 :(得分:0)

基本上,这里有几个选项。

如果您要继续进行设置,

您可以从运行容器的主机访问已退出容器的文件。
找出容器所在的工作人员:

$ kubectl get pod my-pod -o custom-columns=Node:{.spec.nodeName} --no-headers
my-worker-node

然后,如果您有权访问此节点(例如通过shh),则可以找到该容器:

$ ID=$(docker ps -a | grep my-pod | grep -v POD | cut -d" " -f1)
$ docker cp $ID:/my.log .
$ cat my.log
log entry

如果您没有对节点的ssh访问权限,则可以使用以下插件:https://github.com/kvaps/kubectl-enter

但是通常这不是最佳实践

您不应将日志写入文件,而应将应用程序写入stdout / stderr,这样调试起来会容易得多

答案 1 :(得分:0)

对于无法解决这个看似常见的问题,我感到非常沮丧,于是我构建了一个Docker镜像,将日志文件拖尾并将其发送到stdout,用作sidecar容器。


这就是我所做的:

  1. 我将一个emptyDir{}的卷添加到了豆荚中
  2. 我将该卷安装到了我的主容器中,mountPath是它将日志写入到的目录
  3. 我在Pod中添加了另一个容器,称为“记录器”,该图像是我编写的日志跟踪器(lutraman/logger-sidecar:v2),并将相同的卷装载到/logs(我将该脚本编程为从该目录中读取日志)

然后,所有写入该目录的日志都可以由kubectl logs <pod-name> -c logger

访问

这是一个示例yaml:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: dummy
  labels:
    app: dummy
spec:
  selector:
    matchLabels:
      app: dummy
  template:
    metadata:
      labels:
        app: dummy
    spec:
      volumes:
        - name: logs
          emptyDir: {}
      containers:
        - name: dummy-app # the app that writes logs to files
          image: lutraman/dummy:v2
          ports:
            - containerPort: 8080
              name: http
              protocol: TCP
          env:
            - name: MESSAGE
              value: 'hello-test'
            - name: LOG_FILE
              value: '/var/log/app.log'
          volumeMounts:
            - name: logs
              mountPath: /var/log
        - name: logger # the sidecar container tracking logs and sending them to stdout
          image: lutraman/logger-sidecar:v2
          volumeMounts:
            - name: logs
              mountPath: /logs

对于任何有兴趣的人,这是我制作小车容器的方式:

Dockerfile:

FROM alpine:3.9

RUN apk add bash --no-cache

COPY addTail /addTail
COPY logtrack.sh /logtrack.sh

CMD ["./logtrack.sh"]

addTail:

#!/bin/sh

(exec tail -F logs/$3 | sed "s/^/$3: /" ) &
echo $! >> /tmp/pids

logtrack.sh:

#!/bin/bash

trap cleanup INT

function cleanup() {
  while read pid; do kill $pid; echo killed $pid; done < /tmp/pids
}

: > /tmp/pids

for log in $(ls logs); do
  ./addTail n logs $log
done

inotifyd ./addTail `pwd`/logs:n 

答案 2 :(得分:-1)

您是否尝试过$ kubectl logs <pod-name> <container-name> --previous 标志?

就像

import calendar

for i, m in enumerate (calendar.month_name):
    print(i,m)