如何将Kubernetes日志发送到AWS CloudWatch?

AWS CloudWatchlogin到Docker

在docker中设置AWS CloudWatch Logs驱动程序是通过log-driver=awslogslog-opt ,例如,

 #!/bin/bash docker run \ --log-driver=awslogs \ --log-opt awslogs-region=eu-central-1 \ --log-opt awslogs-group=whatever-group \ --log-opt awslogs-stream=whatever-stream \ --log-opt awslogs-create-group=true \ wernight/funbox \ fortune 

我的问题

我想在Kubernetes群集中使用AWS CloudWatch日志,其中每个群集包含一些Docker容器。 每个部署将有一个单独的日志组,每个容器将有一个单独的stream。 我找不到通过Kubernetes create / apply将日志参数发送到Docker容器的方法。

我的问题

如何将log-driverlog-opt选项参数发送到pod / deployment中的Docker容器?

我试过了什么

  • 在每台机器上设置Docker守护进程的相关参数。 这是可能的,但是这样,同一台机器上的所有容器将共享相同的stream – 因此与我的情况无关。
  • kubectl applykubectl apply RTFM
  • kops读相关的README
  • 阅读Kubernetes Logging Architecture

据我所知,Kubernetes更喜欢集群级日志logging到Docker日志logging驱动程序。

我们可以使用fluentd收集,转换和推送容器日志到CloudWatch Logs。

所有你需要的是用ConfigMap和Secret创build一个stream畅的DaemonSet。 文件可以在Githubfind。 它已经通过了Kubernetes v1.7.5的testing。

以下是一些解释。

使用DaemonSet,fluentd从主文件夹/var/lib/docker/containers docker / containers中收集每个容器日志。

过滤

fluent-plugin-kubernetes_metadata_filter插件从Kubernetes API服务器加载Pod的元数据。

日志logging会是这样的。

 { "log": "INFO: 2017/10/02 06:44:13.214543 Discovered remote MAC 62:a1:3d:f6:eb:65 at 62:a1:3d:f6:eb:65(kube-235)\n", "stream": "stderr", "docker": { "container_id": "5b15e87886a7ca5f7ebc73a15aa9091c9c0f880ee2974515749e16710367462c" }, "kubernetes": { "container_name": "weave", "namespace_name": "kube-system", "pod_name": "weave-net-4n4kc", "pod_id": "ac4bdfc1-9dc0-11e7-8b62-005056b549b6", "labels": { "controller-revision-hash": "2720543195", "name": "weave-net", "pod-template-generation": "1" }, "host": "kube-234", "master_url": "https://10.96.0.1:443/api" } } 

使用Fluentd record_transformerfilter插件制作一些标签。

 { "log": "...", "stream": "stderr", "docker": { ... }, "kubernetes": { ... }, "pod_name": "weave-net-4n4kc", "container_name": "weave" } 

退房

fluent-plugin-cloudwatch-logs插件发送到AWS CloudWatch Logs。

使用log_group_name_keylog_stream_name_keyconfiguration,日志组和stream名称可以是logging的任何字段。

 <match kubernetes.**> @type cloudwatch_logs log_group_name_key pod_name log_stream_name_key container_name auto_create_stream true put_log_events_retry_limit 20 </match> 

根据kubernate,Kubernetes不提供用于日志数据的本地存储解决scheme,但是您可以将许多现有的日志logging解决scheme集成到Kubernetes集群和kubernate 集群级别日志logging体系结构中 。

Kubernetes没有指定日志logging代理,但两个可选日志logging代理与Kubernetes发行版打包在一起:Stackdriver日志logging可用于Google Cloud Platform和Elasticsearch。 您可以在专用文档中find更多信息和说明。 都使用fluentd和自定义configuration作为节点上的代理。

Fluentd映像也将Kubernetes日志发送到CloudWatch,因此您可以使用它来部署 ,