Compare languages | Модуль log-shipper: примеры

Чтение логов из всех Pod’ов кластера и направление их в Loki

Getting logs from all cluster Pods and sending them to Loki

yaml 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

yaml 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

Reading Pod logs from a specified namespace with a specified label and redirecting to Loki and Elasticsearch

Чтение логов Pod’ов из namespace whispers только с label app=booking и перенаправление одновременно в Loki и Elasticsearch:

Reading logs from namespace=whispers with label app=booking and storing them into Loki and Elasticsearch:

yaml 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==

yaml 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

Creating a source in namespace and reading logs of all Pods in that NS with forwarding them to Loki

Следующий pipeline создает source в namespace: test-whispers и читает логи всех Pod’ов в этом NS, пишет их в Loki:

Namespaced pipeline - reading logs from test-whispers namespace (all Pods):

yaml 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

yaml 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

Reading only Pods in the specified namespace and having a certain label

Пример чтения только Pod’ов, имеющих label app=booking в namespace test-whispers:

Read logs from Pods with label app=booking in namespace test-whispers:

yaml 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

yaml 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

Migration from Promtail to Log-Shipper

В ранее используемом URL Loki требуется убрать путь /loki/api/v1/push.

Path /loki/api/v1/push has to be removed from the previously used Loki URL.

Vector сам добавит этот путь при работе с Loki.

Vector will add this PATH automatically during working with Loki destination.

Работа с Grafana Cloud

Working with Grafana Cloud

Данная документация подразумевает, что у вас уже создан ключ API.

This documentation expects that you have created API key.

Для начала вам потребуется закодировать в base64 ваш токен доступа к GrafanaCloud.

Grafana cloud API key

Grafana cloud API key

Firstly you should encode your token with base64.

bash echo -n “" | base64 -w0

bash echo -n “" | base64 -w0

Затем создадим ClusterLogDestination

Then you can create ClusterLogDestination

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLogDestination metadata: name: loki-storage spec: loki: auth: password: PFlPVVItR1JBRkFOQUNMT1VELVRPS0VOPg== strategy: Basic user: “" endpoint: # Например https://logs-prod-us-central1.grafana.net или https://logs-prod-eu-west-0.grafana.net type: Loki

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLogDestination metadata: name: loki-storage spec: loki: auth: password: PFlPVVItR1JBRkFOQUNMT1VELVRPS0VOPg== strategy: Basic user: “" endpoint: # For example https://logs-prod-us-central1.grafana.net or https://logs-prod-eu-west-0.grafana.net type: Loki

Теперь можно создать PodLogginConfig или ClusterPodLoggingConfig и отправлять логи в Grafana Cloud.

Now you can create PodLogginConfig or ClusterPodLoggingConfig and send logs to Grafana Cloud.

Добавление Loki в Deckhouse Grafana

Adding Loki source to Deckhouse Grafana

Вы можете работать с Loki из встроенной в Deckhouse Grafana. Достаточно добавить GrafanaAdditionalDatasource

You can work with Loki from embedded to deckhouse Grafana. Just add GrafanaAdditionalDatasource

yaml 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

yaml 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.X usage

Для Elasticsearch < 6.0 нужно включить поддержку doc_type индексов. Сделать это можно следующим образом:

For Elasticsearch < 6.0 doc_type indexing should be set. Config should look like this:

yaml 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==

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLogDestination metadata: name: es-storage spec: type: Elasticsearch elasticsearch: endpoint: http://192.168.1.1:9200 docType: “myDocType” # Set any string here. It should not start with ‘_’ auth: strategy: Basic user: elastic password: c2VjcmV0IC1uCg==

Шаблон индекса для Elasticsearch

Index template for Elasticsearch

Существует возможность отправлять сообщения в определенные индексы на основе метаданных с помощью шаблонов индексов:

It is possible to route logs to particular indexes based on metadata using index templating:

yaml 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”

yaml 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.

For the above example for each Kubernetes namespace a dedicated index in Elasticsearch will be created.

Эта функция так же хорошо работает в комбинации с extraLabels:

This feature works well combining with extraLabels:

yaml 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 }}”

yaml 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 }}”

  1. Если сообщение имеет формат JSON, поле service_name этого документа JSON перемещается на уровень метаданных.
  2. Новое поле метаданных service используется в шаблоне индекса.
  1. If a log message is in JSON format, the service_name field of this JSON document is moved to the metadata level.
  2. The new metadata field service is used for the index template.

Пример интеграции со Splunk

Splunk integration

Существует возможность отсылать события из Deckhouse в Splunk.

It is possible to send logs from Deckhouse to Splunk.

  1. Endpoint должен быть таким же как имя вашего экземпляра Splunk с портом 8088 и без указания пути, например, https://prd-p-xxxxxx.splunkcloud.com:8088.
  2. Чтобы добавить token для доступа, откройте пункт меню Setting -> Data inputs, добавьте новый HTTP Event Collector и скопируйте token.
  3. Укажите индекс Splunk для хранения логов, например, logs.
  1. Endpoint must be equal to the Splunk instance name with the 8088 port and no path provided, e.g. https://prd-p-xxxxxx.splunkcloud.com:8088.
  2. To add a token to ingest logs, go to Setting -> Data inputs, add a new HTTP Event Collector and copy a token.
  3. Provide a Splunk index to store logs, e.g., logs.

yaml 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

yaml 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

Note! destination не поддерживает метки Pod’а для индексирования. Рассмотрите возможность добавления нужных меток при помощи опции extraLabels.

Note! Splunk destination doesn’t support pod labels for indexes. Consider exporting necessary labels with the extraLabels option.

yaml extraLabels: pod_label_app: ‘{{ pod_labels.app }}’

yaml extraLabels: pod_label_app: ‘{{ pod_labels.app }}’

Простой пример Logstash

Simple Logstash example

Чтобы отправлять логи в Logstash, на стороне Logstash должен быть настроен входящий поток tcp, и его кодек должен быть — json.

To send logs to Logstash, the tcp input should be configured on the Logstash instance side, and its codec should be set to json.

Пример минимальной конфигурации Logstash:

An example of the minimal Logstash configuration:

hcl input { tcp { port => 12345 codec => json } } output { stdout { codec => json } }

hcl input { tcp { port => 12345 codec => json } } output { stdout { codec => json } }

Пример манифеста ClusterLogDestination:

An example of the ClusterLogDestination manifest:

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLogDestination metadata: name: logstash spec: type: Logstash logstash: endpoint: logstash.default:12345

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLogDestination metadata: name: logstash spec: type: Logstash logstash: endpoint: logstash.default:12345

Сбор событий Kubernetes

Collect Kubernetes Events

События Kubernetes могут быть собраны log-shipper’ом, если events-exporter включен в настройках модуля extended-monitoring.

Kubernetes Events can be collected by log-shipper if events-exporter is enabled in the extended-monitoring module configuration.

Включите events-exporter изменив параметры модуля extended-monitoring:

Enable events-exporter by adjusting extended-monitoring settings:

yaml apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: extended-monitoring spec: version: 1 settings: events: exporterEnabled: true

yaml apiVersion: deckhouse.io/v1alpha1 kind: ModuleConfig metadata: name: extended-monitoring spec: version: 1 settings: events: exporterEnabled: true

Выложите в кластер следующий ClusterLoggingConfig чтобы собирать сообщения с Pod’а events-exporter:

Apply the following ClusterLoggingConfig to collect logs from the events-exporter Pod:

yaml 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

yaml 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

Фильтрация логов

Log filters

Пользователи могут фильтровать логи используя следующие фильтры:

  • labelFilter — применяется к метаданным, например, имени контейнера (container), пространству имен (namespace), или имени Pod’а (pod_name).
  • logFilter — применяется к полям самого сообщения, если оно в JSON-формате.

Users can filter logs by applying two filters:

  • labelFilter — applies to the top-level metadata, e.g., container, namespace, or Pod name.
  • logFilter — applies to fields of a message if it is in JSON format.

Сборка логов только для контейнера nginx

Collect only logs of the nginx container

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLoggingConfig metadata: name: nginx-logs spec: type: KubernetesPods labelFilter:

  • field: container operator: In values: [nginx] destinationRefs:
  • loki-storage

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLoggingConfig metadata: name: nginx-logs spec: type: KubernetesPods labelFilter:

  • field: container operator: In values: [nginx] destinationRefs:
  • loki-storage

Аудит событий kubelet’а

Audit of kubelet actions

yaml 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

yaml 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

Deckhouse system logs

yaml 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

yaml 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

Note! Если вам нужны только логи одного или малой группы Pod’ов, постарайтесь использовать настройки kubernetesPods, чтобы сузить количество читаемых файлов. Фильтры необходимы только для высокогранулярной настройки.

Note! If you need logs from only one or from a small group of a Pods, try to use the kubernetesPods settings to reduce the number of reading filed. Do not use highly grained filters to read logs from a single pod.

Настройка сборки логов с продуктовых namespace’ов используя опцию namespace label selector

Collect logs from production namespaces using the namespace label selector option

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLoggingConfig metadata: name: production-logs spec: type: KubernetesPods kubernetesPods: namespaceSelector: labelSelector: matchNames: environment: production destinationRefs:

  • loki-storage

yaml apiVersion: deckhouse.io/v1alpha1 kind: ClusterLoggingConfig metadata: name: production-logs spec: type: KubernetesPods kubernetesPods: namespaceSelector: labelSelector: matchLabels: environment: production destinationRefs:

  • loki-storage

Исключить Pod’ы и namespace’ы используя label

Exclude Pods or namespaces with a label

Существует преднастроенный label для исключения определенных Pod’ов и namespace’ов: log-shipper.deckhouse.io/exclude=true. Он помогает остановить сбор логов с Pod’ов и namespace’ов без изменения глобальной конфигурации.

There is a preconfigured label to exclude particular namespaces or Pods: log-shipper.deckhouse.io/exclude=true. It can help to stop collecting logs from a namespace or Pod without changing global configurations.

yaml

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”

yaml

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”