Featured image of post Сбор логов с кластера Kubernetes

Сбор логов с кластера Kubernetes

Развертывание приложений (Fluent-bit, Logstash) для сбора логов из Кубернетес

Требования

Развернутый K8S, Minikube или K3S

Цель №1: Забирать логи с сервисов находящихся в Kubernetes и отправлять их в Kafka
Цель №2: Доставать логи из Kafka и отправлять их в Opensearch (ElasticSearch)

***В моём случае авторизация в Кафке по клиентским сертификатам (Выпущенные ЦА или самоподписанные). Если вы не хотите использовать серты, то перед развертыванием просто удаляем:

  • Все Secrets с сертификатами Kafka
  • rdkafka.ssl.* и security.protocol ssl из Fluent Bit
  • ssl_store_ из Logstash input
  • Используйте PLAINTEXT или SASL_PLAINTEXT в файле configmap-for-kafka.yaml

Подробно расписал схему построения в своём Telegram
Там же отвечаю на вопросы и обновляю инструкции при необходимости.
Присоединяйся Telegram

Развертывание Fluent-bit

Заходим на master-ноду. Клонируем репозиторий с Fluent-bit:

1
git clone https://github.com/ZM56/fluent-bit.git

Создаём namespace:

1
kubectl create ns logging

Далее переходим в директорию и деплоим:

1
cd fluent-bit

Меняем конфиг под себя, со своим адресом Kafka:

1
nano configmap-for-kafka.yaml

Для авторизации по клиентскому сертификату понадобится его преобразовать в base64:

1
base64 -w0 cert.crt

Тоже самое с ключом:

1
base64 -w0 mykey.key

Полученные строки вставляем в secret.yaml

1
nano secret-certs.yaml

Если меняете имена сертификатов не забудьте их переименовать в daemonset.yaml и в configmap-for-kafka.yaml
Если нет просто добавляете свои строки вместо …abc…

1
2
client.crt: ...abc..
client.key: ...abc..

Также потребуется root-ca сертификат от вашего ЦА.
Вставляем содержимое сюда:

1
nano fluent-bit-ca-cert.yaml

Запускаем

1
kubectl apply -f .

Проверяем, что поды Fluent-bit поднялись:

1
kubectl get pod -n logging

В логах пода смотрим, что соединение с кафкой прошло успешно. Если нет, то дебажим исходя из ошибок.

Если настроена вебка ищем новый топик:

Команда вывода логов:

1
kubectl logs po -n logging POD_NAME

Развертывание Logstash

Далее разворачиваем в этом же кластере кубера Logstash.
Для этого клонируем репозиторий:

1
git clone https://github.com/ZM56/logstash.git

Далее переходим в директорию:

1
cd logstash

Меняем конфиг под себя, со своим адресом Kafka откуда будем забирать логи:

1
nano configmap.yaml

Изменить server на свой адрес Кафки

1
2
      kafka {
        bootstrap_servers => "server:9092"

И свой адрес Opensearch куда будем складывать

1
2
3
4
5
6
7
8
    output {
      opensearch {
        hosts => ["https://opensearch:9200"]
        index => "k8s-logs-%{+YYYY.MM.dd}"
        user => "admin"
        password => "password"
        ssl => true
        ssl_certificate_verification => false

Авторизация в Opensearch простая - по логину и паролю.

Здесь для авторизации с сертификатами мы поступим другим путем.
Упакуем их через java утилиту keytools (Требует установки java-jdk) и прокинем через созданные секреты.

Создаём хранилище сертификатов для подключения к Кафке:

1
2
openssl pkcs12 -export -in client.crt -inkey client.key -out cert.p12 -caname client -passout pass:mypassword
keytool -importcert -alias CARoot -file ./root-ca.crt -keystore server.jks -storepass password

Пользовательский серт и ключ, также серт ЦА.
Создаём секреты на основе этого хранилища:

1
kubectl create secret generic kafka-client-cert --from-file=cert.p12 --from-file=server.jks -n logging

Запускаем

1
kubectl apply -f .

Проверяем, что под Logstash поднялся:

1
kubectl get pod -n logging

В логах пода смотрим, что соединение с кафкой прошло успешно. Если нет, то дебажим исходя из ошибок.

Команда вывода логов:

1
kubectl logs po -n logging POD_NAME

Если всё успешно заходим в Opensearch и добавляем новый шаблон индекса

После чего можем наблюдать за логами в удобном интерфейсе.

Информацию можно использовать в свободном доступе, с указанием ссылки на сайт
Telegram GitHub YouTube