14

AWS CloudWatch的日志在泊坞

设定docker的AWS CloudWatch的日志驱动器与log-driver=awslogslog-opt完成,例如 -如何将Kubernetes日志发送到AWS CloudWatch?

#!/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 

我的问题

我想用AWS CloudWatch的日志在Kubernetes群集中,每个群集包含几个Docker容器。每个部署都有一个单独的日志组,每个容器都有一个单独的流。我找不到通过Kubernetes create/apply将测井参数发送到码头集装箱的方法。

我的问题

我怎么能发送log-driverlog-opt参数泊坞窗容器中POD /部署?

有什么我试图

回答

9

据我了解,Kubernetes喜欢集群层面记录到日志泊坞司机。

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

您只需要用ConfigMap和Secret创建一个流畅的DaemonSet。文件可以在Github找到。它已经通过了Kubernetes v1.7.5的测试。

以下是一些解释。

随着DaemonSet,fluentd从主机文件夹/var/lib/docker/containers收取每个集装箱日志。

过滤

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

日志记录会是这样的。

{ 
    "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_transformer filter插件。

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

fluent-plugin-cloudwatch-logs插件发送到AWS CloudWatch的日志。

随着log_group_name_keylog_stream_name_key配置,日志组和流名称可以是记录的任何字段。

<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> 
+0

将会对这种解决保持容器隔离?他们能够阅读彼此的日志吗? –

+0

是的,它们是相互隔离的。由于卷映射,只有流利的容器才能读取所有容器的日志(在主机上)。 – silverfox

4

按kubernate,Kubernetes提供了日志数据没有本地存储解决方案,但你可以在许多现有的日志解决方案集成到您的Kubernetes集群和kubernate cluster-level-logging-architectures

Kubernetes未指定日志记录代理,但两个可选日志代理与Kubernetes版本打包在一起:Stackdriver Logging以与Google Cloud Platform和Elasticsearch结合使用。您可以在专用文档中找到更多信息和说明。两者均使用fluentd和自定义配置作为节点上的代理。

Fluentd图像发送Kubernetes日志CloudWatch的,所以你可以用它来Deploy

2

sliverfox有一个伟大的答案。你不必建立你自己的形象。 Coulld也直接使用fluentd官方docker镜像,fluent/fluentd-kubernetes-daemonset:cloudwatch。代码在fluentd-kubernetes-daemonset github

你可以用configmap替换默认的fluent.conf。像下面的ds.yaml一样,在configmap.yaml中编写你自己的fluent.conf。对于完整的yaml文件,您可以参考我们编写的示例ds.yamlconfigmap.yaml

volumeMounts: 
    - name: varlog 
     mountPath: /var/log 
    - name: varlibdockercontainers 
     mountPath: /var/lib/docker/containers 
     readOnly: true 
    - name: config-volume 
     mountPath: /fluentd/etc/ 
    volumes: 
    - name: varlog 
    hostPath: 
     path: /var/log 
    - name: varlibdockercontainers 
    hostPath: 
     path: /var/lib/docker/containers 
    - name: config-volume 
    configMap: 
     name: fluentd-cw-config