Подтвердить что ты не робот

Как отправить журналы Kubernetes на AWS CloudWatch?

AWS CloudWatch Logs in Docker

Установка драйвера AWS CloudWatch Logs в 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

Моя проблема

Я хотел бы использовать журналы AWS CloudWatch в кластере Kubernetes, где каждый контейнер содержит несколько контейнеров Docker. Каждое развертывание будет иметь отдельную группу журналов, и каждый контейнер будет иметь отдельный поток. Я не мог найти способ отправить параметры протоколирования в контейнеры докеров через Kubernetes create/apply.

Мой вопрос

Как отправить параметры log-driver и log-opt в контейнер Docker в контейнере/развертывании?

Что я пробовал

  • Установка соответствующих параметров для демона Docker на каждом компьютере. Это возможно, но таким образом все контейнеры на одной машине будут иметь один и тот же поток - поэтому это не имеет отношения к моему делу.
  • RTFM для kubectl apply
  • Чтение соответствующего README в kops
  • Прочитайте Kubernetes Logging Architecture
4b9b3361

Ответ 1

Из того, что я понимаю, Кубернетес предпочитает регистрировать уровень на уровне кластера для драйвера регистрации Docker.

Мы могли бы использовать fluentd для сбора, преобразования и перемещения журналов контейнеров в журналы CloudWatch.

Все, что вам нужно, - создать бесплатный демо-сервер DaemonSet с помощью ConfigMap и Secret. Файлы можно найти в Github. Он был протестирован с Kubernetes v1.7.5.

Ниже приведены некоторые пояснения.

В

С помощью DaemonSet, fluentd собирает все журналы контейнеров из главной папки /var/lib/docker/containers.

Фильтр

fluent-plugin-kubernetes_metadata_filter плагин загружает метаданные pod с сервера API Kubernetes.

Запись журнала будет такой.

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

При конфигурации 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>

Ответ 2

В соответствии с кубернатом, Kubernetes не предоставляет никакого собственного решения для хранения данных журнала, но вы можете интегрировать многие существующие решения для ведения журнала в свой кластер Kubernetes и kubernate cluster-level-logging-architectures.

Kubernetes не указывает агента регистрации, но два дополнительных агента регистрации собираются вместе с выпуском Kubernetes: Stackdriver Logging для использования с облачной платформой Google и Elasticsearch. Вы можете найти дополнительную информацию и инструкции в специальных документах. Оба используют fluentd с настраиваемой конфигурацией в качестве агента на node.

Fluentd для отправки журналов Kubernetes в CloudWatch, поэтому вы можете использовать это для Deploy,

Ответ 4

У Sliverfox отличный ответ. Вам не нужно создавать свой собственный имидж. Также может напрямую использовать официальный образ докера fluentd, fluentd/fluentd-kubernetes-daemonset: cloudwatch. Код находится на github fluentd-kubernetes-daemonset.

Вы можете заменить стандартный файл fluent.conf на карту конфигурации. Как показано ниже в ds.yaml, и напишите свой собственный файл fluent.conf в configmap.yaml. Для полных файлов yaml вы можете обратиться к примеру ds.yaml и configmap.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