如何在 Elastic Beanstalk 多容器 docker 上使用 fluentd 日志驱动程序
Posted
技术标签:
【中文标题】如何在 Elastic Beanstalk 多容器 docker 上使用 fluentd 日志驱动程序【英文标题】:How to use fluentd log driver on Elastic Beanstalk Multicontainer docker 【发布时间】:2016-06-17 18:41:14 【问题描述】:我尝试将 fluentd 日志驱动程序与以下 Dockerrun.aws.json 一起使用,
“AWSEBDockerrunVersion”:2, “容器定义”:[ “名称”:“阿帕奇”, "图像": "php:5.6-apache", “基本”:是的, “记忆”:128, “端口映射”:[ “主机端口”:80, “容器端口”:80 ], “日志配置”: “logDriver”:“流利的”, “选项”: “流利地址”:“127.0.0.1:24224” ]但出现以下错误。
ERROR: Encountered error starting new ECS task: cancel the command.
"failures": [
"reason": "ATTRIBUTE",
"arn": "arn:aws:ecs:ap-northeast-1:000000000000:container-instance/00000000-0000-0000-0000-000000000000"
],
"tasks": []
ERROR: Failed to start ECS task after retrying 2 times.
ERROR: [Instance: i-00000000] Command failed on instance. Return code: 1 Output: beanstalk/hooks/appdeploy/enact/03start-task.sh failed. For more detail, check /var/log/eb-activity.log using console or EB CLI.
我应该配置什么?
【问题讨论】:
【参考方案1】:看来你也可以通过你的应用环境目录下的.ebextensions/01-fluentd.config
文件来完成,内容如下:
files:
"/home/ec2-user/setup-available-log-dirvers.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/sh
set -e
if ! grep fluentd /etc/ecs/ecs.config &> /dev/null
then
echo 'ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog","fluentd"]' >> /etc/ecs/ecs.config
fi
container_commands:
01-configure-fluentd:
command: /home/ec2-user/setup-available-log-dirvers.sh
现在你必须部署一个新的应用版本(还没有 fluentd 配置),重建你的环境,添加 fluentd 配置:
logConfiguration:
logDriver: fluentd
options:
fluentd-address: localhost:24224
fluentd-tag: docker.myapp
现在部署更新的应用程序,现在一切正常。
【讨论】:
谢谢迈克尔。几天后我会尝试并在这里报告结果。 我已经确认它工作正常。再次感谢。 这与哪个解决方案堆栈有关?我已将该文件添加到 .ebextensions 并验证 /etc/ecs/ecs.config 正在更新,但 ecs 代理未使用更新的日志记录驱动程序运行。我猜想 ecs 代理在该配置更改之前正在启动。 @matheeeny 在添加 .ebextensions 文件并使用该文件部署版本之后,您是否完成了环境重建(通过进入 beanstalk -> 环境 -> 操作 -> 重建环境)?我已经将它与Multi-container Docker 1.9.1 (Generic)
的一些早期版本一起使用。
我没有重建环境,但我做了一个不可变的部署,它拆除了实例并启动了新的实例。【参考方案2】:
我自己解决了这个问题。
首先,我准备了一个包含以下用户数据的自定义 ami。
#cloud-config
repo_releasever: 2015.09
repo_upgrade: none
runcmd:
- echo 'ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog","fluentd"]' >> /etc/ecs/ecs.config
其次,我定义了在我的环境 EC2 设置中创建的自定义 ami 的 ami id。最后,我将我的应用程序部署到 Elastic Beanstalk。之后,我环境中的fluentd log driver就可以正常工作了。
为了在 Elastic Beanstalk Multicontainer Docker 中使用 fluentd 日志驱动程序,需要在 /etc/ecs/ecs.config
中定义 ECS_AVAILABLE_LOGGING_DRIVERS
变量。 Elastic Beanstalk Multicontainer Docker 内部使用 ECS,因此相关设置在 ECS 文档中。
请阅读以下文档中的logConfiguration
部分:
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_definition_parameters.html
【讨论】:
【参考方案3】:我已经在接受的答案中添加了一条评论,只需添加我用来让它为我工作的完整 ebextension 文件
files:
"/home/ec2-user/setup-available-log-dirvers.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/sh
set -e
if ! grep fluentd /etc/ecs/ecs.config &> /dev/null
then
echo 'ECS_AVAILABLE_LOGGING_DRIVERS=["json-file","syslog","fluentd"]' >> /etc/ecs/ecs.config
fi
container_commands:
00-configure-fluentd:
command: /home/ec2-user/setup-available-log-dirvers.sh
01-stop-ecs:
command: stop ecs
02-stop-ecs:
command: start ecs
我们只是在设置日志驱动程序后重述 ecs
【讨论】:
以上是关于如何在 Elastic Beanstalk 多容器 docker 上使用 fluentd 日志驱动程序的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Amazon linux 2 在 Elastic beanstalk 中使用多容器 docker?
如何将特定日志文件从多容器 Docker Elastic Beanstalk 流式传输到 CloudWatch?
如何将 Let encrypt 添加到在 Elastic Beanstalk 上运行的多容器中
如何在 Elastic Beanstalk 应用程序中的 Docker 容器之间共享卷?
具有私有存储库的 Elastic Beanstalk 多容器 Docker CannotPullContainerError