Как отправить журналы 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 в контейнере/развертывании?
Что я пробовал
Ответы
Ответ 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,
Ответ 3
Для установки Fluentd вы можете использовать график Helm:
$ helm install --name my-release incubator/fluentd-cloudwatch
Это от:
https://github.com/kubernetes/charts/tree/master/incubator/fluentd-cloudwatch
Ответ 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
Ответ 5
Попробуйте CloudWatch Container Insights, https://aws.amazon.com/about-aws/whats-new/2019/05/cloudwatch-container-insights-for-eks-and-kubernetes-preview/. Он имеет свободный yaml для журналов приложений, журналов плоскости данных (кублет и среда выполнения контейнера) и журналов хоста.