在kubernetes中获取被杀死的docker容器的日志

时间:2019-02-21 13:46:15

标签: docker kubernetes

代码的简化版本

trap 'rm /tmp/not_done; echo "trap command got executed"; sleep 10' SIGTERM

wait_sigterm() {

  touch /tmp/not_done
  while [ -f /tmp/not_done ]
  do
      sleep 60 &
      wait $!  
  done
}

wait_sigterm

如何确定trap命令已执行?

一种方法是,我是否可以访问被终止容器的日志并检查我的回显消息。

我尝试在while循环中获取日志(kubectl -n名称空间名称日志pod-名称容器名称),这样我就可以选择最后写入的日志,直到容器还活着。

但是没有回显消息。 我的猜测是,一旦我们杀死容器或其他东西,日志就不会被写入。 有什么方法可以获取被杀死的容器的日志或测试上述情况?

2 个答案:

答案 0 :(得分:4)

方法1

如果要从POD POD_NAME中检出先前终止的容器的日志。 您可以将以下命令与-p标志一起使用

kubectl logs POD_NAME -c CONTAINER_NAME -p

您可以使用以下命令

获得更多信息,例如选项和标志
kubectl logs --help

方法2

确定终止消息的另一种方法是在Pod对象的“状态”字段中。

kubectl get pod $POD_NAME -o yaml

检查 containerStatuss 的字段 lastState

status:
  conditions:

  containerStatuses:
  - containerID: 
    image: registry.access.redhat.com/rhel7:latest
    imageID:
    lastState: {}

    state:
      running:

这里有更多详细信息reading-a-termination-message

答案 1 :(得分:0)

要确定容器吊舱的最后终止状态,可以使用-o go-template来获取它:

kubectl get pod $POD-NAME -n $NAMESPACE -o go-template='{{range.status.containerStatuses}}{{"Container Name: "}}{{.name}}{{"\r\nLastState: "}}{{.lastState}}{{end}}'

例如,在由于Jenkins节点上的内存不足而导致的容器终止时,我得到了:

容器名称:jenkins-node

最后状态:map [terminated:map [containerID:docker:// ac5df0fb9e213839758f9e7ecd77a73e80a1f59309d725145ca192d7350f0014 退出代码:137已完成时间:2020-11-25T06:50:50Z原因:OOM终止 开始于:2020-11-18T13:58:49Z]]

在此处查看其他选项:https://kubernetes.io/docs/tasks/access-application-cluster/list-all-running-container-images/#list-container-images-using-a-go-template-instead-of-jsonpath