Эффективное управление журналами Kubernetes с помощью Fluentd и Elasticsearch
Эффективное управление журналами в Kubernetes может значительно повысить наблюдаемость и оперативную аналитику приложений. Fluentd, сборщик данных с открытым исходным кодом, в сочетании с Elasticsearch, мощным поисковым и аналитическим движком, предлагает превосходное решение по агрегации и анализу журналов из всего кластера Kubernetes. Данная статья посвящена тонкостям настройки стека Fluentd и Elasticsearch, позволяющим обеспечить эффективное управлене журналами.
Почему именно Fluentd и Elasticsearch?
Сочетание Fluentd и Elasticsearch в контексте управления логами Kubernetes выгодно выделяется своей бесшовной интеграцией, масштабируемостью и глубиной анализа (по сравнению с другими альтернативными решениями, такими как Logstash, Graylog или Splunk).
Преимущества Fluentd: Fluentd разработан для простоты и эффективностиработы с данными. Он легче Logstash, что значительно упрощает его развертывание и требует меньших затрат. Его подключаемая архитектура поддерживает сотни входов и выходов, обеспечивая непревзойденную гибкость.
Сильные стороны Elasticsearch: Хотя другие решения, такие как Graylog и Splunk, также предлагают мощные возможности анализа данных, скорость и масштабируемость Elasticsearch, особенно при работе с большими объемами журнальных данных, заметно выделяют его на фоне других. Аналитика в режиме реального времени и широкие возможности полнотекстового поиска позволяют быстрее устранять неполадки и проводить глубокий анализ данных журналов. Кроме того, активное сообщество и экосистема Elasticsearch предлагают множество плагинов, интеграций и ресурсов, которые расширяют его и без того серьезную функциональность.
По сравнению с Splunk, который может быть дорогостоящим при масштабировании, или Graylog, который предлагает более ограниченный набор интеграций, природа Fluentd и Elasticsearch с открытым исходным кодом гарантирует, что Вы сможете масштабировать свою инфраструктуру по мере необходимости без чрезмерных затрат.
В каких случаях целесообразно использовать Fluentd и Elasticsearch?
- Для централизованного ведения журналов: Если Вам нужно получить единое место для журналов нескольких приложений и сервисов, работающих на нескольких узлах Kubernetes, обратите внимание на Fluentd и Elasticsearch, которые и обеспечат Вам централизованное решение. Эта пара идеально подходит для сред, где понимание взаимодействий и зависимостей между сервисами имеет решающее значение для устранения неполадок и оптимизации работы в целом.
- В средах с большим объемом логов: Если Ваши приложения генерируют журналы в большом объеме и с высокой скоростью, Вам точно нужны Fluentd, отвечающий за сбор и предварительную обработку журналов, и высокомасштабируемый Elasticsearch. Он гарантирует, что Ваша система протоколирования справится с наплывом данных без существенных задержек в обработке и анализе журналов.
- Для анализа журналов в режиме реального времени: Когда требуется понимание производительности приложения и поведения пользователей в реальном времени, аналитические возможности Elasticsearch просто незаменимы. В таких случаях, как мониторинг пользовательских транзакций на платформах электронной коммерции, отслеживание использования API в SaaS-приложениях или оповещение в реальном времени на основе аномалий в журналах, Fluentd и Elasticsearch работают на высшем уровне.
- Проекты, чувствительные к затратам: Для проектов, где контроль затрат является приоритетом, этот стек с открытым исходным кодом предлагает финансово выгодную альтернативу коммерческим решениям по управлению журналами. Он обеспечивает гибкость, позволяющую оптимизировать развертывание с учетом стоимости без ущерба масштабируемости.
Учебное пособие: Оптимизация управления журналами в платформе электронной коммерции с помощью Fluentd и Elasticsearch
В этом сценарии описывается то, как платформа электронной коммерции, работающая на Kubernetes, может использовать Fluentd и Elasticsearch для агрегации, анализа и визуализации логов различных сервисов и подсистем для повышения наблюдаемости данных и эффективности принимаемых решений.
Наша платформа электронной коммерции состоит из нескольких микросервисов, включая аутентификацию пользователей, каталог товаров, обработку заказов и интеграцию платежных шлюзов, каждый из которых работает в отдельных подсистемах в кластере Kubernetes. Управление журналами из этих разрозненных источников представляет собой сложную задачу, особенно при диагностике проблем или понимании взаимодействия пользователей между сервисами.
Развертывание Elasticsearch для хранения журналов
1. Развертывание Elasticsearch:
Для хранения и анализа логов мы начинаем с настройки кластера Elasticsearch в пространстве имен Kubernetes. Для простоты мы выбрали одноузловую конфигурацию с возможностью масштабирования (по мере необходимости).
Сохраните в файле elasticsearch-deployment.yaml следующие данные:
apiVersion: apps/v1
kind: Deployment
metadata:
name: elasticsearch
namespace: logging
spec:
replicas: 1
selector:
matchLabels:
app: elasticsearch
template:
metadata:
labels:
app: elasticsearch
spec:
containers:
- name: elasticsearch
image: docker.elastic.co/elasticsearch/elasticsearch:7.9.3
ports:
- containerPort: 9200
name: es-http
env:
- name: discovery.type
value: single-node
Разверните все это совместно с:
kubectl apply -f elasticsearch-deployment.yaml
2. Сервис Elasticsearch:
Для того, чтобы Fluentd мог отправлять журналы, представьте Elasticsearch в качестве сервиса:
apiVersion: v1
kind: Service
metadata:
name: elasticsearch
namespace: logging
spec:
selector:
app: elasticsearch
ports:
- port: 9200
targetPort: es-http
Примените совместно с:
kubectl apply -f elasticsearch-service.yaml
Интеграция Fluentd для переадресации журналов
Настройка Fluentd:
Мы настраиваем Fluentd на отслеживание журналов контейнеров, фильтрацию ненужных шумов и структурирование данных перед их отправкой в наш сервис Elasticsearch.
Сохраните следующую запись как fluentd-configmap.yaml:
apiVersion: v1
kind: ConfigMap
metadata:
name: fluentd-config
namespace: logging
data:
fluent.conf: |
<source>
@type tail
path: /var/log/containers/*.log
pos_file: /var/log/fluentd-containers.log.pos
tag kubernetes.*
<parse>
@type json
time_format %Y-%m-%dT%H:%M:%S.%NZ
</parse>
</source>
<filter kubernetes.**>
@type kubernetes_metadata
</filter>
<match kubernetes.**>
@type elasticsearch
host elasticsearch.logging.svc.cluster.local
port 9200
logstash_format true
<buffer>
flush_interval 5s
</buffer>
</match>
Разверните Fluentd как DaemonSet:
Наличие экземпляра Fluentd на каждом узле позволяет собирать журналы непосредственно из stdout контейнера, обеспечивая охват всех служб:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fluentd
namespace: logging
spec:
selector:
matchLabels:
name: fluentd
template:
metadata:
labels:
name: fluentd
spec:
containers:
- name: fluentd
image: fluent/fluentd-kubernetes-daemonset:v1-debian-elasticsearch
env:
- name: FLUENT_ELASTICSEARCH_HOST
value: "elasticsearch.logging.svc.cluster.local"
- name: FLUENT_ELASTICSEARCH_PORT
value: "9200"
volumeMounts:
- name: config-volume
mountPath: /fluentd/etc
volumes:
- name: config-volume
configMap:
name: fluentd-config
Разверните Fluentd совместно с:
kubectl apply -f fluentd-daemonset.yaml
Анализ журналов с помощью Elasticsearch и Kibana
Настройка Kibana для анализа журналов
Поскольку журналы передаются в Elasticsearch с помощью Fluentd, Kibana служит визуальным интерфейсом, который упрощает изучение, визуализацию и анализ этих журналов. Вот как настроить Kibana для работы с Elasticsearch в среде Kubernetes:
1. Разверните Kibana:
Сначала разверните Kibana для подключения к службе Elasticsearch. Создайте файл kibana-deployment.yaml со следующей конфигурацией:
apiVersion: apps/v1
kind: Deployment
metadata:
name: kibana
namespace: logging
spec:
replicas: 1
selector:
matchLabels:
app: kibana
template:
metadata:
labels:
app: kibana
spec:
containers:
- name: kibana
image: docker.elastic.co/kibana/kibana:7.9.3
ports:
- containerPort: 5601
env:
- name: ELASTICSEARCH_URL
value: "http://elasticsearch.logging.svc.cluster.local:9200"
2. Разверните Kibana с помощью:
kubectl apply -f kibana-deployment.yaml
3. Представьте Kibana в виде службы:
Чтобы получить доступ к Kibana, откройте ее через сервис Kubernetes. Сохраните следующий файл под именем kibana-service.yaml:
apiVersion: v1
kind: Service
metadata:
name: kibana
namespace: logging
spec:
type: NodePort
selector:
app: kibana
ports:
- port: 5601
targetPort: 5601
nodePort: 30601
4. Примените это совместно с:
kubectl apply -f kibana-service.yaml
Эта конфигурация делает Kibana доступной через IP-адрес любого узла кластера по порту 30601.
Мониторинг и решение проблем
После настройки Kibana и его подключения к Elasticsearch можно приступать к созданию визуализаций и дашбордов. Вот основные шаги по эффективному использованию Kibana:
1. Создайте индексные паттерны:
Получите доступ к Kibana через http://<NodeIP>:30601.
Перейдите в раздел Management > Index Patterns и создайте новый шаблон индекса, соответствующий индексам, в которых Fluentd хранит журналы (например, logstash-*).
2. Создайте визуализацию:
Используйте Kibana > Visualize для создания различных визуализаций, таких как линейные графики, круговые диаграммы распределения ошибок или таблицы с перечнем наиболее часто встречающихся ошибок и т.д.
3. Соберите дашборд:
Объедините визуализации в дашборды с помощью Kibana > Dashboard. Например, создайте дашборд- обзор состояния системы, включая понимание использования процессора и памяти, а также показатели ошибок и активности пользователей.
4. Установите оповещения:
Функции оповещения в Kibana позволяют настраивать оповещения на основе определенных условий. Например, оповещение о том, что количество ошибок превышает определенный порог, поможет Вам оперативно предпринять все необходимые меры.
Заключение
Интеграция Fluentd с Elasticsearch обеспечивает мощное масштабируемое решение для ведения журналов в кластерах Kubernetes. Используя Fluentd для сбора и пересылки логов и Elasticsearch для хранения и анализа логов, Вы сможете получить подробное представление о своих приложениях и инфраструктуре в целом.




