Решение для журналов Kubernetes Grafana Loki «Случай развертывания Helm»
Решение для журналов Kubernetes Grafana Loki «Случай развертывания Helm»

Loki — это легко масштабируемая по горизонтали и высокодоступная система агрегирования журналов.

По сравнению с другими системами агрегирования журналов Loki имеет следующие преимущества:

  • Вместо полнотекстового индексирования журналов Loki проще в эксплуатации и дешевле в эксплуатации, поскольку он хранит сжатые, неструктурированные журналы и индексирует только метаданные.
  • Потоки журналов индексируются и группируются с использованием тех же тегов, что и Prometheus.
  • Благодаря идеальной интеграции с Kubernetes метаданные, такие как сохраненные журналы подов и метки подов, будут автоматически захватываться и индексироваться.

Экологическая подготовка

  • Kubernetes 1.22+
  • Helm 3.3+
  • S3 хранилище объектов Ведро, ключ доступа и авторизация

мы используем Grafana Официально предоставлено Helm Charts Развертывание набора Loki Система журналирования, включающая следующие компоненты:

  • Серверная служба Loki для микросервисной архитектуры
  • Клиент сбора журналов Promtail
  • Инструмент визуального интерфейса Grafana

хранилище объектов

совместимый AWS S3 API изхранилище объекты могут быть,Например:

  • AWS S3
  • Tencent Cloud COS
  • Alibaba Cloud OSS
  • MinIO

Между Loki и хранилищем требуется большая пропускная способность, а развертывание между облаками и регионами не рекомендуется.

Требуется ключ доступа со следующими разрешениями:

  • ListBucket
  • PutObject
  • GetObject
  • DeleteObject

Политики авторизации на разных облачных платформах различаются. Если у вас недостаточно разрешений, измените их на полные разрешения на чтение и запись для всего сегмента.

Получите репозиторий Helm

Язык кода:shell
копировать
## добавить в Ускоренное хранилище изображений
helm repo add grafana "https://helm-charts.itboon.top/grafana" --force-update
helm repo update grafana

## Добавить официальный склад
# helm repo add grafana "https://grafana.github.io/helm-charts" --force-update
# helm repo update grafana

Ускоренное хранилище изображений Полностью клонировано с официального сайта.

Развертывание рулевого управления

Loki Values

Язык кода:yaml
копировать
## values-loki.yaml


fullnameOverride: loki

rbac:
  namespaced: true

loki:
  auth_enabled: false
  image:
    # registry: docker.io
    # repository: grafana/loki
    tag: 2.9.6

  readinessProbe:
    initialDelaySeconds: 10
    periodSeconds: 5
    timeoutSeconds: 1

  ## loki.config
  commonConfig:
    ## set to 1, otherwise more replicas are needed to connect to grafana
    replication_factor: 1
  storage:
    bucketNames:
      chunks: Your_Loki_Bucket
      ruler: Your_Loki_Bucket
      admin: Your_Loki_Bucket
    type: s3
    s3:
      ## s3 access, AWS S3 или несовместимо S3 API изхранилище объекты могут быть
      endpoint: cos.ap-guangzhou.myqcloud.com
      accessKeyId: Your_Access_Key_ID
      secretAccessKey: Your_Secret_Access_Key

  compactor:
    working_directory: /var/loki/retention
    shared_store: s3
    compaction_interval: 10m
    retention_enabled: true
    retention_delete_delay: 2h
    retention_delete_worker_count: 150

  ingester:
    max_transfer_retries: 0
    # max_chunk_age: 2h    # default = 2h
    # chunk_idle_period: 30m    # default = 30m
    # chunk_target_size: 1572864
    chunk_encoding: zstd
    autoforget_unhealthy: true
  storage_config:
    tsdb_shipper:
      active_index_directory: /var/loki/tsdb-index
      cache_location: /var/loki/tsdb-cache
      cache_ttl: 72h
      shared_store: s3
  schemaConfig:
    configs:
      - from: 2024-01-01
        store: tsdb
        object_store: s3
        schema: v12
        index:
          prefix: loki_tsdb_index_
          period: 24h
  limits_config:
    ingestion_rate_strategy: local    # default = "global"
    # retention_period: 240h
    ingestion_rate_mb: 20    # default = 4
    ingestion_burst_size_mb: 100    # default = 6
    per_stream_rate_limit: 6MB    # default = 3MB
    per_stream_rate_limit_burst: 50MB    # default = 15MB
    max_concurrent_tail_requests: 20
    max_cache_freshness_per_query: 10m
    max_query_length: 72h
    max_line_size: 256kb
    max_line_size_truncate: true
    ## [max_streams_matchers_per_query: <int> | default = 1000]
    ## [max_query_bytes_read: <int> | default = 0B]
    shard_streams:
      enabled: true
      desired_rate: 2097152    #2MiB
  
  server:
    grpc_server_max_recv_msg_size: 32000100    # default = 4194304
    grpc_server_max_send_msg_size: 32000100    # default = 4194304


test:
  enabled: false

monitoring:
  lokiCanary:
    enabled: false
  dashboards:
    enabled: false
  selfMonitoring:
    enabled: false
    grafanaAgent:
      installOperator: false
  serviceMonitor:
    enabled: false

#sidecar:
#  resources:
#    limits:
#      cpu: 200m
#      memory: 500Mi
#    requests:
#      cpu: 10m
#      memory: 50Mi

gateway:
  replicas: 1
  #resources:
  #  limits:
  #    cpu: 1
  #    memory: 2Gi
  #  requests:
  #    cpu: 50m
  #    memory: 200Mi
  #service:
  #  type: LoadBalancer

backend:
  replicas: 1
  persistence:
    size: 20Gi
    enableStatefulSetAutoDeletePVC: false
    #storageClass: null
  #resources:
  #  limits:
  #    cpu: 2
  #    memory: 8Gi
  #  requests:
  #    cpu: 100m
  #    memory: 500Mi


write:
  replicas: 1
  persistence:
    size: 20Gi
    #storageClass: null
  #resources:
  #  limits:
  #    cpu: 2
  #    memory: 8Gi
  #  requests:
  #    cpu: 500m
  #    memory: 4Gi

read:
  replicas: 3
  resources:
    limits:
      cpu: 1
      memory: 2Gi
    requests:
      cpu: 50m
      memory: 100Mi
  autoscaling:
    enabled: true
    minReplicas: 3
    maxReplicas: 15
    targetCPUUtilizationPercentage: 90

Развернуть Локи

  • Измените вышеуказанное Values сохранить в values-loki.yaml документ.
  • Измените правильно loki.storage Связанные поля: endpoint, bucketnames, access_key_id, secret_access_key

Поле правильной конечной точки не содержит имени сегмента.

Язык кода:shell
копировать
## Развернуть Локи
helm upgrade --install loki  \
  --namespace loki \
  --create-namespace \
  -f values-loki.yaml \
  --version 5.47.1 \
  grafana/loki

Promtail Values

Язык кода:yaml
копировать
## values-promtail.yaml


image:
  tag: 2.9.6

#resources:
#  limits:
#    cpu: 2
#    memory: 2Gi
#  requests:
#    cpu: 100m
#    memory: 512Mi

config:
  clients:
    - url: http://loki-gateway/loki/api/v1/push
  snippets:
    extraLimitsConfig: |
      max_line_size: 256kb
      max_line_size_truncate: true
      readline_rate_enabled: true
      readline_rate: 110000    # default = 10000
      readline_burst: 810000    # default = 10000
    pipelineStages:
      - cri: {}
      # - match:
      #     ## отфильтровать немного namespace
      #     selector: '{namespace=~"Your_Namespace"}'
      #     action: drop
      # - match:
      #     ## отфильтровать немного container
      #     selector: '{container=~"Your_Container_Name"}'
      #     action: drop
      - json:
          expressions:
            log: log
      - output:
          source: log
      - multiline:
          ## Объединить строки
          firstline: '^\S'
          max_wait_time: 3s
          max_lines: 2000
      #- match:
      #    ## Журналы, соответствующие Этикетке, будут подвергнуты дополнительной конвейерной обработке.
      #    selector: '{container=~"java.*"}'
      #    stages:
      #    - multiline:
      #        firstline: '^[A-Z]{3,9} +\['
      #        max_wait_time: 3s
      #        max_lines: 2000
      #    - regex:
      #        expression: '^(?P<level>[A-Z]{3,9}) +\[.*'
      #        #source: log
      #    - labels:
      #        level:

Развертывание Промтейла

Измените вышеуказанное Values сохранить в values-promtail.yaml документ.

Язык кода:shell
копировать
## Развертывание Промтейла
helm upgrade --install promtail  \
  --namespace loki \
  --create-namespace \
  -f values-promtail.yaml \
  --version 6.15.5 \
  grafana/promtail

Grafana Values

Язык кода:yaml
копировать
## values-grafana.yaml


datasources:
  datasources.yaml:
    apiVersion: 1
    datasources:
    - name: Loki
      type: loki
      url: http://loki-gateway
      access: proxy
      jsonData:
        maxLines: 500

# ingress:
#   enabled: true
#   ingressClassName: nginx
#   annotations: {}
#     # kubernetes.io/ingress.class: nginx
#     # kubernetes.io/tls-acme: "true"
#   hosts:
#     - grafana.example.com

resources:
  limits:
    cpu: 100m
    memory: 1Gi
  requests:
    cpu: 20m
    memory: 128Mi

Департамент Графана

Измените вышеуказанное Values сохранить в values-grafana.yaml документ.

Язык кода:shell
копировать
## Департамент Графана
helm upgrade --install grafana  \
  --namespace loki \
  --create-namespace \
  -f values-grafana.yaml \
  --version 7.3.7 \
  grafana/grafana

Получите начальный пароль администратора Grafana:

Язык кода:shell
копировать
## получать Grafana исходный admin пароль
kubectl get secret -n loki grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo

Панель запросов журнала Grafana
Панель запросов журнала Grafana

Оптимизация развертывания

  • Сжатие данных
  • Теги и индексирование
  • Расширение Querier HPA

вышеизразвертывать Дело былосуществовать Сжатие данных、индекс、HPA Другие аспекты были оптимизированы.

Сжатие данных

Loki Используется по умолчанию gzip алгоритм сжатия, но gzip Скорость декомпрессии относительно низкая, поэтому рекомендуется использовать zstd Сжатие. Для сравнения между ними см. от gzip переключиться на zstd

Язык кода:yaml
копировать
loki:
  ingester:
    chunk_encoding: zstd

индекс ТСДБ

Loki v2.8 представил TSDB Она имеет лучшую производительность, чем старая версия индексной схемы, см. Официальная документация

Язык кода:yaml
копировать
loki:
  storage_config:
    tsdb_shipper:

Увеличение пропускной способности

Язык кода:yaml
копировать
loki:
  limits_config:
    ingestion_rate_strategy: local    # default = "global"
    # retention_period: 240h
    ingestion_rate_mb: 20    # default = 4
    ingestion_burst_size_mb: 100    # default = 6
    per_stream_rate_limit: 6MB    # default = 3MB
    per_stream_rate_limit_burst: 50MB    # default = 15MB
    max_concurrent_tail_requests: 20
    max_cache_freshness_per_query: 10m
    max_query_length: 72h
    max_line_size: 256kb
    max_line_size_truncate: true
    ## [max_streams_matchers_per_query: <int> | default = 1000]
    ## [max_query_bytes_read: <int> | default = 0B]
    shard_streams:
      enabled: true
      desired_rate: 2097152    #2MiB
  
  server:
    grpc_server_max_recv_msg_size: 32000100    # default = 4194304
    grpc_server_max_send_msg_size: 32000100    # default = 4194304

Пользовательские этикетки

Если формат журнала такой:

Язык кода:INFO
копировать
[INFO] Reloading
[INFO] plugin/reload: Running configuration SHA512 = 637429c29e6628b9c013e5f8bd5211d4564943dd9f2dd6eeb506a5a2993177f61da856d85e9ed3c8020ebde2b4abbc232f057d9ba5d9df8247d706893feb8754
[INFO] Reloading complete
[ERROR] plugin/errors: 2 cm-cn-central-00001.albatross.10086.cn. HTTPS: read tcp 10.4.63.250:47580->100.100.2.136:53: i/o timeout

существовать Развертывание Промтейла Вы можете извлечь уровень журнала в виде метки:

Язык кода:yaml
копировать
- match:
    ## Сопоставляет имена контейнеров с java контейнер в начале
    selector: '{container=~"java.*"}'
    stages:
    - multiline:
        ## Объединить строки
        firstline: '^\[[A-Z]{3,9}\] '
        max_wait_time: 3s
        max_lines: 2000
    - regex:
        expression: '^\[(?P<level>[A-Z]{3,9})\] '
        #source: log
    - labels:
        level:

В приведенном выше примере заглавные буквы в скобках в начале каждой строки журнала будут извлечены и введены в уровень Теги, условия запроса плюс уровень Теги могут значительно повыситься. эффективность запроса.

Пользовательские этикетки необходимо настроить в соответствии с форматом и содержанием журнала. Здесь мы демонстрируем только метод реализации.

Не используйте динамические теги. Для динамических тегов не существует фиксированных стандартов. Если под имеет 1 миллион журналов в час и определенный тег генерирует более 10 000 значений, то этот тег должен быть динамическим. Теги должны разбивать журналы по категориям, но не слишком разбросаны.

Узкое место в производительности

Метка и временной диапазон оператора запроса определяют Loki Объем данных, который необходимо извлечь из хранилища и обработать. Если этот объем данных будет существовать 10GB Ниже это не большая проблема. Если он достигнет уровня в сто ГБ, возникнут проблемы с производительностью.

Если есть pod coredns-79f4544dbb-8ck2b, В день производится более 100GB журнал (до сжатия 100GB),Мы запрашиваем данные журнала за один день за раз,от, чтобы найти контент, соответствующий вашим критериям.

  • использовать pod Этикетка {pod="coredns-79f4544dbb-8ck2b"} Запроси дневник за день, Локи. Обработать один раз 100GB Регистрация будет медленнее.
  • Если увеличить level Этикетка,INFO 90GB、WARN 9GB、ERROR 1 ГБ, запрос отдельно ERROR регистрация уровня {pod="coredns-79f4544dbb-8ck2b",level="ERROR} Это очень легко.

Решение состоит в том, чтобы установить соответствующие метки, такие как уровни журнала, функциональные модули, типы событий и т. д.

Оптимизация операторов запроса

Метка и временной диапазон оператора запроса определяют Loki Объем данных, которые необходимо обработать, чем конкретнее метка, тем выше эффективность запроса. Вот некоторые операторы запроса и оценки:

  • 25 точка: {namespace="kube-system"} |= "timeout" Самый последний временной диапазон 24 Час
  • 50 точка: {namespace="kube-system",pod=~"coredns-.*"} |= "timeout" Самый последний временной диапазон 24 Час
  • 60 точка: {pod="coredns-79f4544dbb-8ck2b"} |= "timeout" Самый последний временной диапазон 24 Час
  • 70 точка: {pod="coredns-79f4544dbb-8ck2b"} |= "timeout" Самый последний временной диапазон 1 Час
  • 90 точка: {pod="coredns-79f4544dbb-8ck2b",level="ERROR} |= "timeout" Самый последний временной диапазон 1 Час

Пропускная способность сети и ввод-вывод хранилища

Если объем журнала относительно велик, рекомендуется Kubernetes Выбор узла 10G выше пропускной способности сети, потому что Querier Его можно распределить на несколько узлов, поэтому давление на пропускную способность сети узлов можно уменьшить, а узкое место в пропускной способности будет перенесено на серверную часть, если есть облачная платформа. Производительность объектов не может удовлетворить потребности, можно рассмотреть возможность развертывания на «голое железо». MinIO хранилище.

Узкое место в производительности запросов не может скрыть уникальные преимущества Loki. На самом деле Loki в архитектуре микросервиса чрезвычайно надежен. Даже если несколько больших одновременных запросов вызывают блокировку, Loki все равно может стабильно принимать новые данные.

Домашнее задание

  • Добавить Пользовательские в журнал этикетки, повышают эффективность запросов.
  • В микросервисной архитектуре Loki Querier потребляет много ресурсов ЦП и пропускной способности сети при запросе журналов, но для него не требуется стабильная машина. Опросник можно запланировать для дешевых точечных узлов и распределить по нескольким узлам как можно более равномерно, чтобы значительно увеличить скорость запроса при меньших затратах.
  • ускоряться Расширение Querier Скорость ГПА.

В последующих главах вышеуказанное содержание будет улучшено, так что следите за обновлениями.

boy illustration
Неразрушающее увеличение изображений одним щелчком мыши, чтобы сделать их более четкими артефактами искусственного интеллекта, включая руководства по установке и использованию.
boy illustration
Копикодер: этот инструмент отлично работает с Cursor, Bolt и V0! Предоставьте более качественные подсказки для разработки интерфейса (создание навигационного веб-сайта с использованием искусственного интеллекта).
boy illustration
Новый бесплатный RooCline превосходит Cline v3.1? ! Быстрее, умнее и лучше вилка Cline! (Независимое программирование AI, порог 0)
boy illustration
Разработав более 10 проектов с помощью Cursor, я собрал 10 примеров и 60 подсказок.
boy illustration
Я потратил 72 часа на изучение курсорных агентов, и вот неоспоримые факты, которыми я должен поделиться!
boy illustration
Идеальная интеграция Cursor и DeepSeek API
boy illustration
DeepSeek V3 снижает затраты на обучение больших моделей
boy illustration
Артефакт, увеличивающий количество очков: на основе улучшения характеристик препятствия малым целям Yolov8 (SEAM, MultiSEAM).
boy illustration
DeepSeek V3 раскручивался уже три дня. Сегодня я попробовал самопровозглашенную модель «ChatGPT».
boy illustration
Open Devin — инженер-программист искусственного интеллекта с открытым исходным кодом, который меньше программирует и больше создает.
boy illustration
Эксклюзивное оригинальное улучшение YOLOv8: собственная разработка SPPF | SPPF сочетается с воспринимаемой большой сверткой ядра UniRepLK, а свертка с большим ядром + без расширения улучшает восприимчивое поле
boy illustration
Популярное и подробное объяснение DeepSeek-V3: от его появления до преимуществ и сравнения с GPT-4o.
boy illustration
9 основных словесных инструкций по доработке академических работ с помощью ChatGPT, эффективных и практичных, которые стоит собрать
boy illustration
Вызовите deepseek в vscode для реализации программирования с помощью искусственного интеллекта.
boy illustration
Познакомьтесь с принципами сверточных нейронных сетей (CNN) в одной статье (суперподробно)
boy illustration
50,3 тыс. звезд! Immich: автономное решение для резервного копирования фотографий и видео, которое экономит деньги и избавляет от беспокойства.
boy illustration
Cloud Native|Практика: установка Dashbaord для K8s, графика неплохая
boy illustration
Краткий обзор статьи — использование синтетических данных при обучении больших моделей и оптимизации производительности
boy illustration
MiniPerplx: новая поисковая система искусственного интеллекта с открытым исходным кодом, спонсируемая xAI и Vercel.
boy illustration
Конструкция сервиса Synology Drive сочетает проникновение в интрасеть и синхронизацию папок заметок Obsidian в облаке.
boy illustration
Центр конфигурации————Накос
boy illustration
Начинаем с нуля при разработке в облаке Copilot: начать разработку с минимальным использованием кода стало проще
boy illustration
[Серия Docker] Docker создает мультиплатформенные образы: практика архитектуры Arm64
boy illustration
Обновление новых возможностей coze | Я использовал coze для создания апплета помощника по исправлению домашних заданий по математике
boy illustration
Советы по развертыванию Nginx: практическое создание статических веб-сайтов на облачных серверах
boy illustration
Feiniu fnos использует Docker для развертывания личного блокнота Notepad
boy illustration
Сверточная нейронная сеть VGG реализует классификацию изображений Cifar10 — практический опыт Pytorch
boy illustration
Начало работы с EdgeonePages — новым недорогим решением для хостинга веб-сайтов
boy illustration
[Зона легкого облачного игрового сервера] Управление игровыми архивами
boy illustration
Развертывание SpringCloud-проекта на базе Docker и Docker-Compose