我有一个状态为CrashLoopBackOff
的吊舱,从kubectl logs <pod-name> -p
中看到的日志只显示了一部分。在其他文件(例如/var/log/something/something.log
)中找到其他日志。
由于该Pod崩溃,我无法kubectl exec
进入那里的外壳并查看文件。
如何查看不再运行的容器产生的日志文件?
更具体地说,我正在$HOME/logs/es.log
下查找日志文件(位于失败的容器中)
答案 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容器。
这就是我所做的:
emptyDir{}
的卷添加到了豆荚中mountPath
是它将日志写入到的目录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)