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

Tom*_*ino 7 kubernetes

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

由于这个 pod 崩溃了,我无法kubectl exec进入那里的 shell 并查看文件。

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

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

Tom*_*ino 5

我对这个看似常见的问题没有找到解决方案感到非常沮丧,因此我构建了一个 docker 镜像,它跟踪日志文件并将它们发送到 stdout,用作 sidecar 容器。


这是我所做的:

  1. emptyDir{}在 pod 中添加了一个卷
  2. 我将该卷安装到我的主容器中,mountPath它是将日志写入的目录
  3. 我在 pod 中添加了另一个容器,称为“logger”,图像是我编写的日志跟踪器 ( 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
Run Code Online (Sandbox Code Playgroud)

对于任何感兴趣的人,以下是我制作边车容器的方法:

Dockerfile:

FROM alpine:3.9

RUN apk add bash --no-cache

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

CMD ["./logtrack.sh"]

Run Code Online (Sandbox Code Playgroud)

添加尾:

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
Run Code Online (Sandbox Code Playgroud)

logtrack.sh:

FROM alpine:3.9

RUN apk add bash --no-cache

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

CMD ["./logtrack.sh"]

Run Code Online (Sandbox Code Playgroud)