В этой статье мы узнаем о метриках и журналах Kubernetes с помощью Prometheus, Filebeat и Grafana Loki | об интеграции Prometheus, Filebeat и Logstash с Grafana Loki для журналов и метрик Kubernetes.
В этом руководстве мы расскажем вам о том, как интегрировать эти мощные инструменты для создания комплексного решения по наблюдению за Kubernetes. К концу статьи у вас будет установка, которая не только отслеживает метрики с помощью Prometheus, но и обрабатывает и визуализирует журналы с помощью Filebeat, Logstash и Grafana Loki, предоставляя вам четкое представление о здоровье и производительности вашего кластера.
Предварительные условия
- Учетная запись AWS с Ubuntu 24.04 LTS Экземпляр EC2.
 - Minikube и kubectl, Helm установлен
 - Базовые знания о Kubernetes
 
Шаг #1:Настройка инстанса Ubuntu EC2
Обновите список пакетов.
sudo apt update

Устанавливает такие необходимые инструменты, как curl, wget и apt-transport-https.
sudo apt install curl wget apt-transport-https -y

Устанавливает Docker, контейнерную среду выполнения, которая будет использоваться в качестве драйвера ВМ для Minikube.
sudo apt install docker.io -y

Добавьте текущего пользователя в группу Docker, что позволит ему выполнять команды Docker без sudo.
sudo usermod -aG docker $USER

Настройте разрешения для сокета Docker, чтобы упростить взаимодействие с демоном Docker.
sudo chmod 666 /var/run/docker.sock

Проверяет, поддерживает ли система виртуализацию.
egrep -q 'vmx|svm' /proc/cpuinfo && echo yes || echo no

Установите KVM и сопутствующие инструменты.
sudo apt install qemu-kvm libvirt-clients libvirt-daemon-system bridge-utils virtinst libvirt-daemon

Добавление пользователя в группы виртуализации.
sudo adduser $USER libvirt
sudo adduser $USER libvirt-qemu

Reload Group.
newgrp libvirt
newgrp libvirt-qemu

Шаг № 2:Установите Minikube и kubectl
Загрузите последнюю версию бинарного файла Minikube.
curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64

Установите его на /usr/local/bin, сделав его доступным для всей системы.
sudo install minikube-linux-amd64 /usr/local/bin/minikube

Используйте версия minikube команда для подтверждения установки.
minikube version

Загрузите последнюю версию kubectl (Kubernetes CLI).
curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

Сделайте двоичный файл kubectl исполняемым.
chmod +x ./kubectl

переместить в /usr/local/bin
sudo mv kubectl /usr/local/bin/

Используйте версия kubectl команда для проверки установки.
kubectl version --client --output=yaml

Шаг №3:Запуск Minikube
Запустите Minikube с Docker в качестве драйвера.
minikube start --vm-driver docker

Чтобы проверить состояние Minikube, выполните следующую команду.
minikube status

Шаг #4:Установите Helm
Загрузите helm, менеджер пакетов для Kubernetes.
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/main/scripts/get-helm-3

Измените его разрешения.
chmod 700 get_helm.sh

Установите шлем.
./get_helm.sh

Проверьте его версию, чтобы подтвердить установку.
helm version

Шаг #5:Настройка конфигурации диаграммы Helm
Добавьте репозиторий Grafana Helm Chart Repository.
helm repo add grafana https://grafana.github.io/helm-charts

обновите репозитории Helm, чтобы получить последние графики.
helm repo update

Поиск стека Loki.
helm search repo loki

Вы должны увидеть несколько репозиториев, но мы будем использовать grafana/loki-stack репозиторий для развертывания Grafana, Prometheus, Filebeat, Logstash и настроить Loki.
Просмотрите значения по умолчанию для стека Loki и загрузите их в yaml-файл. Мы создадим пользовательский файл конфигурации с именем loki-custom-values.yaml. Этот файл позволяет Filebeat для сбора журналов, Logstash для расширенной обработки журналов, и Prometheus для метрик.
helm show values grafana/loki-stack > loki-custom-values.yaml

Откройте и отредактируйте файл пользовательских значений, как показано ниже.
nano loki-custom-values.yaml

Измените его, как показано ниже.
test_pod:
  enabled: true
  image: bats/bats:1.8.2
  pullPolicy: IfNotPresent
loki:
  enabled: true
  isDefault: true
  url: http://{{(include "loki.serviceName" .)}}:{{ .Values.loki.service.port }}
  readinessProbe:
    httpGet:
      path: /ready
      port: http-metrics
    initialDelaySeconds: 45
  livenessProbe:
    httpGet:
      path: /ready
      port: http-metrics
    initialDelaySeconds: 45
  datasource:
    jsonData: "{}"
    uid: ""
promtail:
  enabled: false
  config:
    logLevel: info
    serverPort: 3101
    clients:
      - url: http://{{ .Release.Name }}:3100/loki/api/v1/push
fluent-bit:
  enabled: false
grafana:
  enabled: true
  sidecar:
    datasources:
      label: ""
      labelValue: ""
      enabled: true
      maxLines: 1000
  image:
    tag: 10.3.3
  service:
    type: NodePort
prometheus:
  enabled: true
  isDefault: false
  url: http://{{ include "prometheus.fullname" .}}:{{ .Values.prometheus.server.service.servicePort }}{{ .Values.prometheus.server.prefixURL }}
  datasource:
    jsonData: "{}"
  server:
    service:
      type: NodePort
    persistentVolume:
      ## If true, Prometheus server will create/use a Persistent Volume Claim
      ## If false, use emptyDir
      ##
      enabled: false
filebeat:
  enabled: true
  filebeatConfig:
    filebeat.yml: |
      # logging.level: debug
      filebeat.inputs:
      - type: container
        paths:
          - /var/log/containers/*.log
        processors:
        - add_kubernetes_metadata:
            host: ${NODE_NAME}
            matchers:
            - logs_path:
                logs_path: "/var/log/containers/"
      output.logstash:
        hosts: ["logstash-loki-headless:5044"]
logstash:
  enabled: true
  image: grafana/logstash-output-loki
  imageTag: 1.0.1
  fullnameOverride: logstash-loki
  logstashConfig:
    logstash.yml: |
      http.host: 0.0.0.0
      xpack.monitoring.enabled: false
  logstashPipeline:
    logstash.conf: |
      input {
        beats {
          port => 5044
        }
      }
  filters:
    main: |-
      filter {
        if [kubernetes] {
          mutate {
            add_field => {
              "container_name" => "%{[kubernetes][container][name]}"
              "namespace" => "%{[kubernetes][namespace]}"
              "pod" => "%{[kubernetes][pod][name]}"
            }
            replace => { "host" => "%{[kubernetes][node][name]}"}
          }
        }
        mutate {
          remove_field => ["tags"]
        }
      }
  outputs:
    main: |-
      output {
        loki {
          url => "http://loki:3100/loki/api/v1/push"
          #username => "test"
          #password => "test"
        }
        # stdout { codec => rubydebug }
      }
# proxy is currently only used by loki test pod
# Note: If http_proxy/https_proxy are set, then no_proxy should include the
# loki service name, so that tests are able to communicate with the loki
# service.
proxy:
  http_proxy: ""
  https_proxy: ""
  no_proxy: ""



Этот файл настраивает:
- Filebeat для сбора журналов из подсистем Kubernetes.
 - Logstash для обработки журналов и передачи их в Loki.
 - Prometheus для сбора метрик.
 - Grafana для визуализации логов и метрик.
 
Используйте следующую команду Helm для развертывания стека. Она развертывает его в grafana-loki пространство имен
helm upgrade --install --values loki-custom-values.yaml loki grafana/loki-stack -n grafana-loki --create-namespace

Эта команда развертывает Loki, Prometheus, Filebeat, Logstash, Grafana и настраивает сервисы в соответствии с пользовательским конфигурационным файлом.
Шаг #6:Доступ к журналам Kubernetes в Grafana
Сначала проверьте поды в grafana-loki , чтобы узнать, все ли запущено или нет.
kubectl get pods -n grafana-loki

Вы должны увидеть поды для Loki, Grafana, Filebeat, Logstash и Prometheus.
Перечислите сервисы для получения сведений о NodePort.
kubectl get services -n grafana-loki

Переадресуйте loki-grafana на порт 3000.
kubectl port-forward -n grafana-loki --address 0.0.0.0 svc/loki-grafana 3000:80

Посетите http://<Public-IP-address>:3100 в веб-браузере.

Получите учетные данные администратора Grafana с помощью следующих команд.
kubectl get secret --namespace grafana-loki loki-grafana -o jsonpath="{.data.admin-user}" | base64 --decode; echo

admin — это наше имя пользователя.
kubectl get secret --namespace grafana-loki loki-grafana -o jsonpath="{.data.admin-password}" | base64 --decode; echo


Перейти к Соединения > Источники данных, где можно подтвердить, что Loki был настроен.


Перейти к Просмотреть , нажав кнопку Explore.

Выберите метку (например, namespace) и значение (например, grafana-loki). Выбор в опциях Мгновенно как тип и предел линии 1000. Нажмите на синюю кнопку Выполнить запрос Кнопка в правом верхнем углу для просмотра журналов.

Вы можете увидеть журналы Kubernetes, как показано ниже.

Filebeat собирает журналы из подсистем Kubernetes и направляет их в Logstash. Logstash обрабатывает журналы, полученные от Filebeat, и направляет их в Grafana Loki.
Шаг #7:Визуализация метрик в Grafana
Вы также можете импортировать приборные панели из библиотеки Grafana.
Получите доступ к библиотеке Grafana. Поиск Grafana Labs в веб-браузере.

Выберите нужную приборную панель, например kube-state-metrics-v2.
Поиск kube-state-metrics-v2.


Скопируйте его идентификатор.

В Grafana перейдите на страницу Приборные панели > Новые > Импорт.

Введите идентификатор приборной панели (11455) и нажмите Загрузить.

Нажмите Импорт чтобы добавить приборную панель…

После загрузки приборная панель будет отображать метрики Kubernetes.

Заключение:
В заключение хочу сказать, что сегодня мы узнали об интеграции Prometheus, Filebeat и Logstash с Grafana Loki для журналов и метрик Kubernetes. Благодаря интеграции Prometheus, Filebeat, Logstash и Grafana Loki у вас теперь есть надежная система для мониторинга Kubernetes. Prometheus эффективно собирает метрики, Filebeat и Logstash упрощают обработку журналов, а Grafana Loki сохраняет и визуализирует их. Вместе эти инструменты обеспечивают целостное представление о вашем кластере, позволяя эффективно обнаруживать, устранять и решать проблемы.
Объединяя журналы и метрики в Grafana, вы можете коррелировать данные, чтобы раскрыть суть, которая поможет повысить надежность и производительность приложений. Это решение не только упрощает мониторинг, но и предоставляет инструменты, необходимые для уверенного управления Kubernetes в масштабе.