
В этой статье мы узнаем о метриках и журналах 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 в масштабе.