Loki — это легко масштабируемая по горизонтали и высокодоступная система агрегирования журналов.
По сравнению с другими системами агрегирования журналов Loki имеет следующие преимущества:
мы используем Grafana Официально предоставлено Helm Charts Развертывание набора Loki Система журналирования, включающая следующие компоненты:
совместимый AWS S3 API изхранилище объекты могут быть,Например:
Между Loki и хранилищем требуется большая пропускная способность, а развертывание между облаками и регионами не рекомендуется.
Требуется ключ доступа со следующими разрешениями:
Политики авторизации на разных облачных платформах различаются. Если у вас недостаточно разрешений, измените их на полные разрешения на чтение и запись для всего сегмента.
## добавить в Ускоренное хранилище изображений
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
Ускоренное хранилище изображений Полностью клонировано с официального сайта.
## 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-loki.yaml
документ.endpoint
, bucketnames
, access_key_id
, secret_access_key
Поле правильной конечной точки не содержит имени сегмента.
## Развернуть Локи
helm upgrade --install loki \
--namespace loki \
--create-namespace \
-f values-loki.yaml \
--version 5.47.1 \
grafana/loki
## 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
документ.
## Развертывание Промтейла
helm upgrade --install promtail \
--namespace loki \
--create-namespace \
-f values-promtail.yaml \
--version 6.15.5 \
grafana/promtail
## 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
документ.
## Департамент Графана
helm upgrade --install grafana \
--namespace loki \
--create-namespace \
-f values-grafana.yaml \
--version 7.3.7 \
grafana/grafana
Получите начальный пароль администратора Grafana:
## получать Grafana исходный admin пароль
kubectl get secret -n loki grafana -o jsonpath="{.data.admin-password}" | base64 --decode ; echo
вышеизразвертывать Дело былосуществовать Сжатие данных、индекс、HPA Другие аспекты были оптимизированы.
Loki Используется по умолчанию gzip алгоритм сжатия, но gzip Скорость декомпрессии относительно низкая, поэтому рекомендуется использовать zstd Сжатие. Для сравнения между ними см. от gzip переключиться на zstd
loki:
ingester:
chunk_encoding: zstd
Loki v2.8 представил TSDB Она имеет лучшую производительность, чем старая версия индексной схемы, см. Официальная документация
loki:
storage_config:
tsdb_shipper:
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] 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
существовать Развертывание Промтейла Вы можете извлечь уровень журнала в виде метки:
- 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="coredns-79f4544dbb-8ck2b"}
Запроси дневник за день, Локи. Обработать один раз 100GB Регистрация будет медленнее.{pod="coredns-79f4544dbb-8ck2b",level="ERROR}
Это очень легко.Решение состоит в том, чтобы установить соответствующие метки, такие как уровни журнала, функциональные модули, типы событий и т. д.
Метка и временной диапазон оператора запроса определяют Loki Объем данных, которые необходимо обработать, чем конкретнее метка, тем выше эффективность запроса. Вот некоторые операторы запроса и оценки:
{namespace="kube-system"} |= "timeout"
Самый последний временной диапазон 24 Час{namespace="kube-system",pod=~"coredns-.*"} |= "timeout"
Самый последний временной диапазон 24 Час{pod="coredns-79f4544dbb-8ck2b"} |= "timeout"
Самый последний временной диапазон 24 Час{pod="coredns-79f4544dbb-8ck2b"} |= "timeout"
Самый последний временной диапазон 1 Час{pod="coredns-79f4544dbb-8ck2b",level="ERROR} |= "timeout"
Самый последний временной диапазон 1 ЧасЕсли объем журнала относительно велик, рекомендуется Kubernetes Выбор узла 10G выше пропускной способности сети, потому что Querier Его можно распределить на несколько узлов, поэтому давление на пропускную способность сети узлов можно уменьшить, а узкое место в пропускной способности будет перенесено на серверную часть, если есть облачная платформа. Производительность объектов не может удовлетворить потребности, можно рассмотреть возможность развертывания на «голое железо». MinIO хранилище.
Узкое место в производительности запросов не может скрыть уникальные преимущества Loki. На самом деле Loki в архитектуре микросервиса чрезвычайно надежен. Даже если несколько больших одновременных запросов вызывают блокировку, Loki все равно может стабильно принимать новые данные.
В последующих главах вышеуказанное содержание будет улучшено, так что следите за обновлениями.