首页 > 自动化运维 > 大规模网络运维 > 如何搞定轻量级日志系统Loki
它有哪些优点:
支持的客户端,如 Promtail,Fluentbit,Fluentd,Vector,Logstash 和 Grafana Agent
代理 Promtail,可以多来源提取日志,包括本地日志文件,systemd,Windows 事件日志,Docker 日志记录驱动程序等
没有日志格式要求,包括 JSON,XML,CSV,logfmt,非结构化文本
使用与查询指标相同的语法查询日志
日志查询时允许动态筛选和转换日志行
可以轻松地计算日志中的需要的指标
引入时的最小索引意味着您可以在查询时动态地对日志进行切片和切块,以便在出现新问题时回答它们
各日志收集组件简单对比:


从上面的图中我们可以看到,它在解析日志的时候是以
index
为主的,index 包括时间戳和 pod 的部分 label(其他 label 为 filename、containers 等),其余的是日志内容。具体查询效果如下:

{app=”loki”,namespace=”kube-public”} 为索引。
在使用过程中,官方推荐使用 promtail 做为 agent 以 DaemonSet 方式部署在 kubernetes 的 worker 节点上搜集日志。另外也可以用上面提到的其他日志收集工具来收取,这篇文章在结尾处会附上其他工具的配置方式。
all(读写模式)

read/write(读写分离模式)
querier
、
ruler
、
fronted
,写节点上保留了
distributor
、
ingester
。

AllInOne 部署模式
k8s部署
auth_enabled: falsetarget: allballast_bytes: 20480server:grpc_listen_port: 9095http_listen_port: 3100graceful_shutdown_timeout: 20sgrpc_listen_address: "0.0.0.0"grpc_listen_network: "tcp"grpc_server_max_concurrent_streams: 100grpc_server_max_recv_msg_size: 4194304grpc_server_max_send_msg_size: 4194304http_server_idle_timeout: 2mhttp_listen_address: "0.0.0.0"http_listen_network: "tcp"http_server_read_timeout: 30shttp_server_write_timeout: 20slog_source_ips_enabled: true## http_path_prefix如果需要更改,在推送日志的时候前缀都需要加指定的内容## http_path_prefix: "/"register_instrumentation: truelog_format: jsonlog_level: infodistributor:ring:heartbeat_timeout: 3skvstore:prefix: collectors/store: memberlist## 需要提前创建好consul集群## consul:## http_client_timeout: 20s## consistent_reads: true## host: 127.0.0.1:8500## watch_burst_size: 2## watch_rate_limit: 2querier:engine:max_look_back_period: 20stimeout: 3m0sextra_query_delay: 100msmax_concurrent: 10multi_tenant_queries_enabled: truequery_ingester_only: falsequery_ingesters_within: 3h0m0squery_store_only: falsequery_timeout: 5m0stail_max_duration: 1h0squery_scheduler:max_outstanding_requests_per_tenant: 2048grpc_client_config:max_recv_msg_size: 104857600max_send_msg_size: 16777216grpc_compression: gziprate_limit: 0rate_limit_burst: 0backoff_on_ratelimits: falsebackoff_config:min_period: 50msmax_period: 15smax_retries: 5use_scheduler_ring: truescheduler_ring:kvstore:store: memberlistprefix: "collectors/"heartbeat_period: 30sheartbeat_timeout: 1m0s## 默认第一个网卡的名称## instance_interface_names## instance_addr: 127.0.0.1## 默认server.grpc-listen-portinstance_port: 9095frontend:max_outstanding_per_tenant: 4096querier_forget_delay: 1h0scompress_responses: truelog_queries_longer_than: 2m0smax_body_size: 104857600query_stats_enabled: truescheduler_dns_lookup_period: 10sscheduler_worker_concurrency: 15query_range:align_queries_with_step: truecache_results: trueparallelise_shardable_queries: truemax_retries: 3results_cache:cache:enable_fifocache: falsedefault_validity: 30sbackground:writeback_buffer: 10000redis:endpoint: 127.0.0.1:6379timeout: 1sexpiration: 0sdb: 9pool_size: 128password: 1521Qyx6^tls_enabled: falsetls_insecure_skip_verify: trueidle_timeout: 10smax_connection_age: 8hruler:enable_api: trueenable_sharding: truealertmanager_refresh_interval: 1mdisable_rule_group_label: falseevaluation_interval: 1m0sflush_period: 3m0sfor_grace_period: 20m0sfor_outage_tolerance: 1h0snotification_queue_capacity: 10000notification_timeout: 4spoll_interval: 10m0squery_stats_enabled: trueremote_write:config_refresh_period: 10senabled: falseresend_delay: 2m0srule_path: /rulerssearch_pending_for: 5m0sstorage:local:directory: /data/loki/rulerstype: configdbsharding_strategy: defaultwal_cleaner:period: 240hmin_age: 12h0m0swal:dir: /data/loki/ruler_walmax_age: 4h0m0smin_age: 5m0struncate_frequency: 1h0m0sring:kvstore:store: memberlistprefix: "collectors/"heartbeat_period: 5sheartbeat_timeout: 1m0s## instance_addr: "127.0.0.1"## instance_id: "miyamoto.en0"## instance_interface_names: ["en0","lo0"]instance_port: 9500num_tokens: 100ingester_client:pool_config:health_check_ingesters: falseclient_cleanup_period: 10sremote_timeout: 3sremote_timeout: 5singester:autoforget_unhealthy: truechunk_encoding: gzipchunk_target_size: 1572864max_transfer_retries: 0sync_min_utilization: 3.5sync_period: 20sflush_check_period: 30sflush_op_timeout: 10m0schunk_retain_period: 1m30schunk_block_size: 262144chunk_idle_period: 1h0smax_returned_stream_errors: 20concurrent_flushes: 3index_shards: 32max_chunk_age: 2h0m0squery_store_max_look_back_period: 3h30m30swal:enabled: truedir: /data/loki/walflush_on_shutdown: truecheckpoint_duration: 15mreplay_memory_ceiling: 2GBlifecycler:ring:kvstore:store: memberlistprefix: "collectors/"heartbeat_timeout: 30sreplication_factor: 1num_tokens: 128heartbeat_period: 5sjoin_after: 5sobserve_period: 1m0s## interface_names: ["en0","lo0"]final_sleep: 10smin_ready_duration: 15sstorage_config:boltdb:directory: /data/loki/boltdbboltdb_shipper:active_index_directory: /data/loki/active_indexbuild_per_tenant_index: truecache_location: /data/loki/cachecache_ttl: 48hresync_interval: 5mquery_ready_num_days: 5index_gateway_client:grpc_client_config:filesystem:directory: /data/loki/chunkschunk_store_config:chunk_cache_config:enable_fifocache: truedefault_validity: 30sbackground:writeback_buffer: 10000redis:endpoint: 192.168.3.56:6379timeout: 1sexpiration: 0sdb: 8pool_size: 128password: 1521Qyx6^tls_enabled: falsetls_insecure_skip_verify: trueidle_timeout: 10smax_connection_age: 8hfifocache:ttl: 1hvalidity: 30m0smax_size_items: 2000max_size_bytes: 500MBwrite_dedupe_cache_config:enable_fifocache: truedefault_validity: 30sbackground:writeback_buffer: 10000redis:endpoint: 127.0.0.1:6379timeout: 1sexpiration: 0sdb: 7pool_size: 128password: 1521Qyx6^tls_enabled: falsetls_insecure_skip_verify: trueidle_timeout: 10smax_connection_age: 8hfifocache:ttl: 1hvalidity: 30m0smax_size_items: 2000max_size_bytes: 500MBcache_lookups_older_than: 10s## 压缩碎片索引compactor:shared_store: filesystemshared_store_key_prefix: index/working_directory: /data/loki/compactorcompaction_interval: 10m0sretention_enabled: trueretention_delete_delay: 2h0m0sretention_delete_worker_count: 150delete_request_cancel_period: 24h0m0smax_compaction_parallelism: 2## compactor_ring:frontend_worker:match_max_concurrent: trueparallelism: 10dns_lookup_duration: 5s## runtime_config 这里没有配置任何信息## runtime_config:common:storage:filesystem:chunks_directory: /data/loki/chunksfules_directory: /data/loki/rulersreplication_factor: 3persist_tokens: false## instance_interface_names: ["en0","eth0","ens33"]analytics:reporting_enabled: falselimits_config:ingestion_rate_strategy: globalingestion_rate_mb: 100ingestion_burst_size_mb: 18max_label_name_length: 2096max_label_value_length: 2048max_label_names_per_series: 60enforce_metric_name: truemax_entries_limit_per_query: 5000reject_old_samples: truereject_old_samples_max_age: 168hcreation_grace_period: 20m0smax_global_streams_per_user: 5000unordered_writes: truemax_chunks_per_query: 200000max_query_length: 721hmax_query_parallelism: 64max_query_series: 700cardinality_limit: 100000max_streams_matchers_per_query: 1000max_concurrent_tail_requests: 10ruler_evaluation_delay_duration: 3sruler_max_rules_per_rule_group: 0ruler_max_rule_groups_per_tenant: 0retention_period: 700hper_tenant_override_period: 20smax_cache_freshness_per_query: 2m0smax_queriers_per_tenant: 0per_stream_rate_limit: 6MBper_stream_rate_limit_burst: 50MBmax_query_lookback: 0ruler_remote_write_disabled: falsemin_sharding_lookback: 0ssplit_queries_by_interval: 10m0smax_line_size: 30mbmax_line_size_truncate: falsemax_streams_per_user: 0## memberlist_conig模块配置gossip用于在分发服务器、摄取器和查询器之间发现和连接。## 所有三个组件的配置都是的,以确保单个共享环。## 至少定义了1个join_members配置后,将自动为分发服务器、摄取器和ring 配置memberlist类型的kvstorememberlist:randomize_node_name: truestream_timeout: 5sretransmit_factor: 4join_members:- 'loki-memberlist'abort_if_cluster_join_fails: trueadvertise_addr: 0.0.0.0advertise_port: 7946bind_addr: ["0.0.0.0"]bind_port: 7946compression_enabled: truedead_node_reclaim_time: 30sgossip_interval: 100msgossip_nodes: 3gossip_to_dead_nodes_time: 3## join:leave_timeout: 15sleft_ingesters_timeout: 3m0smax_join_backoff: 1m0smax_join_retries: 5message_history_buffer_bytes: 4096min_join_backoff: 2s## node_name: miyamotopacket_dial_timeout: 5spacket_write_timeout: 5spull_push_interval: 100msrejoin_interval: 10stls_enabled: falsetls_insecure_skip_verify: trueschema_config:configs:- from: "2020-10-24"index:period: 24hprefix: index_object_store: filesystemschema: v11store: boltdb-shipperchunks:period: 168hrow_shards: 32table_manager:retention_deletes_enabled: falseretention_period: 0sthroughput_updates_disabled: falsepoll_interval: 3m0screation_grace_period: 20mindex_tables_provisioning:provisioned_write_throughput: 1000provisioned_read_throughput: 500inactive_write_throughput: 4inactive_read_throughput: 300inactive_write_scale_lastn: 50enable_inactive_throughput_on_demand_mode: trueenable_ondemand_throughput_mode: trueinactive_read_scale_lastn: 10write_scale:enabled: truetarget: 80## role_arn:out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800inactive_write_scale:enabled: truetarget: 80out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800read_scale:enabled: truetarget: 80out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800inactive_read_scale:enabled: truetarget: 80out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800chunk_tables_provisioning:enable_inactive_throughput_on_demand_mode: trueenable_ondemand_throughput_mode: trueprovisioned_write_throughput: 1000provisioned_read_throughput: 300inactive_write_throughput: 1inactive_write_scale_lastn: 50inactive_read_throughput: 300inactive_read_scale_lastn: 10write_scale:enabled: truetarget: 80out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800inactive_write_scale:enabled: truetarget: 80out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800read_scale:enabled: truetarget: 80out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800inactive_read_scale:enabled: truetarget: 80out_cooldown: 1800min_capacity: 3000max_capacity: 6000in_cooldown: 1800tracing:enabled: true
注意 :
ingester.lifecycler.ring.replication_factor
的值在单实例的情况下为 1
ingester.lifecycler.min_ready_duration
的值为 15s,在启动后默认会显示 15 秒将状态变为 ready
memberlist.node_name
的值可以不用设置,默认是当前主机的名称
memberlist.join_members
是一个列表,在有多个实例的情况下需要添加各个节点的主机名 /IP 地址。
service
绑定到 StatefulSets。
query_range.results_cache.cache.enable_fifocache
建议设置为
false
,我这里设置成了 true
instance_interface_names
是一个列表,默认的为
["en0","eth0"]
,可以根据需要设置对应的网卡名称,一般不需要进行特殊设置。
loki-all.yaml
,把它作为一个
configmap
写入 k8s 集群。可以使用如下命令创建:$ kubectl create configmap --from-file ./loki-all.yaml loki-all
可以通过命令查看到已经创建好的 configmap,具体操作详见下图
以下配置文件也特别长:
apiVersion: v1kind: PersistentVolumemetadata:name: lokinamespace: defaultspec:hostPath:path: /glusterfs/lokitype: DirectoryOrCreatecapacity:storage: 1GiaccessModes:- ReadWriteMany---apiVersion: v1kind: PersistentVolumeClaimmetadata:name: lokinamespace: defaultspec:accessModes:- ReadWriteManyresources:requests:storage: 1GivolumeName: loki创建应用准备好 k8s 的 StatefulSet 部署文件后就可以直接在集群里面创建应用了。apiVersion: apps/v1kind: StatefulSetmetadata:labels:app: lokiname: lokinamespace: defaultspec:podManagementPolicy: OrderedReadyreplicas: 1selector:matchLabels:app: lokitemplate:metadata:annotations:prometheus.io/port: http-metricsprometheus.io/scrape: "true"labels:app: lokispec:containers:- args:- -config.file=/etc/loki/loki-all.yamlimage: grafana/loki:2.5.0imagePullPolicy: IfNotPresentlivenessProbe:failureThreshold: 3httpGet:path: /readyport: http-metricsscheme: HTTPinitialDelaySeconds: 45periodSeconds: 10successThreshold: 1timeoutSeconds: 1name: lokiports:- containerPort: 3100name: http-metricsprotocol: TCP- containerPort: 9095name: grpcprotocol: TCP- containerPort: 7946name: memberlist-portprotocol: TCPreadinessProbe:failureThreshold: 3httpGet:path: /readyport: http-metricsscheme: HTTPinitialDelaySeconds: 45periodSeconds: 10successThreshold: 1timeoutSeconds: 1resources:requests:cpu: 500mmemory: 500Milimits:cpu: 500mmemory: 500MisecurityContext:readOnlyRootFilesystem: truevolumeMounts:- mountPath: /etc/lokiname: config- mountPath: /dataname: storagerestartPolicy: AlwayssecurityContext:fsGroup: 10001runAsGroup: 10001runAsNonRoot: truerunAsUser: 10001serviceAccount: lokiserviceAccountName: lokivolumes:- emptyDir: {}name: tmp- name: configconfigMap:name: loki- persistentVolumeClaim:claimName: lokiname: storage---kind: ServiceapiVersion: v1metadata:name: loki-memberlistnamespace: defaultspec:ports:- name: loki-memberlistprotocol: TCPport: 7946targetPort: 7946selector:kubepi.org/name: loki---kind: ServiceapiVersion: v1metadata:name: lokinamespace: defaultspec:ports:- name: lokiprotocol: TCPport: 3100targetPort: 3100selector:kubepi.org/name: loki
Running
状态时可以通过 API 的方式看一下分发器是不是正常工作,当显示
Active
时正常才会正常分发日志流到收集器(ingester)。
限于篇幅,更多部署方式,就不介绍了。
链接:
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70013542/viewspace-2966883/ ,如需转载,请注明出处,否则将追究法律责任。