Amazon web services 如何将Kubernetes日志发送到AWS CloudWatch? AWS CloudWatch登录Docker

Amazon web services 如何将Kubernetes日志发送到AWS CloudWatch? AWS CloudWatch登录Docker,amazon-web-services,docker,kubernetes,amazon-cloudwatchlogs,Amazon Web Services,Docker,Kubernetes,Amazon Cloudwatchlogs,例如,在docker中设置AWS CloudWatch日志驱动程序是通过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-str

例如,在
docker
中设置AWS CloudWatch日志驱动程序是通过
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
我的问题 我想在Kubernetes集群中使用AWS CloudWatch日志,其中每个pod包含几个Docker容器。每个部署将有一个单独的日志组,每个容器将有一个单独的流。我找不到通过Kubernetes
create
/
apply
将日志参数发送到docker容器的方法

我的问题 如何将
日志驱动程序
日志选项
参数发送到pod/部署中的Docker容器?

我试过什么
  • 为每台机器上的Docker守护程序设置相关参数。这是可能的,但这样,同一台机器上的所有容器都将共享同一个流——因此与我的情况无关
  • 实时调频
  • 阅读
  • 阅读

据我所知,Kubernetes更喜欢集群级日志记录,而不是Docker日志记录驱动程序

我们可以使用它来收集、转换容器日志,并将其推送到CloudWatch日志

您只需使用ConfigMap和Secret创建fluentd守护程序集。可以在中找到文件。它已经过Kubernetes v1.7.5版的测试

下面是一些解释

在里面 使用守护程序集,fluentd从主机文件夹
/var/lib/docker/containers
收集每个容器日志

滤器 插件从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"
    }
}
使用Fluentd过滤器插件制作一些标签

{
    "log": "...",
    "stream": "stderr",
    "docker": {
        ...
    },
    "kubernetes": {
        ...
    },
    "pod_name": "weave-net-4n4kc",
    "container_name": "weave"
}
出来 插件发送到AWS CloudWatch日志

使用
log\u group\u name\u key
log\u stream\u name\u 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>

@输入cloudwatch\u日志
日志\组\名称\密钥盒\名称
日志\流\名称\密钥容器\名称
自动创建流为真
放置\u日志\u事件\u重试\u限制20

根据kubernate的说法,Kubernetes没有为日志数据提供本机存储解决方案,但您可以将许多现有的日志记录解决方案集成到Kubernetes群集和kubernate中

Kubernetes没有指定日志代理,但Kubernetes发行版附带了两个可选的日志代理:用于Google云平台的Stackdriver日志和Elasticsearch。您可以在专用文档中找到更多信息和说明。两者都将fluentd与自定义配置一起用作节点上的代理


Fluentd image将Kubernetes日志发送到CloudWatch,因此您可以使用它,Sliverfox有一个很好的答案。你不必建立自己的形象。也可以直接使用fluentd官方docker图像,fluent/fluentd kubernetes守护程序:cloudwatch。密码打开了

您可以用configmap替换默认的fluent.conf。如下面的ds.yaml中所示,在configmap.yaml中编写自己的fluent.conf。对于完整的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

您可以使用舵图安装Fluentd:

$ helm install --name my-release incubator/fluentd-cloudwatch
这是来自:

此解决方案是否会将容器隔离?他们能读懂彼此的日志吗?是的,他们彼此隔离。由于卷映射,只有fluentd容器可以读取所有容器的日志(在它的主机上)。我正在设法解决这个问题。目前,我已经(使用kops)将docker logDriver设置为awslogs,并且我的所有日志都正确地发送到CloudWatch,但只在一个日志组中发送。我正试图找到一种方法,将这些应用程序分为不同的日志组。我应该关闭docker级别的日志记录,而不是像您上面描述的那样使用fluentd进行排序吗?@olly-w您可以分享一下如何设置docker logDriver以登录到CloudWatch吗?我试图找出原因,但我了解到k8s和kops@cryanbhu您需要编辑kops集群,例如
kops编辑集群
,然后设置如下内容:docker:logDriver:awslogs logOpt:-awslogs region=eu-west-1-awslogs group=integration-tag={{.Name}尝试CloudWatch容器洞察。它有一个用于应用程序日志、数据平面日志(kubelet和容器运行时)和主机日志的fluentd yaml。