Loki日志收集单进程模式部署

一、Loki特点

二、Loki组件

三、Loki架构图

四、Loki部署

五、与EFK比较


一、Loki特点

1.1 围绕日志标签构建索引,而不是像es一样进行全文索引
1.2 多租户
    通过tenant ID实现多租户,如果关闭多租户, 则默认唯一租户为fake
1.3 部署模式
    1.1 单进程模式
        所有的组件运行在一个进程中,适用于测试环境或者较小的生产环境
    1.2 微服务可扩展模式
        各组件单独运行,可水平伸缩扩展         

二、Loki组件

1.    Distributor
    负责处理客户端的日志写入,负责接收日志数据,然后将其拆分成多个块,并行的发送给ingester
    Distributor通过GRPC协议与Ingester进行通信
2. Hashing
    Distributor通过一致性哈希和可配置因子来确定哪些Ingester服务的实例应该接收日志数据
    hash基于日志标签和tenant ID
    console中的hash ring用于实现一致性hash,所有Ingester都使用自己拥有的一组令牌注册到console中,Distributor通过找到日志hash值最
    匹配的令牌并将日志数据发送给该令牌的所有者
3. Ingester
    负责将日志数据写入持久化后端(S3,OSS)
    Ingester负责所有的日志行有序
    Ingester负责所有的日志行按升序排序,如果收到乱序的日志行,将拒绝并报错
    来自每一组唯一标签的日志在内存中被构建为“块”,然后被刷新到备份存储后端。
    如果ingester进程奔溃,内存中构建的块的数据未刷写到磁盘,则会丢失
4. Querier
    LogQL
    首先尝试查询所有Ingester的内存数据,然后再从后端存储加载数据。
5. Chunk Store
    块存储是Loki长期数据存储,支持交互式查询和持续写入
    包含如下:
    1.1 块索引
    1.2 块数据本身的键值存储
    注意: 块存储不是单独的服务,而是嵌入到需要访问的Loki数据的服务中的库:Querier和Ingester

三、Loki架构图

 

 数据写入:

1.1 Distributor负责接收日志数据,然后拆分为多个块,并行的发送给Ingester

1.2 Ingester接收Distributor发送的数据块,缓存在内存中, 同时定时刷写进持久化存储Chunk Store中

数据查询

Ingester接收Querier查询请求,根据块索引查询指定的块,如果内存中没有,将从持久化存储chunk Store中查找数据,并返回

四、Loki部署

本次部署使用单进程模式进行部署,通过复用“阿果阿郭”老师的部署方式进行单进程部署,仅作为学习复习使用,原文链接:k8s loki 容器日志解决方案-4. alertmanager 报警及loki rules - 哔哩哔哩

 官网部署方式有:

请根据需要自行参考学习

 部署如下:

4.1 安装supervisor

安装supervisor
yum install epel-release -y
yum install supervisor -y


修改内存、进程、文件限制
sed -i '/forking/a LimitNOFILE=65536' /usr/lib/systemd/system/supervisord.service;
sed -i '/forking/a LimitNPROC=65536' /usr/lib/systemd/system/supervisord.service ;
sed -i '/forking/a LimitMEMLOCK=infinity' /usr/lib/systemd/system/supervisord.service ;

启动服务

systemctl start supervisord.service

4.2 安装Loki

上传loki-linux-amd64.zip压缩包到/data/loki目录
解压文件
unzip loki-linux-amd64.zip


验证版本
./loki-linux-amd64 --version

systemd管理Loki
cat <<EOF > /usr/lib/systemd/system/loki.service
[Unit]
Description=loki.service
After=rc-local.service nss-user-lookup.target

[Service]
Type=simple
LimitMEMLOCK=infinity
LimitNPROC=65536
LimitNOFILE=65536
WorkingDirectory=/data/loki
ExecStart=/data/loki/loki-linux-amd64 -log.level=info -target all -config.file=loki-local-config.yaml

[Install]
WantedBy=multi-user.target
EOF

supervisord管理Loki
cat <<EOF> /etc/supervisord.d/loki.ini
[program:loki]
command=/data/loki/loki-linux-amd64 -log.level=info -target all -config.file=loki-local-config.yaml
autorestart=true
autostart=true
stderr_logfile=/tmp/loki_err.log
stdout_logfile=/tmp/loki_out.log
user=root
stopsignal=INT
startsecs=10
startretries=3
directory=/data/loki
EOF

 配置Loki文件
cat <<EOF> /data/loki/loki-local-config.yaml
auth_enabled: false            #是否启用认证。这里认证是针对多租户而言,这里我们使用单租户

server:
  http_listen_port: 3100
  grpc_server_max_concurrent_streams: 0

ingester:
  lifecycler:
    address: 127.0.0.1
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 1h      
  max_chunk_age: 1h        
  chunk_target_size: 10485760 
  chunk_retain_period: 30s    
  max_transfer_retries: 0     

schema_config:
  configs:
    - from: 2020-10-24
      store: boltdb-shipper
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 24h
# 存储配置
storage_config:
  boltdb_shipper:
    active_index_directory: /data/loki/boltdb-shipper-active
    cache_location: /data/loki/boltdb-shipper-cache                #定义缓存地址
    cache_ttl: 24h          
    shared_store: filesystem
  filesystem:
    directory: /data/loki/chunks        #定义块地址

compactor:
  working_directory: /data/loki/boltdb-shipper-compactor        #压缩位置
  shared_store: filesystem


limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  ingestion_rate_mb: 200
  # ingestion_burst_size_mb: 400
  # max_streams_per_user: 0
  # max_chunks_per_query: 20000000
  # max_query_parallelism: 140
  # max_query_series: 5000
  # cardinality_limit: 1000000
  # max_streams_matchers_per_query: 10000

chunk_store_config:
  max_look_back_period: 0s

# 数据保留时间
table_manager:
  retention_deletes_enabled: true
  retention_period: 24h

ruler:
  storage:
    type: local
    local:
      directory: /data/loki/rules
  rule_path: /data/loki/rules-temp
  alertmanager_url: http://localhost:9093
  ring:
    kvstore:
      store: inmemory
  enable_api: true

EOF

启动Loki
supervisorctl status
supervisorctl update
supervisorctl status

4.3 安装Promtail

mkdir /data/promtail/{bin,config,logs} -p 
cd /data/promtail/bin
curl -O -L "https://github.com/grafana/loki/releases/download/v2.3.0/promtail-linux-amd64.zip"
unzip "promtail-linux-amd64.zip"
chmod a+x "promtail-linux-amd64" 

配置文件

cat << EOF > /data/promtail/config/promtail.conf
server:      #promtail服务的server配置
  http_listen_address: 0.0.0.0
  http_listen_port: 19080
  grpc_listen_port: 0

positions:
  filename: ./logs/loki_positions.yaml
  ignore_invalid_yaml: true

clients:        #定义Loki服务的地址
  - url: http://127.0.0.1:3100/loki/api/v1/push

scrape_configs:
- job_name: service_log
  file_sd_configs:        #定义抓取的日志,通过文件实现服务发现
    - files:
      - ./config/*.yaml
      refresh_interval: 1m
EOF

配置supervisor管理程序

cat << EOF > /etc/supervisord.d/promtail.ini
[program:promtail]
command=/data/promtail/bin/promtail-linux-amd64 -config.expand-env=true -config.file=/data/promtail/config/promtail.conf
autorestart=true
autostart=true
stderr_logfile=/tmp/promtail_err.log
stdout_logfile=/tmp/promtail_out.log
user=root
stopsignal=INT
startsecs=10
startretries=3
directory=/data/promtail/
EOF 

定义收集日志配置

cat << EOF > /data/promtail/config/varlogmessage.yaml
- targets:
    - localhost
  labels:
    __path__: /var/log/messages
    env: {{ENV}}
    hostname: {{BINDIP}}
    service_name: var-log-messages
    log_type: var-log-messages
- targets:
    - localhost
  labels:
    __path__: /var/log/secure
    env: {{ENV}}
    hostname: {{BINDIP}}
    service_name: var-log-secure
    log_type: var-log-secure
EOF 

注意: env中变量使用的jinja2的语法
ENV=test
BINDIP=192.168.161.118
sed -i "s/{{ENV}}/$ENV/g" /data/promtail/config/varlogmessage.yaml
sed -i "s/{{BINDIP}}/$BINDIP/g" /data/promtail/config/varlogmessage.yaml

启动promtail

supervisorctl status
supervisorctl update
supervisorctl status

验证Loki是否收集到日志
curl 127.0.0.1:3100/loki/api/v1/labels 
curl 127.0.0.1:3100/loki/api/v1/label/service_name/values
curl 127.0.0.1:3100/loki/api/v1/label/filename/values

4.4 安装grafana

 1.1 下载grafana二进制包
下载地址:wget https://dl.grafana.com/enterprise/release/grafana-enterprise-8.5.14.linux-amd64.tar.gz
建议国内下载:
https://mirrors.huaweicloud.com/grafana/8.5.9/grafana-enterprise-8.5.9.linux-amd64.tar.gz
tar xf grafana-enterprise-8.5.9.linux-amd64.tar.gz -C /data
cd /data/
mv grafana-8.5.9/ grafana

配置supervisor管理grafana

cat <<EOF> /etc/supervisord.d/grafana.ini
[program:grafana]
command=/data/grafana/bin/grafana-server web
autorestart=true
autostart=true
stderr_logfile=/tmp/grafana_err.log
stdout_logfile=/tmp/grafana_out.log
user=root
stopsignal=INT
startsecs=10
startretries=3
directory=/data/grafana
EOF

启动grafana

supervisorctl status
supervisorctl update
supervisorctl status


添加loki数据源
通过 Explore 查看 loki 数据
导入grafana loki dashboard 查看数据

 {
  "annotations": {
    "list": [
      {
        "builtIn": 1,
        "datasource": "-- Grafana --",
        "enable": true,
        "hide": true,
        "iconColor": "rgba(0, 211, 255, 1)",
        "name": "Annotations & Alerts",
        "target": {
          "limit": 100,
          "matchAny": false,
          "tags": [],
          "type": "dashboard"
        },
        "type": "dashboard"
      }
    ]
  },
  "editable": true,
  "gnetId": null,
  "graphTooltip": 0,
  "id": 8,
  "iteration": 1655978337467,
  "links": [],
  "panels": [
    {
      "aliasColors": {},
      "bars": false,
      "dashLength": 10,
      "dashes": false,
      "datasource": "${ENV}",
      "fill": 1,
      "fillGradient": 0,
      "gridPos": {
        "h": 5,
        "w": 24,
        "x": 0,
        "y": 0
      },
      "hiddenSeries": false,
      "id": 4,
      "legend": {
        "alignAsTable": true,
        "avg": false,
        "current": false,
        "max": false,
        "min": false,
        "rightSide": true,
        "show": true,
        "total": false,
        "values": false
      },
      "lines": true,
      "linewidth": 1,
      "nullPointMode": "null",
      "options": {
        "alertThreshold": true
      },
      "percentage": false,
      "pluginVersion": "8.1.5",
      "pointradius": 2,
      "points": false,
      "renderer": "flot",
      "seriesOverrides": [],
      "spaceLength": 10,
      "stack": false,
      "steppedLine": false,
      "targets": [
        {
          "expr": "sum (count_over_time({service_name=~\"$app_name\",filename=~\"$log_type\",hostname=~\"$hostname\"}[2m] )) by (hostname)",
          "hide": true,
          "legendFormat": "",
          "queryType": "randomWalk",
          "refId": "A"
        },
        {
          "expr": "sum (count_over_time({service_name=~\"$app_name\",filename=~\"$log_type\",hostname=~\"$hostname\"}[2m] )) by (hostname,filename)",
          "hide": false,
          "legendFormat": "{{hostname}}/{{filename}}",
          "refId": "B"
        }
      ],
      "thresholds": [],
      "timeFrom": null,
      "timeRegions": [],
      "timeShift": null,
      "title": "日志量统计",
      "tooltip": {
        "shared": true,
        "sort": 0,
        "value_type": "individual"
      },
      "type": "graph",
      "xaxis": {
        "buckets": null,
        "mode": "time",
        "name": null,
        "show": true,
        "values": []
      },
      "yaxes": [
        {
          "$$hashKey": "object:319",
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        },
        {
          "$$hashKey": "object:320",
          "format": "short",
          "label": null,
          "logBase": 1,
          "max": null,
          "min": null,
          "show": true
        }
      ],
      "yaxis": {
        "align": false,
        "alignLevel": null
      }
    },
    {
      "datasource": "${ENV}",
      "description": "",
      "gridPos": {
        "h": 21,
        "w": 24,
        "x": 0,
        "y": 5
      },
      "id": 2,
      "options": {
        "dedupStrategy": "exact",
        "enableLogDetails": false,
        "prettifyLogMessage": false,
        "showCommonLabels": false,
        "showLabels": false,
        "showTime": true,
        "sortOrder": "Descending",
        "wrapLogMessage": true
      },
      "pluginVersion": "7.4.3",
      "targets": [
        {
          "expr": "{service_name=~\"$app_name\",filename=~\"$log_type\",hostname=~\"$hostname\"} |~ \"(?i)$log_level\"",
          "maxLines": 1000,
          "queryType": "randomWalk",
          "refId": "A"
        }
      ],
      "timeFrom": null,
      "timeShift": null,
      "title": "日志",
      "transparent": true,
      "type": "logs"
    }
  ],
  "refresh": false,
  "schemaVersion": 30,
  "style": "dark",
  "tags": [],
  "templating": {
    "list": [
      {
        "current": {
          "selected": false,
          "text": "crm-cd",
          "value": "crm-cd"
        },
        "description": null,
        "error": null,
        "hide": 0,
        "includeAll": false,
        "label": "选择环境",
        "multi": false,
        "name": "ENV",
        "options": [],
        "query": "loki",
        "queryValue": "",
        "refresh": 1,
        "regex": "",
        "skipUrlSync": false,
        "type": "datasource"
      },
      {
        "allValue": null,
        "current": {
          "selected": true,
          "text": "neo-pharma-service",
          "value": "neo-pharma-service"
        },
        "datasource": "${ENV}",
        "definition": "label_values({service_name=~\".+\"},service_name)",
        "description": null,
        "error": null,
        "hide": 0,
        "includeAll": false,
        "label": "服务名",
        "multi": false,
        "name": "app_name",
        "options": [],
        "query": "label_values({service_name=~\".+\"},service_name)",
        "refresh": 1,
        "regex": "",
        "skipUrlSync": false,
        "sort": 1,
        "type": "query"
      },
      {
        "allValue": null,
        "current": {
          "selected": false,
          "text": "/logs/gc.log",
          "value": "/logs/gc.log"
        },
        "datasource": "${ENV}",
        "definition": "label_values({service_name=\"$app_name\"}, filename)",
        "description": null,
        "error": null,
        "hide": 0,
        "includeAll": false,
        "label": "日志名",
        "multi": false,
        "name": "log_type",
        "options": [],
        "query": "label_values({service_name=\"$app_name\"}, filename)",
        "refresh": 2,
        "regex": "",
        "skipUrlSync": false,
        "sort": 0,
        "type": "query"
      },
      {
        "allValue": ".*",
        "current": {
          "selected": true,
          "text": "neo-pharma-service-7c87d876d5-js77h",
          "value": "neo-pharma-service-7c87d876d5-js77h"
        },
        "datasource": "${ENV}",
        "definition": "label_values({service_name=\"$app_name\",filename=\"$log_type\"}, hostname)",
        "description": null,
        "error": null,
        "hide": 0,
        "includeAll": false,
        "label": "主机名",
        "multi": false,
        "name": "hostname",
        "options": [],
        "query": "label_values({service_name=\"$app_name\",filename=\"$log_type\"}, hostname)",
        "refresh": 2,
        "regex": "",
        "skipUrlSync": false,
        "sort": 0,
        "tagValuesQuery": "",
        "tagsQuery": "",
        "type": "query",
        "useTags": false
      },
      {
        "allValue": "(^\\\\S|^\\\\s)",
        "current": {
          "selected": false,
          "text": "All",
          "value": "$__all"
        },
        "description": "可以直接输入搜索的关键字进行过滤",
        "error": null,
        "hide": 0,
        "includeAll": true,
        "label": "关键字过滤",
        "multi": false,
        "name": "log_level",
        "options": [
          {
            "selected": true,
            "text": "All",
            "value": "$__all"
          },
          {
            "selected": false,
            "text": "warning",
            "value": "warning"
          },
          {
            "selected": false,
            "text": "unknown",
            "value": "unknown"
          },
          {
            "selected": false,
            "text": "info",
            "value": "info"
          },
          {
            "selected": false,
            "text": "error",
            "value": "error"
          },
          {
            "selected": false,
            "text": "直接输入关键字搜索",
            "value": "直接输入关键字搜索"
          }
        ],
        "query": "warning,unknown,info,error,直接输入关键字搜索",
        "queryValue": "",
        "skipUrlSync": false,
        "type": "custom"
      }
    ]
  },
  "time": {
    "from": "now-1h",
    "to": "now"
  },
  "timepicker": {},
  "timezone": "",
  "title": "日志中心",
  "uid": "NlV_8QD7k",
  "version": 21
}

 效果图

4.5 安装alertmanager

 cd /data
tar xf alertmanager-0.24.0.linux-amd64.tar.gz
mv alertmanager-0.24.0.linux-amd64 alertmanager 
配置supervisor管理alertmanager
cat <<EOF> /etc/supervisord.d/alertmanager.ini
[program:alertmanager]
command=/data/alertmanager/alertmanager
autorestart=true
autostart=true
stderr_logfile=/tmp/alertmanager_err.log
stdout_logfile=/tmp/alertmanager_out.log
user=root
stopsignal=INT
startsecs=10
startretries=3
directory=/data/alertmanager
EOF

配置alertmanager配置文件

cat <<EOF> /data/alertmanager/alertmanager.yml

global:
  smtp_smarthost: 'smtp.qq.com:465'       # smtp地址
  smtp_from: '4506259@qq.com'                # 谁发邮件
  smtp_auth_username: '4507259@qq.com'       # 邮箱用户
  smtp_auth_password: 'gbrqbrcace'                   # 邮箱密码
  smtp_require_tls: false

templates:
- '/usr/local/alertmanager/template/*.tmpl'

route:
  group_by: ["instance"]            # 分组名
  group_wait: 30s                   # 当收到告警的时候,等待三十秒看是否还有告警,如果有就一起发出去
  group_interval: 5m                # 发送警告间隔时间
  repeat_interval: 3h               # 重复报警的间隔时间
  receiver: mail                    # 全局报警组,这个参数是必选的,和下面报警组名要相同

receivers:
- name: 'mail'                      # 报警组名
  email_configs:
  - to: '187171160@163.com'      # 发送给谁
    send_resolved: true            #
EOF

 配置警报规则

cat <<'EOF'> /data/loki/rules/fake/rules.yaml
groups:
  - name: service OutOfMemoryError
    rules:
      # 关键字监控
      - alert: loki check words java.lang.OutOfMemoryError
        expr: sum by (env, hostname, log_type, filename) (count_over_time({env=~"\\w+"} |= "java.lang.OutOfMemoryError" [5m]) > 0)
        labels:
          severity: critical
        annotations:
          description: '{{$labels.env}} {{$labels.hostname}} file {{$labels.filename}} has  {{ $value }} error'
          summary: java.lang.OutOfMemoryError
      # java 程序日志性能报警
      - alert: loki java full gc count check
        expr: sum by (env, hostname, log_type, filename) (count_over_time({env=~"\\w+"} |= "Full GC (Allocation" [5m]) > 5)
        labels:
          severity: warning
        annotations:
          description: '{{$labels.env}} {{$labels.hostname}} {{$labels.filename}} {{ $value }}'
          summary: java full gc count check
      # 使用正则表达式报警匹配示例
      - alert: dbperform slowlog sql 慢查询
        expr: 'sum by (env, hostname, log_type, filename) (count_over_time({env=~"\\w+"} |~ "time: [1-9]\\d{4,}" [5m]) > 5)'
        labels:
          severity: warning
        annotations:
          description: '{{$labels.env}} {{$labels.hostname}} file {{$labels.filename}} has  {{ $value }} error'
          summary: sql slowlog
EOF

 测试警报

echo 'The String object java.lang.OutOfMemoryError is used to represent and manipulate a sequence of characters.' >> /var/log/messages`

 

五、与EFK比较

EFK:
1.1 Elasticsearch中的数据作为非结构化JSON对象存储在磁盘上。每个对象的键和每个键的内容都被索引。
     然后可以使用JSON对象定义查询(称为查询DSL)或通过Lucene查询语言查询数据。
1.2 EFK使用fluentd作为日志收集器
Loki:
1.1 单进程模式将日志数据存储到磁盘中,微服务可扩展模式将数据存储在云存储中。日志通过标记标签,仅只有标签被索引,索引更少,成本更低
1.2 Loki使用promtail作为日志收集器。通过发现存储在磁盘上的日志文件, 并将它们与标签做关联,然后转发给Loki
    Promtail可以充当Pod 的sidecar进行Pod的日志收集,以及从指定文件中读取日志、跟踪系统日志

 参考文档:

k8s loki 容器日志解决方案-4. alertmanager 报警及loki rules - 哔哩哔哩

Getting started | Grafana Loki documentation

<think>嗯,用户专门询问Loki日志持久化的配置实现方案,看来是在搭建K8s日志系统时遇到了存储落地的实际问题。从引用的技术文档片段看,用户应该已经掌握了基本部署流程,但需要更具体的存储配置指导。注意到用户引用了四条技术资料:第一条详细描述了Loki的性能特点和部署前置条件,特别强调了持久化存储的要求;第二条展示了Helm安装命令中的存储参数;第三条提到单进程模式部署的参考;第四条则对比了Loki与传统方案的存储优势。这些都很聚焦在存储配置层面。用户的核心诉求其实很明确——如何让Loki保存的日志不丢失。需要重点解决三个技术点:存储类的动态供给(storageClass)、持久卷声明(PVC)的容量配置、以及生产环境的高可用方案。考虑到用户可能正在测试环境搭建,应该优先提供单机版配置作为起点。有趣的是用户引用的文档中已经包含关键参数(--setloki.persistence.enabled=true那行),只是可能不清楚具体实现逻辑。应该用Helmvalues.yaml的示例来解释这些参数如何对应到K8s的存储资源。另外要提醒数据目录挂载点的问题,很多初学者的数据丢失都是因为容器重启后挂载失效导致的。生产环境的方案需要谨慎些,用户没提集群规模但引用了PB级日志的描述,可能要补充说明下多副本模式对存储系统的要求。文档里提到的NFS其实不太适合大规模生产,应该建议用户关注云存储或分布式存储方案,不过首次回复还是先解决基础配置为好。对了,用户引用的第四条提到Go语言内存优势时隐含了一个重要信息——Loki的存储读写是基于对象存储优化的,这跟传统数据库的存储逻辑完全不同,配置时要注意write-ahead-log的路径设置,得在文档示例里强调这块。</think> Loki日志持久化主要通过配置持久卷(Persistent Volume)实现,以下是具体配置方案及步骤: --- ### **核心配置要素** 1. **持久卷声明(PVC)** - 定义存储容量、访问模式(如 `ReadWriteOnce`) - 指定存储类(StorageClass) 2. **存储后端** - 支持对象存储(如 S3、GCS、MinIO)或块存储(如 NFS、云磁盘) --- ### **配置实现方案** #### **1. Helm 部署 Loki Stack** 在 `values.yaml` 中启用持久化(参考引用[1][^1]): ```yaml loki: persistence: enabled: true storageClassName: "nfs-client" # 替换为实际存储类 size: 100Gi # 存储容量 config: storage_config: aws: # 示例:使用 S3 s3: https://s3.amazonaws.com bucketnames: my-loki-bucket secret_access_key: ${AWS_SECRET_ACCESS_KEY} access_key_id: ${AWS_ACCESS_KEY_ID} ``` #### **2. 关键参数说明** | **参数** | **说明** | |-------------------------------|----------------------------------------------------------| | `persistence.enabled=true` | 启用 PVC 持久化存储 | | `storageClassName` | 必须与集群中已存在的 StorageClass 匹配(如 NFS、云存储) | | `size` | 存储卷容量(需提前确认存储资源可用性) | | `storage_config` | 若需对接对象存储,在此配置认证信息 | #### **3. 生产环境建议方案** ```yaml # values.yaml 进阶配置 loki: persistence: enabled: true storageClassName: "gp2" # AWS EBS 存储类 size: 500Gi accessModes: ReadWriteOnce # 访问模式 config: schema_config: configs: - from: 2023-01-01 store: boltdb-shipper # 索引存储 object_store: aws # 对象存储类型 schema: v11 storage_config: aws: s3: s3://us-east-1.amazonaws.com bucketnames: loki-data-prod s3forcepathstyle: true boltdb_shipper: shared_store: s3 ``` --- ### **验证持久化配置** 1. **检查 PVC 状态** ```bash kubectl get pvc -n loki # 预期输出 STATUS 为 Bound ``` 2. **查看 Pod 挂载** ```bash kubectl describe pod loki-0 -n loki | grep "Mounts" # 应显示持久卷挂载点 (如 /var/loki) ``` --- ### **注意事项** 1. **存储类一致性** 确保 `storageClassName` 在集群中已存在(通过 `kubectl get sc` 查看)。 2. **多行日志处理**(引用[1][^1]) 需在采集端(如 Promtail)配置 `multiline` 阶段,确保日志完整性。 3. **高可用方案** 生产环境建议部署多副本 Loki: ```yaml loki: replicas: 3 persistence: enabled: true ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值