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

Ada*_*tan 18 amazon-web-services docker kubernetes amazon-cloudwatchlogs

AWS CloudWatch登录Docker

设置在AWS CloudWatch的日志驱动程序docker与做log-driver=awslogs和log-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
Run Code Online (Sandbox Code Playgroud)

我的问题

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

我的问题

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

我试过了什么

sil*_*fox 15

根据我的理解,Kubernetes更喜欢群集级日志记录到Docker日志记录驱动程序.

我们可以使用流利的方法来收集,转换容器日志并将其推送到CloudWatch Logs.

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

以下是一些解释.

在

使用DaemonSet,流利地从主机文件夹中收集每个容器日志/var/lib/docker/containers.

过滤

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

日志记录就是这样的.

{
    "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"
    }
}
Run Code Online (Sandbox Code Playgroud)

使一些标签与Fluentd record_transformer过滤器插件.

{
    "log": "...",
    "stream": "stderr",
    "docker": {
        ...
    },
    "kubernetes": {
        ...
    },
    "pod_name": "weave-net-4n4kc",
    "container_name": "weave"
}
Run Code Online (Sandbox Code Playgroud)

退房

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

使用log_group_name_key和log_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>
Run Code Online (Sandbox Code Playgroud)

  • 试图解决这个问题。目前我已(使用 kops)将 docker logDriver 设置为 awslogs,并且我的所有日​​志都正确发送到 CloudWatch,但位于单个日志组中。我正在尝试找到一种方法将它们放入每个应用程序的单独日志组中。我应该关闭 docker 级别的日志记录,而是像上面描述的那样使用 fluentd 进行排序吗? (2认同)
  • @cryanbhu你需要编辑kops集群,例如`kops edit cluster`,然后设置如下:docker:logDriver:awslogs logOpt: - awslogs-region = eu-west-1 - awslogs-group = integration - tag = {{.名称}} (2认同)