如何对 Amazon ECS 或 Amazon EKS 的容器日志进行问题排查?

上次更新时间:2019 年 7 月 15 日

我找不到我的 Amazon Elastic Container Service (Amazon ECS) 任务或 Amazon Elastic Kubernetes Service (Amazon EKS) Pod 的容器日志。我可以在哪找到这些日志?

简短描述

当您执行以下操作时,您的容器化应用程序可能无法写入部分或所有日志:

  • 在 Amazon ECS 中的容器实例上运行“docker logs yourContainerName”命令。
  • 为 Amazon ECS 中的任务使用 awslogs 日志驱动程序
  • 针对 Amazon EKS 集群运行“kubectl logs yourPodName”命令。

当出现以下情形时,您可能会遇到这些问题:

  • 主机实例有问题。
  • 因为您的容器化应用程序没有写入正确的位置,所以您的日志不会在 Docker 守护程序中显示。

解决方法

查找您的 Amazon ECS 任务的日志

要确认您的任务已正确配置,以便找到您的日志,请注意以下事项:

  • 日志驱动程序由 ECS 任务定义中容器定义部分的 logConfiguration 参数设置。每个容器均设置了日志驱动程序。如果您的 ECS 任务有多个容器定义,则确认日志配置是否适合包含您的日志的容器。
  • Amazon ECS 容器代理会自动清除日志文件,以释放空间。要延长日志文件在容器实例上的保留时间,您可以降低任务清理的频率。

如果您的任务使用的是 awslogs 日志驱动程序,则满足以下条件:

  • 日志会流式传输到 Amazon CloudWatch Logs。这些日志绝不会写入容器实例。
  • “docker logs yourContainerName”命令会返回以下错误消息:“Error response from daemon: configured logging driver does not support reading”。

要允许 EC2 启动类型流式传输到 CloudWatch Logs,请为您的容器实例使用的 IAM 角色授予权限。

要允许 Fargate 启动类型流式传输到 CloudWatch Logs,请为您任务使用的 IAM 角色授予权限。

如果您仍未找到自己的日志,请完成对容器进行问题排查部分的步骤。

在 Amazon EKS 上查找您的 Kubernetes Pod 的日志

要返回从 Pod 容器生成的日志文件,请运行以下 kubectl 命令:

kubectl logs yourPodName

注意:垃圾收集过程中,kubelet 会在 Pod 退出之后自动清除日志文件。要延长日志文件在工作节点上的保留时间,请配置 kubelet 以降低运行垃圾收集的频率。

如果您仍未找到自己的日志,请完成对容器进行问题排查部分的步骤。

对容器进行问题排查

对于您的应用程序,请注意以下选项:

  • 在容器构建期间,将您的应用程序设置为相应的日志级别。
    注意:您可能需要通过环境变量或者在配置文件中设置日志记录,具体取决于您的应用程序。
  • 让您的应用程序成为容器的 ENTRYPOINT
    注意:Docker 文件中的 ENTRYPOINT 是记录 STDOUT 和 STDERR I/O 流的流程。
  • 使用链接到 STDOUTSTDERR 的应用程序日志文件构建您的容器,或者将您的应用程序配置为直接记录到 /proc/1/fd/1 (stdout) 和 /proc/1/fd/2 (stderr)。有关示例,请查看官方 nginxhttpd 容器映像。
    注意:如果可能,请将您的应用程序进程设置为容器中的父进程。如果您的容器使用 Shell 脚本作为 ENTRYPOINT,则将脚本配置为在运行时初始化您的容器数据

这篇文章对您有帮助吗?

您觉得我们哪些地方需要改进?


需要更多帮助?