一、为什么需要?
如今 Kubernetes 已深度融入企业云原生架构,从中小团队的微服务部署到大型企业的多集群管理,都依赖其实现容器编排与资源调度。但随着业务迭代加速,集群节点从数台扩容至数百台、容器实例秒级启停成为常态,日志监控逐渐沦为运维 "绊脚石"------ 业务故障时,运维人员常陷入 "日志找不到、找不全、查不快" 的困境。
传统日志方案在此场景下短板尽显:采集工具多为静态配置,容器销毁后日志链路直接中断,易丢失关键报错信息;且采集组件占用 CPU、内存过高,在业务高峰期常与应用争抢资源,导致服务响应延迟。
为此,Alloy+Loki+Grafana 方案应运而生:Alloy 轻量解决采集问题,Loki 按需索引降存储成本,Grafana 打通全链路可观测性。后续将从架构、优势、实践解析其为何成优选。
应有的架构模式

每个节点有一个agent端去收集对应pod服务的日志,然后将收集的日志做日志过滤、格式化、打标签(比如关联 Pod/Node 的 K8S 元数据) 再写入 Storage下,通过GUI支持的数据源将收集到的日志以图形化的方式展示给用户查看与检索。
二、为什么选择Loki架构?
Loki的架构优势

相较于传统的ELFK日志收集方案,Loki架构的优势主要体现在:
资源消耗低。
灵活性强-云原生。
运维成本低。
搜索速度快。
当然,因为今天探讨的只针对与K8S云原生环境来说,Loki具备的这些优势明显,如果我们是一个特别大的数据中心,里面有上千台服务器运行,随便拿出一台64GB+32核心机器去做日志收集的Agent端,此场景下无论是ELFK架构还是ALG架构,那这点资源消耗对整个数据中心来说基本可以忽略不记;所以针对于不同的环境我们可以采用适合他的解决方案。
| 对比维度 | ELFK 架构(Elasticsearch+Logstash/Filebeat+Kibana) | Loki 架构(Loki+Alloy/Promtail+Grafana) |
|---|---|---|
| 资源开销 | 依赖 Elasticsearch 全文索引,K8S 集群中 CPU / 内存占用高,易与业务 Pod 抢资源 | 仅索引 K8S 元数据(Pod/Namespace 等标签),日志内容压缩存储,资源占用为 ELFK 的 1/3~1/5 |
| 动态 Pod 适配 | 需手动调整索引模板匹配 Pod 标签,Pod 启停时易出现日志关联失效、索引膨胀 | 自动抓取 K8S 元数据,日志天然关联 Pod 生命周期,无需额外配置即可适配动态变化 |
| 运维成本 | 组件多(需维护 ES 集群、索引生命周期),K8S 中部署调优门槛高 | 单二进制 / 简单集群部署,配合 Grafana 可视化配置,运维成本仅为 ELFK 的 1/2 |
| 存储成本 | 全文索引 + 非压缩存储,K8S 大规模日志场景下存储成本是 Loki 的 3~10 倍 | 日志内容压缩块存储,支持对象存储(S3 等),长期存储成本显著更低 |
| 日志检索逻辑 | 全文检索(资源消耗大),需提前定义字段映射 | 先标签过滤(缩小范围)再全文检索,兼顾 K8S 维度的精准定位与内容查询 |
为什么选择Alloy?

三、Loki的架构搭建
此次实验环境为测试环境,一些资源分配与副本管理请结合自己的环境进行分配与调度。
Loki不提供内置存储引擎,依赖外部对象存储持久化日志内容块与索引(现代版本),自身专注于日志接收、流式组织、轻量级索引构建及查询处理,不直接管理磁盘文件。
3.1 K8S部署MinIO对象存储
编写minio-dev.yaml资源清单文件
bash
# 1. Namespace - 资源隔离
apiVersion: v1
kind: Namespace
metadata:
name: minio
labels:
name: minio
app: minio
---
# 2. Secret - 访问凭证
apiVersion: v1
kind: Secret
metadata:
name: minio-credentials
namespace: minio
type: Opaque
data:
# 示例凭证,请在生产环境中替换为强密码
accesskey: bWluaW9hZG1pbg== # minioadmin
secretkey: bWluaW9hZG1pbnBhc3N3b3Jk # minioadminpassword
---
# 3. Deployment - 主应用部署
apiVersion: apps/v1
kind: Deployment
metadata:
name: minio
namespace: minio
labels:
app: minio
spec:
replicas: 2
selector:
matchLabels:
app: minio
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1
maxUnavailable: 0
template:
metadata:
labels:
app: minio
spec:
terminationGracePeriodSeconds: 30
containers:
- name: minio
image: quay.io/minio/minio:latest
imagePullPolicy: IfNotPresent
command:
- /bin/bash
- -c
args:
- minio server /data --console-address ":9001"
env:
- name: MINIO_ROOT_USER
valueFrom:
secretKeyRef:
name: minio-credentials
key: accesskey
- name: MINIO_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: minio-credentials
key: secretkey
ports:
- containerPort: 9000
name: api
protocol: TCP
- containerPort: 9001
name: console
protocol: TCP
resources:
requests:
cpu: "500m"
memory: "1Gi"
limits:
cpu: "1"
memory: "2Gi"
volumeMounts:
- name: data
mountPath: /data
livenessProbe:
httpGet:
path: /minio/health/live
port: 9000
initialDelaySeconds: 60
periodSeconds: 20
timeoutSeconds: 5
failureThreshold: 3
readinessProbe:
httpGet:
path: /minio/health/ready
port: 9000
initialDelaySeconds: 30
periodSeconds: 10
timeoutSeconds: 3
failureThreshold: 3
volumes:
- name: data
persistentVolumeClaim:
claimName: minio-data
---
# 4. PersistentVolumeClaim - 数据持久化
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
name: minio-data
namespace: minio
spec:
accessModes:
- ReadWriteOnce
resources:
requests:
storage: 10Gi
storageClassName: nfs-csi
---
# 5. Service - 访问服务
apiVersion: v1
kind: Service
metadata:
name: minio-service
namespace: minio
labels:
app: minio
spec:
type: ClusterIP
ports:
- port: 9000
name: api
targetPort: 9000
protocol: TCP
- port: 9001
name: console
targetPort: 9001
protocol: TCP
selector:
app: minio
---
# 6. Ingress - 外部访问
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: minio-ingress
namespace: minio
spec:
ingressClassName: nginx
rules:
- host: console.minio.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: minio-service
port:
number: 9001
bash
# 创建资源
[root@k8s-master ~]# kubectl apply -f minio-dev.yaml
# 查看资源
[root@k8s-master ~]# kubectl get po,svc,ingress -n minio
NAME READY STATUS RESTARTS AGE
pod/minio-6c4f955867-kptz7 1/1 Running 1 (74m ago) 19h
pod/minio-6c4f955867-xdj4g 1/1 Running 1 (74m ago) 19h
NAME TYPE CLUSTER-IP EXTERNAL-IP PORT(S) AGE
service/minio-service ClusterIP 10.110.16.95 <none> 9000/TCP,9001/TCP 19h
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress.networking.k8s.io/minio-ingress nginx console.minio.com 10.0.0.150 80 19h
[root@k8s-master ~]#
3.1.1 访问minio
Windows域名映射
10.0.0.150 console.minio.com
用户名密码在资源清单写了。
用户名:minioadmin
密 码:minioadminpassword


3.1.2 创建Bucket
因为后续Loki的存储要借助minio,所以我们这里先给Loki创建一个桶
选择Bucket------>点击右上Create Bucket ------> 填写你的桶名称然后创建即可。

创建出来应该为0,我这里是已经跑通了一遍流程,存储的数据。

3.2 Helm部署Alloy
3.2.1 创建名称空间
bash
[root@k8s-master ~]# kubectl create ns monitoring
3.2.2 配置GrafanaHelm仓库
bash
[root@k8s-master ~]# helm repo add grafana https://grafana.github.io/helm-charts
bash
# 更新 Helm 仓库索引(拉取最新的 Chart 列表)
[root@k8s-master ~]# helm repo update
# 查看HELM仓库
[root@k8s-master ~]# helm repo list
NAME URL
bitnami https://helm-charts.itboon.top/bitnami
ingress https://kubernetes.github.io/ingress-nginx
harbor https://helm.goharbor.io
grafana https://grafana.github.io/helm-charts
[root@k8s-master ~]#
3.2.3 拉取Chart包
bash
[root@k8s-master ~]# helm search repo |grep -E 'grafana/grafana|grafana/alloy|grafana/loki'
grafana/alloy 1.5.0 v1.12.0 Grafana Alloy
grafana/alloy-crd 1.0.0 1.0.0 A Helm chart the Alloy CustomResourceDefinition...
grafana/alloy-operator 0.3.14 1.5.0 A Helm chart the Alloy Operator, a project to i...
grafana/grafana 10.3.0 12.3.0 The leading tool for querying and visualizing t...
grafana/grafana-agent 0.44.2 v0.44.2 Grafana Agent
grafana/grafana-agent-operator 0.5.2 0.44.2 A Helm chart for Grafana Agent Operator
grafana/grafana-cloud-onboarding 0.4.2 1.16.0 A Helm chart for Grafana Cloud Onboarding on Ku...
grafana/grafana-mcp 0.2.2 0.7.9 MCP server for Grafana.
grafana/grafana-operator v5.20.0 v5.20.0 Helm chart for the Grafana Operator
grafana/grafana-sampling 1.1.7 v1.11.3 A Helm chart for a layered OTLP tail sampling a...
grafana/loki 6.48.0 3.6.2 Helm chart for Grafana Loki and Grafana Enterpr...
grafana/loki-canary 0.14.1 2.9.1 Helm chart for Grafana Loki Canary
grafana/loki-distributed 0.80.6 2.9.13 Helm chart for Grafana Loki in microservices mode
grafana/loki-simple-scalable 1.8.11 2.6.1 Helm chart for Grafana Loki in simple, scalable...
grafana/loki-stack 2.10.3 v2.9.3 Loki: like Prometheus, but for logs.
bash
[root@k8s-master ~]# helm pull grafana/grafana --version 1.5.0
[root@k8s-master ~]# helm pull grafana/loki --version 6.48.0
[root@k8s-master ~]# helm pull grafana/grafana --version 10.3.0
# 查看并解压
[root@k8s-master ~]# ll |grep tgz
-rw-r--r-- 1 root root 27986 Dec 11 15:52 alloy-1.5.0.tgz
-rw-r--r-- 1 root root 49102 Dec 11 15:52 grafana-10.3.0.tgz
-rw-r--r-- 1 root root 167118 Dec 11 15:20 loki-6.48.0.tgz
[root@k8s-master ~]# tar xf alloy-1.5.0.tgz && tar xf grafana-10.3.0.tgz && tar xf loki-6.48.0.tgz
[root@k8s-master ~]# ll
total 272
drwxr-xr-x 6 root root 4096 Dec 11 17:10 alloy/
drwxr-xr-x 5 root root 4096 Dec 11 16:04 grafana/
drwxr-xr-x 8 root root 4096 Dec 11 16:18 loki/
3.2.4 HELM部署Alloy
编写values-alloy.yaml,去动态调整的chart包
bash
alloy:
stabilityLevel: "public-preview"
enableReporting: false
logging:
level: info
resources:
requests:
requests:
cpu: 100m
memory: 128Mi
limits:
cpu: 500m
memory: 384Mi
configMap:
create: true
content: |
discovery.kubernetes "pods" {
role = "pod"
}
discovery.relabel "logs" {
targets = discovery.kubernetes.pods.targets
rule {
source_labels = ["__meta_kubernetes_namespace"]
target_label = "namespace"
}
rule {
source_labels = ["__meta_kubernetes_pod_name"]
target_label = "pod"
}
rule {
source_labels = ["__meta_kubernetes_pod_container_name"]
target_label = "container"
}
rule {
source_labels = ["__meta_kubernetes_pod_node_name"]
target_label = "node_name"
}
rule {
source_labels = ["__meta_kubernetes_pod_controller_name"]
target_label = "workload"
}
rule {
source_labels = ["__meta_kubernetes_pod_controller_kind"]
target_label = "workload_kind"
}
rule {
source_labels = ["__meta_kubernetes_pod_uid"]
target_label = "pod_uid"
}
rule {
source_labels = ["__meta_kubernetes_pod_label_(.+)"]
regex = "(.+)"
target_label = "$1"
}
}
loki.source.kubernetes "pod_logs" {
targets = discovery.relabel.logs.output
forward_to = [loki.write.local.receiver]
}
loki.write "local" {
endpoint {
url = "http://loki.monitoring.svc.cluster.local:3100/loki/api/v1/push"
}
}
使用HELM部署
bash
helm install alloy ./alloy \
-n monitoring \
-f values-alloy.yaml \
--wait --timeout=1m
查看资源部署状态
bash
[root@k8s-master ~]# kubectl get po -o wide -n monitoring
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
alloy-j2sp8 2/2 Running 2 (105m ago) 17h 10.200.169.175 k8s-node2 <none> <none>
alloy-kntn4 2/2 Running 2 (105m ago) 17h 10.200.36.64 k8s-node1 <none> <none>
alloy-pffnr 2/2 Running 2 (105m ago) 17h 10.200.235.241 k8s-master <none> <none>
[root@k8s-master ~]# helm list -n monitoring
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
alloy monitoring 1 2025-12-11 17:10:44.191593257 +0800 CST deployed alloy-1.5.0 v1.12.0
Alloy的部署情况是分布在每台K8S节点,如果不是,请检查集群节点是否存在污点。
3.3 Helm部署Loki
编写values-loki.yaml,去动态调整的chart包
bash
# values-loki.yaml
loki:
commonConfig:
replication_factor: 1
storage:
type: s3
bucketNames:
chunks: loki-bucket # 必须定义,至少 chunks
ruler: loki-bucket # ruler bucket,单实例也建议定义
s3:
endpoint: http://minio-service.minio.svc.cluster.local:9000
access_key_id: minioadmin
secret_access_key: minioadminpassword
insecure: true
s3ForcePathStyle: true
schemaConfig:
configs:
- from: "2024-01-01" # 时间随便,不要填写未来的时间即可
store: tsdb
object_store: s3
schema: v13
index:
prefix: loki_index_
period: 24h
# 单实例模式资源限制(测试环境关键)
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 200m
memory: 512Mi
# 明确指定部署模式:单二进制(monolithic)
deploymentMode: SingleBinary
singleBinary:
replicas: 1
persistence:
enabled: true
storageClass: nfs-csi
size: 20Gi # 索引和本地缓存用
# 关闭其他模式,避免冲突
read:
replicas: 0
write:
replicas: 0
backend:
replicas: 0
# 不安装内置 MinIO
minio:
enabled: false
alloy:
enabled: false
3.3.1 HELM部署Loki
bash
helm install loki ./loki \
-n monitoring \
-f values-loki.yaml \
--set loki.auth_enabled=false \
--set deploymentMode=SingleBinary \
--set chunksCache.enabled=false \
--set resultsCache.enabled=false \
--set gateway.enabled=false \
--set singleBinary.replicas=1
3.3.2 查看资源状态
bash
[root@k8s-master ~]# kubectl get po -o wide -n monitoring
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
alloy-j2sp8 2/2 Running 2 (112m ago) 17h 10.200.169.175 k8s-node2 <none> <none>
alloy-kntn4 2/2 Running 2 (112m ago) 17h 10.200.36.64 k8s-node1 <none> <none>
alloy-pffnr 2/2 Running 2 (113m ago) 17h 10.200.235.241 k8s-master <none> <none>
loki-0 2/2 Running 2 (113m ago) 18h 10.200.235.242 k8s-master <none> <none>
loki-canary-4f685 1/1 Running 1 (112m ago) 18h 10.200.169.162 k8s-node2 <none> <none>
loki-canary-hd7t2 1/1 Running 1 (112m ago) 18h 10.200.36.70 k8s-node1 <none> <none>
loki-canary-pjcl9 1/1 Running 1 (113m ago) 18h 10.200.235.243 k8s-master <none> <none>
[root@k8s-master ~]# helm list -n monitoring
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
alloy monitoring 1 2025-12-11 17:10:44.191593257 +0800 CST deployed alloy-1.5.0 v1.12.0
loki monitoring 1 2025-12-11 16:18:37.886230033 +0800 CST deployed loki-6.48.0 3.6.2
3.4 Helm部署Grafana
3.4.1 Helm部署Grafana
使用已经存在的SC动态存储去做持久化存储
bash
[root@k8s-master ~]# kubectl get sc
NAME PROVISIONER RECLAIMPOLICY VOLUMEBINDINGMODE ALLOWVOLUMEEXPANSION AGE
nfs-csi nfs.csi.k8s.io Delete Immediate true 4d
bash
helm install grafana ./grafana \
-n monitoring \
--set resources.requests.cpu=100m \
--set resources.requests.memory=256Mi \
--set resources.limits.memory=512Mi \
--set persistence.enabled=true \
--set persistence.storageClassName=nfs-csi \
--set persistence.size=5Gi \
--set service.type=ClusterIP
3.4.2 查看资源
bash
[root@k8s-master ~]# kubectl get po -o wide -n monitoring
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
alloy-j2sp8 2/2 Running 2 (128m ago) 17h 10.200.169.175 k8s-node2 <none> <none>
alloy-kntn4 2/2 Running 2 (128m ago) 17h 10.200.36.64 k8s-node1 <none> <none>
alloy-pffnr 2/2 Running 2 (128m ago) 17h 10.200.235.241 k8s-master <none> <none>
grafana-858cf85796-znkrr 1/1 Running 1 (128m ago) 18h 10.200.235.239 k8s-master <none> <none>
loki-0 2/2 Running 2 (128m ago) 18h 10.200.235.242 k8s-master <none> <none>
loki-canary-4f685 1/1 Running 1 (128m ago) 18h 10.200.169.162 k8s-node2 <none> <none>
loki-canary-hd7t2 1/1 Running 1 (128m ago) 18h 10.200.36.70 k8s-node1 <none> <none>
loki-canary-pjcl9 1/1 Running 1 (128m ago) 18h 10.200.235.243 k8s-master <none> <none>
[root@k8s-master ~]# helm list -n monitoring
NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION
alloy monitoring 1 2025-12-11 17:10:44.191593257 +0800 CST deployed alloy-1.5.0 v1.12.0
grafana monitoring 1 2025-12-11 16:04:23.920347814 +0800 CST deployed grafana-10.3.0 12.3.0
loki monitoring 1 2025-12-11 16:18:37.886230033 +0800 CST deployed loki-6.48.0 3.6.2
3.5 使用Ingress代理访问
编写ingress-http.yaml资源清单
bash
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: ingress-http-grafana
namespace: monitoring
spec:
ingressClassName: nginx
rules:
- host: www.mygrafana.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: grafana
port:
number: 80
Windows做域名映射
bash
10.0.0.150 www.mygrafana.com
bash
[root@k8s-master ~]# kubectl get ingress -n monitoring
NAME CLASS HOSTS ADDRESS PORTS AGE
ingress-http-grafana nginx www.mygrafana.com 10.0.0.150 80 18h
3.6 使用Grafana
3.6.1 获取用户名密码
bash
[root@k8s-master ~]# kubectl get secrets -n monitoring
NAME TYPE DATA AGE
grafana Opaque 3 18h
minio-credentials Opaque 2 19h
sh.helm.release.v1.alloy.v1 helm.sh/release.v1 1 17h
sh.helm.release.v1.grafana.v1 helm.sh/release.v1 1 18h
sh.helm.release.v1.loki.v1 helm.sh/release.v1 1 18h
[root@k8s-master ~]# kubectl get secrets grafana -n monitoring -o yaml
apiVersion: v1
data:
admin-password: dVo4RXNhVDVYYmlLa3JmVkxMbnk3V3FiWGhtWlBuVW5PMW5qTTZ0Ug==
admin-user: YWRtaW4=
ldap-toml: ""
kind: Secret
metadata:
annotations:
meta.helm.sh/release-name: grafana
meta.helm.sh/release-namespace: monitoring
creationTimestamp: "2025-12-11T08:04:24Z"
labels:
app.kubernetes.io/component: admin-secret
app.kubernetes.io/instance: grafana
app.kubernetes.io/managed-by: Helm
app.kubernetes.io/name: grafana
app.kubernetes.io/version: 12.3.0
helm.sh/chart: grafana-10.3.0
name: grafana
namespace: monitoring
resourceVersion: "276157"
uid: 5ab6256b-f9bc-4c04-8a03-1ace11733cf2
type: Opaque
可以看到用户名和密码加密处理,所以需要base64解密
bash
[root@k8s-master ~]# echo 'YWRtaW4=' |base64 -d ;echo
admin
[root@k8s-master ~]# echo 'dVo4RXNhVDVYYmlLa3JmVkxMbnk3V3FiWGhtWlBuVW5PMW5qTTZ0Ug==' |base64 -d ;echo
uZ8EsaT5XbiKkrfVLLny7WqbXhmZPnUnO1njM6tR
然后点击登录即可

3.6.2 修改密码


3.6.3 配置Loki数据源



3.6.4 Explore查看日志
创建点测试案例
bash
[root@k8s-master ~]# kubectl run c1 --image=myweb:v1
pod/c1 created
bash
[root@k8s-master ~]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
c1 1/1 Running 0 10s 10.200.235.245 k8s-master <none> <none>
[root@k8s-master ~]# while true
> do
> curl 10.200.235.245
> sleep 1.5
> done
vamos | This version is v1 | v111111
vamos | This version is v1 | v111111


3.6.5 支持实时查看

3.6.6 检索字段
最简单的检索ctrl+f直接在页面搜索......

官方推荐
在「Label Filters」下方的「Line contains」模块中,「Text to find」输入框就是用来检索日志内容里的字段 / 关键词的。比如你想找日志里包含 "error" 的内容,直接在这个输入框里填 "error" 即可。

如果需要更复杂的字段检索(比如精确匹配、正则、提取字段),可以点击界面右上角的「Code」标签(当前是「Builder」模式),直接写LogQL 查询语句。
比如:
bash
{pod="c1"} |= "你要找的字段" # 包含某个字段
{pod="c1"} |~ "正则匹配的字段" # 正则匹配字段
{pod="c1"} | json | .status # 解析JSON日志并提取status字段
3.7 查看minio存储

总结
当然Grafana官方的精髓总结这套架构 "Like Prometheus,But for Logs!"
所以这就说明了,这个Loki也支持altermanager告警功能,如果日志出现了XXXERROR字段就可以去出发告警。
"采集 - 处理 - 存储 - 可视化" 的全链路闭环:
- Alloy(采集层) 解决了 K8S 动态环境的日志接入难题 ------ 自动抓取 Pod/Namespace 等元数据、轻量部署不抢占业务资源,让日志采集从 "被动适配" 变为 "主动贴合" K8S 生命周期;
- Loki(处理层) 承担 "日志中枢" 角色 ------ 仅对元数据建立索引、将原始日志分片处理,既避免了传统全文索引的资源浪费,又能通过标签快速定位日志流,完美平衡查询效率与成本;
- Minio(存储层) 为方案提供云原生存储底座 ------ 以对象存储的无限扩展性承接 Loki 的日志分片,支持多副本容灾与冷热分层存储,既适配 K8S 集群扩容的日志量增长,又降低长期存储成本;
- Grafana(可视化层) 打通可观测性最后一公里 ------ 无需额外开发,即可联动 Loki 的日志数据与 Prometheus 的监控指标,让运维人员在同一面板完成 "日志查询 - 故障定位 - 指标验证",告别工具切换的低效。
未来,随着 K8S 边缘部署、Serverless 容器的普及,这套方案还可通过 Alloy 的边缘采集能力、Minio 的边缘存储节点,进一步覆盖边缘场景的日志监控需求,成为云原生全场景下的日志解决方案优选。