跳至内容

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

2 分钟阅读
0

我找不到我的 Amazon Elastic Container Service (Amazon ECS) 任务或 Amazon Elastic Kubernetes Service (Amazon EKS) 容器组的容器日志。

简短描述

如果您缺少 Amazon ECS 或 Amazon EKS 的容器日志,则主机实例可能存在问题。或者,如果您的容器化应用程序没有写入到正确的位置,则 Docker 进程守护程序可能看不到您的日志。

以下是容器化应用程序不写入部分或全部日志的常见场景:

  • 您在 Amazon ECS 的容器实例上运行 docker logs yourContainerName 命令。
  • 您在 Amazon ECS 中使用 awslogs log driver 执行任务。
  • 您为 Amazon EKS 集群运行 kubectl logs yourPodName 命令。

解决方法

对您的 Amazon ECS 任务的日志进行故障排除

确认您的任务配置正确

  • 查看包含您的日志的容器的日志配置。日志驱动程序由 ECS 任务定义的容器定义部分中的 logConfiguration 参数设置。日志驱动程序是根据容器设置的。如果您的 ECS 任务有多个容器定义,请验证包含日志的容器的日志配置是否正确。
  • 查看容器实例的任务清理配置。Amazon ECS 容器代理会自动删除日志文件以回收可用空间。要延长容器实例上的日志文件保留时间,请减少任务清理的频率。

查看您的 CloudWatch 日志

如果您的任务使用 awslogs 日志驱动程序,则日志将流式传输到 Amazon CloudWatch Logs。这些日志永远不会写入容器实例。docker logs yourContainerName 命令返回以下错误消息:"Error response from daemon: configured logging driver does not support reading."

授予正确的权限

要允许 Amazon Elastic Compute Cloud (Amazon EC2) 的启动类型流式传输到 CloudWatch Logs,请向您的容器实例的 IAM 角色授予权限。

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

如果仍缺少日志,请完成 Troubleshoot the application container(应用程序容器故障排除)部分中的步骤。

对 Amazon EKS 上的 Kubernetes 容器组的日志进行故障排除

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

kubectl logs yourPodName

**注意:**在容器组退出后,kubelet 会自动删除日志文件。有关详细信息,请参阅 Kubernetes 网站上的未使用容器和映像的垃圾回收。要将这些日志文件在 Worker 节点上保留更长时间,请将 kubelet 配置为降低运行垃圾回收的频率。

如果仍缺少日志,请完成 Troubleshoot the application container(应用程序容器故障排除)部分中的步骤。

对应用程序容器进行故障排除

要对应用程序容器进行故障排除,请完成以下任务:

  • 在容器构建期间,将应用程序设置为正确的日志级别。
    **注意:**您的应用程序可能要求您通过环境变量或在配置文件中设置日志记录。
  • 让您的应用程序成为容器的 ENTRYPOINT。有关详细信息,请参阅 Docker 文档网站上的 ENTRYPOINT
    **注意:**您的 dockerfile 中的 ENTRYPOINT 是记录 STDOUTSTDERR I/O 流的过程。有关详细信息,请参阅 Docker 文档网站上的查看容器日志
  • 使用链接到 STDOUTSTDERR 的应用程序日志文件来构建容器。或者,将您的应用程序配置为直接登录到 /proc/1/fd/1 (stdout) 和 /proc/1/fd/2 (stderr)。有关示例,请参阅 Docker Hub 网站上的 nginxhttpd 官方容器映像。
    **注意:**如果您的用例允许,请将您的应用程序进程设置为容器中的父进程。如果您的容器使用 shell 脚本作为 ENTRYPOINT,请将该脚本配置为在运行时初始化容器数据。
AWS 官方已更新 2 年前