Чтение логов из всех Pod’ов кластера и направление их в Loki
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: all-logs
spec:
type: KubernetesPods
destinationRefs:
- loki-storage
---
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: loki-storage
spec:
type: Loki
loki:
endpoint: http://loki.loki:3100
Чтение логов Pod’ов из указанного namespace с указанным label и перенаправление одновременно в Loki и Elasticsearch
Чтение логов Pod’ов из namespace whispers
только с label app=booking
и перенаправление одновременно в Loki и Elasticsearch:
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: whispers-booking-logs
spec:
type: KubernetesPods
kubernetesPods:
namespaceSelector:
matchNames:
- whispers
labelSelector:
matchLabels:
app: booking
destinationRefs:
- loki-storage
- es-storage
---
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: loki-storage
spec:
type: Loki
loki:
endpoint: http://loki.loki:3100
---
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: es-storage
spec:
type: Elasticsearch
elasticsearch:
endpoint: http://192.168.1.1:9200
index: logs-%F
auth:
strategy: Basic
user: elastic
password: c2VjcmV0IC1uCg==
Создание source в namespace и чтение логов всех Pod’ов в этом NS, с направлением их в Loki
Следующий pipeline создает source в namespace: test-whispers
и читает логи всех Pod’ов в этом NS, пишет их в Loki:
apiVersion: deckhouse.io/v1alpha1
kind: PodLoggingConfig
metadata:
name: whispers-logs
namespace: tests-whispers
spec:
clusterDestinationRefs:
- loki-storage
---
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: loki-storage
spec:
type: Loki
loki:
endpoint: http://loki.loki:3100
Чтение только Pod’ов в указанном namespace и имеющих определенный label
Пример чтения только Pod’ов, имеющих label app=booking
в namespace test-whispers
:
apiVersion: deckhouse.io/v1alpha1
kind: PodLoggingConfig
metadata:
name: whispers-logs
namespace: tests-whispers
spec:
labelSelector:
matchLabels:
app: booking
clusterDestinationRefs:
- loki-storage
---
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: loki-storage
spec:
type: Loki
loki:
endpoint: http://loki.loki:3100
Переход с Promtail на Log-Shipper
В ранее используемом URL Loki требуется убрать путь /loki/api/v1/push
.
Vector сам добавит этот путь при работе с Loki.
Работа с Grafana Cloud
Данная документация подразумевает, что у вас уже создан ключ API.
Для начала вам потребуется закодировать в base64 ваш токен доступа к GrafanaCloud.
echo -n "<YOUR-GRAFANACLOUD-TOKEN>" | base64 -w0
Затем создадим ClusterLogDestination
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: loki-storage
spec:
loki:
auth:
password: PFlPVVItR1JBRkFOQUNMT1VELVRPS0VOPg==
strategy: Basic
user: "<YOUR-GRAFANACLOUD-USER>"
endpoint: <YOUR-GRAFANACLOUD-URL> # Например https://logs-prod-us-central1.grafana.net или https://logs-prod-eu-west-0.grafana.net
type: Loki
Теперь можно создать PodLogginConfig или ClusterPodLoggingConfig и отправлять логи в Grafana Cloud.
Добавление Loki в Deckhouse Grafana
Вы можете работать с Loki из встроенной в Deckhouse Grafana. Достаточно добавить GrafanaAdditionalDatasource
apiVersion: deckhouse.io/v1
kind: GrafanaAdditionalDatasource
metadata:
name: loki
spec:
access: Proxy
basicAuth: false
jsonData:
maxLines: 5000
timeInterval: 30s
type: loki
url: http://loki.loki:3100
Поддержка Elasticsearch < 6.X
Для Elasticsearch < 6.0 нужно включить поддержку doc_type индексов. Сделать это можно следующим образом:
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: es-storage
spec:
type: Elasticsearch
elasticsearch:
endpoint: http://192.168.1.1:9200
docType: "myDocType" # Укажите значение здесь. Оно не должно начинаться с '_'
auth:
strategy: Basic
user: elastic
password: c2VjcmV0IC1uCg==
Шаблон индекса для Elasticsearch
Существует возможность отправлять сообщения в определенные индексы на основе метаданных с помощью шаблонов индексов:
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: es-storage
spec:
type: Elasticsearch
elasticsearch:
endpoint: http://192.168.1.1:9200
index: "k8s-{{ namespace }}-%F"
В приведенном выше примере для каждого пространства имен Kubernetes будет создан свой индекс в Elasticsearch.
Эта функция так же хорошо работает в комбинации с extraLabels
:
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: es-storage
spec:
type: Elasticsearch
elasticsearch:
endpoint: http://192.168.1.1:9200
index: "k8s-{{ service }}-{{ namespace }}-%F"
extraLabels:
service: "{{ service_name }}"
- Если сообщение имеет формат JSON, поле
service_name
этого документа JSON перемещается на уровень метаданных. - Новое поле метаданных
service
используется в шаблоне индекса.
Пример интеграции со Splunk
Существует возможность отсылать события из Deckhouse в Splunk.
- Endpoint должен быть таким же как имя вашего экземпляра Splunk с портом
8088
и без указания пути, например,https://prd-p-xxxxxx.splunkcloud.com:8088
. - Чтобы добавить token для доступа, откройте пункт меню
Setting
->Data inputs
, добавьте новыйHTTP Event Collector
и скопируйте token. - Укажите индекс Splunk для хранения логов, например,
logs
.
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: splunk
spec:
type: Splunk
splunk:
endpoint: https://prd-p-xxxxxx.splunkcloud.com:8088
token: xxxx-xxxx-xxxx
index: logs
tls:
verifyCertificate: false
verifyHostname: false
destination
не поддерживает метки Pod’а для индексирования. Рассмотрите возможность добавления нужных меток при помощи опции extraLabels
.
extraLabels:
pod_label_app: '{{ pod_labels.app }}'
Простой пример Logstash
Чтобы отправлять логи в Logstash, на стороне Logstash должен быть настроен входящий поток tcp
, и его кодек должен быть — json
.
Пример минимальной конфигурации Logstash:
input {
tcp {
port => 12345
codec => json
}
}
output {
stdout { codec => json }
}
Пример манифеста ClusterLogDestination
:
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLogDestination
metadata:
name: logstash
spec:
type: Logstash
logstash:
endpoint: logstash.default:12345
Сбор событий Kubernetes
События Kubernetes могут быть собраны log-shipper’ом, если events-exporter
включен в настройках модуля extended-monitoring.
Включите events-exporter изменив параметры модуля extended-monitoring
:
apiVersion: deckhouse.io/v1alpha1
kind: ModuleConfig
metadata:
name: extended-monitoring
spec:
version: 1
settings:
events:
exporterEnabled: true
Выложите в кластер следующий ClusterLoggingConfig
чтобы собирать сообщения с Pod’а events-exporter
:
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: kubernetes-events
spec:
type: KubernetesPods
kubernetesPods:
labelSelector:
matchLabels:
app: events-exporter
namespaceSelector:
matchNames:
- d8-monitoring
destinationRefs:
- loki-storage
Фильтрация логов
Пользователи могут фильтровать логи используя следующие фильтры:
labelFilter
— применяется к метаданным, например, имени контейнера (container
), пространству имен (namespace
), или имени Pod’а (pod_name
).logFilter
— применяется к полям самого сообщения, если оно в JSON-формате.
Сборка логов только для контейнера nginx
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: nginx-logs
spec:
type: KubernetesPods
labelFilter:
- field: container
operator: In
values: [nginx]
destinationRefs:
- loki-storage
Сборка логов без строки содержащей GET /status" 200
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: all-logs
spec:
type: KubernetesPods
destinationRefs:
- loki-storage
labelFilter:
- field: message
operator: NotRegex
values:
- .*GET /status" 200$
Аудит событий kubelet’а
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: kubelet-audit-logs
spec:
type: File
file:
include:
- /var/log/kube-audit/audit.log
logFilter:
- field: userAgent
operator: Regex
values: ["kubelet.*"]
destinationRefs:
- loki-storage
Системные логи Deckhouse
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: system-logs
spec:
type: File
file:
include:
- /var/log/syslog
labelFilter:
- field: message
operator: Regex
values:
- .*d8-kubelet-forker.*
- .*containerd.*
- .*bashible.*
- .*kernel.*
destinationRefs:
- loki-storage
Если вам нужны только логи одного Pod’а или малой группы Pod’ов, постарайтесь использовать настройки kubernetesPods
, чтобы сузить количество читаемых файлов. Фильтры необходимы только для высокогранулярной настройки.
Настройка сборки логов с продуктовых namespace’ов используя опцию namespace label selector
apiVersion: deckhouse.io/v1alpha1
kind: ClusterLoggingConfig
metadata:
name: production-logs
spec:
type: KubernetesPods
kubernetesPods:
namespaceSelector:
labelSelector:
matchNames:
environment: production
destinationRefs:
- loki-storage
Исключить Pod’ы и namespace’ы используя label
Существует преднастроенный label для исключения определенных Pod’ов и namespace’ов: log-shipper.deckhouse.io/exclude=true
.
Он помогает остановить сбор логов с Pod’ов и namespace’ов без изменения глобальной конфигурации.
---
apiVersion: v1
kind: Namespace
metadata:
name: test-namespace
labels:
log-shipper.deckhouse.io/exclude: "true"
---
apiVersion: apps/v1
kind: Deployment
metadata:
name: test-deployment
spec:
...
template:
metadata:
labels:
log-shipper.deckhouse.io/exclude: "true"