amazon-web-services - 如何将 Kubernetes 日志发送到 AWS Clo

Docker 中的 AWS CloudWatch 日志

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 日志,其中每个 pod 都包含一些 Docker 容器。每个部署都有一个单独的日志组,每个容器都有一个单独的流。我找不到通过 Kubernetes create/apply 将日志记录参数发送到 docker 容器的方法。

我的问题

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

我尝试了什么

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

最佳答案

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

我们可以使用 fluentd收集、转换容器日志并将其推送到 CloudWatch Logs。

您只需要使用 ConfigMap 和 Secret 创建一个 fluentd DaemonSet。文件可在 Github 中找到.它已经使用 Kubernetes v1.7.5 进行了测试。

以下是一些解释。

使用 DaemonSet,fluentd 从主机文件夹 /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"
    }
}

使用 Fluentd 制作一些标签 record_transformer过滤插件。

{
    "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_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>

关于amazon-web-services - 如何将 Kubernetes 日志发送到 AWS CloudWatch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46469076/

相关文章:

docker - Jenkins + Docker : How to control docker

docker - 如何为 Docker 中的容器分配域名?

docker - boot2docker 存储的 docker 镜像在哪里?

docker - 多个 Docker 容器可以使用相同的主机/端口运行吗?

docker - Docker 容器中的 asp.net 核心与 Azure App 服务

docker - 如何将 Capistrano 与 Docker 集成进行部署?

docker - 在 Dockerbuild 文件中使用 docker-compose 环境变量

docker - 扩展本地 Dockerfile

python - 如何使用 pip 安装本地软件包作为 docker 构建的一部分?

docker - 在 docker 中标记图像