Вопрос или проблема
Я развернул сервис Loki и использую эту команду для проверки развертывания сервиса:
curl -H "Content-Type: application/json" \
-s -X POST "http://139.14.166.24:3100/loki/api/v1/push" \
--data-raw '{"streams": [{ "stream": { "foo": "bar2" }, "values": [ [ "1732889861000000000", "fizzbuzz" ] ] }]}'
Это тестовое сообщение логирования успешно записано в Loki, и я могу запрашивать этот лог из интерфейса Grafana. Затем я развернул promtail в кластер Kubernetes как DaemonSet вот так:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: promtail-daemonset
namespace: default
uid: a7801cf9-3f88-4c36-b6a7-0f523db14476
resourceVersion: '23958317'
generation: 9
creationTimestamp: '2024-11-26T13:11:46Z'
labels:
k8slens-edit-resource-version: v1
status:
currentNumberScheduled: 1
numberMisscheduled: 0
desiredNumberScheduled: 1
numberReady: 1
observedGeneration: 9
updatedNumberScheduled: 1
numberAvailable: 1
spec:
selector:
matchLabels:
name: promtail
template:
metadata:
creationTimestamp: null
labels:
name: promtail
annotations:
kubectl.kubernetes.io/restartedAt: '2024-11-30T02:54:09Z'
spec:
volumes:
- name: logs
hostPath:
path: /var/log
type: ''
- name: varlibdockercontainers
hostPath:
path: /var/lib/docker/containers
type: ''
- name: promtail-config
configMap:
name: promtail-config
defaultMode: 420
containers:
- name: promtail-container
image: registry.cn-qingdao.aliyuncs.com/reddwarf-public/promtail:3.2.0
args:
- '-config.file=/etc/promtail/promtail.yaml'
env:
- name: iZm5e2jhfbrshckqh6qdbuZ
valueFrom:
fieldRef:
apiVersion: v1
fieldPath: spec.nodeName
resources: {}
volumeMounts:
- name: logs
mountPath: /var/log
- name: promtail-config
mountPath: /etc/promtail
- name: varlibdockercontainers
readOnly: true
mountPath: /var/lib/docker/containers
terminationMessagePath: /dev/termination-log
terminationMessagePolicy: File
imagePullPolicy: Always
restartPolicy: Always
terminationGracePeriodSeconds: 30
dnsPolicy: ClusterFirst
serviceAccountName: promtail-serviceaccount
serviceAccount: promtail-serviceaccount
securityContext: {}
schedulerName: default-scheduler
updateStrategy:
type: RollingUpdate
rollingUpdate:
maxUnavailable: 1
maxSurge: 0
revisionHistoryLimit: 10
Конфигурационная карта promtail promtail:3.2.0
выглядит так:
server:
http_listen_port: 9080
grpc_listen_port: 0
clients:
- url: http://139.14.166.24:3100/loki/api/v1/push
positions:
filename: /tmp/positions.yaml
scrape_configs:
- job_name: kubernetes-pods
kubernetes_sd_configs:
- role: pod
pipeline_stages:
- json:
expressions:
level: level
msg: message
time: time
relabel_configs:
- source_labels: [__meta_kubernetes_pod_label_app]
target_label: app
- source_labels: [__meta_kubernetes_namespace]
target_label: namespace
- source_labels: [__meta_kubernetes_pod_name]
target_label: pod_name
Но я не вижу никаких логов в интерфейсе Grafana, promtail не показывает никаких ошибок. Я что-то пропустил? Я также пытался добавить метку аннотации в развертывание Kubernetes вот так:
spec:
replicas: 1
selector:
matchLabels:
app: texhub-server-service
template:
metadata:
creationTimestamp: null
labels:
app: texhub-server-service
annotations:
promtail.io/scrape: "true"
kubectl.kubernetes.io/restartedAt: '2024-11-06T20:40:11+08:00'
spec:
По-прежнему не нашел никаких логов, почему promtail не отправляет логи? Вот вывод журнала pod promtail:
level=info ts=2024-11-30T02:54:12.166837213Z caller=promtail.go:133 msg="Перезагрузка конфигурационного файла" md5sum=005fc05e10167b7cd219ce7e04437ced
level=info ts=2024-11-30T02:54:12.167927624Z caller=kubernetes.go:331 component=discovery discovery=kubernetes config=kubernetes-pods msg="Использование учетной записи сервиса pod через конфигурацию в кластере"
level=info ts=2024-11-30T02:54:12.170280481Z caller=server.go:351 msg="сервер слушает по адресам" http=[::]:9080 grpc=[::]:33481
level=info ts=2024-11-30T02:54:12.171272194Z caller=main.go:173 msg="Запуск Promtail" version="(version=k218-659f542, branch=k218, revision=659f5421)"
level=warn ts=2024-11-30T02:54:12.171339922Z caller=promtail.go:263 msg="включить watchConfig"
Вот название хоста:
[root@iZm5e2jhfbrshckqh6qdbuZ ~]# hostname
iZm5e2jhfbrshckqh6qdbuZ
Я также пытался запустить тестовую команду в pod Kubernetes с использованием curl, и лог успешно отправился на сервис Loki.
Ответ или решение
Проблема с отправкой логов Promtail в Loki: диагностика и решение
Работа с системами мониторинга и логирования, такими как Promtail и Loki, может иногда представлять сложности. В вашем случае Promtail в Kubernetes не отправляет логи в Loki, несмотря на успешную проверку. Давайте рассмотрим возможные причины и пути решения этой проблемы.
1. Проверка конфигурации Promtail
Конфигурационный файл Promtail играет ключевую роль в процессе сбора и отправки логов. Рекомендуется обратить внимание на следующие моменты:
-
Scrape Configuration: Убедитесь, что ваши настройки
scrape_configs
корректны и Promtail имеет доступ к подам, которые вы хотите мониторить. Обратите внимание на разделkubernetes_sd_configs
:scrape_configs: - job_name: kubernetes-pods kubernetes_sd_configs: - role: pod
Убедитесь, что в вашем кластере Kubernetes поды имеют соответствующие метки и аннотации, позволяющие Promtail их обнаружить.
-
Pipeline Stages: Проверьте, правильно ли настроены этапы конвейера (pipeline stages). Неправильная конфигурация может привести к тому, что логи не будут правильно парситься и отправляться в Loki.
2. Правильные метки и аннотации
Убедитесь, что ваши поды или деплойменты содержат правильные аннотации для активации сбора логов Promtail. Например, вы добавили аннотации в вашу манифестацию:
annotations:
promtail.io/scrape: "true"
Это отличный шаг, но также проверьте, что у всех ваших целевых подов есть соответствующая метка.
3. Логи Promtail
Согласно приведенным вами логам Promtail:
level=info ts=2024-11-30T02:54:12.171272194Z caller=main.go:173 msg="Starting Promtail" version="(version=k218-659f542, branch=k218, revision=659f5421)"
Promtail стартует без ошибок. Для более глубокого анализа попробуйте увеличить уровень логгирования, добавив параметр -log.level=debug
в вашу команду запуска, чтобы получить больше информации при выполнении.
4. Использование Curl для тестирования
Вы можете использовать curl
внутри контейнеров, и это показывает, что ваш Loki работает. Это означает, что проблема может общаться с сервисом Loki, но, возможно, в самой конфигурации Promtail есть неправильный путь к логам или отсутствуют права доступа.
5. Проверка прав доступа
Проверьте, какие права доступа имеет ваш serviceAccount
, используемый Promtail (в вашем случае promtail-serviceaccount
). Он должен иметь права на чтение логов подов и доступ к необходимым ресурсам в Kubernetes, включая поды и пространства имен.
Вы можете добавить необходимые роли и права в манифесте ClusterRole
и ClusterRoleBinding
.
6. Мониторинг и отладка
-
Проверка текущего состояния DaemonSet: Убедитесь, что ваш DaemonSet работает на всех узлах:
kubectl get daemonsets -n default promtail-daemonset
-
Проверка логов пода Promtail: Вы уже сделали, но стоит расширить наблюдение, обратив внимание на различные временные промежутки.
Заключение
Следуя вышеуказанным шагам, вы сможете диагностировать и решить проблему с отправкой логов от Promtail в Loki. Особенно важно проверить конфигурацию и права доступа, поскольку именно они часто становятся источником неполадок. Убедитесь, что все метки и аннотации правильно установлены, и если проблема сохраняется, не стесняйтесь подробнее исследовать логи и настройки Promtail. Эта структура подхода поможет вам наладить корректный сбор логов и их визуализацию в Grafana.