如何排查 Amazon ECS 或 Amazon EKS 容器日志缺失的问题?

上次更新时间:2020 年 8 月 21 日

我找不到我 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 角色授予权限。

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

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

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

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

kubectl logs yourPodName

注意:kubelet 会在 Pod 退出后自动删除日志文件。有关详细信息,请参阅 Kubernetes 网站上的容器回收。要延长日志文件在工作节点上的保留时间,请配置 kubelet 以降低运行垃圾回收的频率。

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

对容器进行问题排查

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

  • 在容器构建期间,将您的应用程序设置为相应的日志级别。
    注意:您的应用程序可能需要通过环境变量或者在配置文件设置日志记录。
  • 让您的应用程序成为容器的 ENTRYPOINT。有关详细信息,请参阅 Docker 文档网站上的 ENTRYPOINT
    注意:Docker 文件中的 ENTRYPOINT 是在 Docker Docs 网站上记录记录 STDOUTSTDERR I/O 流的进程。有关更多信息,请参阅 Docker Docs 网站上的查看容器或服务的日志
  • 使用链接到 STDOUTSTDERR 的应用程序日志文件构建您的容器,或者将您的应用程序配置为直接记录到 /proc/1/fd/1 (stdout) 和 /proc/1/fd/2 (stderr)。有关示例,请查看 Docker Hub 网站上的 nginxhttpd 容器镜像。
    注意:如果可能,请将您的应用程序进程设置为容器中的父进程。如果您的容器将 Shell 脚本作为 ENTRYPOINT 使用,则请配置该脚本以运行时初始化您的容器数据。有关详细信息,请参阅 Docker 文档网站上的 ENTRYPOINT

这篇文章对您有帮助吗?


您是否需要账单或技术支持?