Alloy+Loki+Minio+Grafana云原生K8S日志收集方案

一、为什么需要?

如今 Kubernetes 已深度融入企业云原生架构,从中小团队的微服务部署到大型企业的多集群管理,都依赖其实现容器编排与资源调度。但随着业务迭代加速,集群节点从数台扩容至数百台、容器实例秒级启停成为常态,日志监控逐渐沦为运维 "绊脚石"------ 业务故障时,运维人员常陷入 "日志找不到、找不全、查不快" 的困境。

传统日志方案在此场景下短板尽显:采集工具多为静态配置,容器销毁后日志链路直接中断,易丢失关键报错信息;且采集组件占用 CPU、内存过高,在业务高峰期常与应用争抢资源,导致服务响应延迟。

为此,Alloy+Loki+Grafana 方案应运而生:Alloy 轻量解决采集问题,Loki 按需索引降存储成本,Grafana 打通全链路可观测性。后续将从架构、优势、实践解析其为何成优选。

应有的架构模式

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

二、为什么选择Loki架构?

Loki的架构优势

相较于传统的ELFK日志收集方案,Loki架构的优势主要体现在:

  1. 资源消耗低。

  2. 灵活性强-云原生。

  3. 运维成本低。

  4. 搜索速度快。

当然,因为今天探讨的只针对与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

访问:www.mygrafana.com

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 的边缘存储节点,进一步覆盖边缘场景的日志监控需求,成为云原生全场景下的日志解决方案优选。

相关推荐
会飞的小蛮猪10 小时前
K8s-1.29.2二进制安装-第一章
云原生·容器·kubernetes
平行云15 小时前
实时云渲染支持在网页上运行UE5开发的3A大作Lyra项目
unity·云原生·ue5·webgl·虚拟现实·实时云渲染·像素流送
阿里云云原生16 小时前
AI 原生落地成果获认可,阿里云云原生多项案例入选信通院「AI 云」典型示范
云原生
阿里云云原生17 小时前
阿里云可观测 2025 年 11 月产品动态
阿里云·云原生·云计算·可观测
Empty_77717 小时前
K8S-网络原理
网络·容器·kubernetes
永不停歇的蜗牛17 小时前
K8S之创建cm指令create和 apply的区别
java·容器·kubernetes
java_logo17 小时前
Transmission Docker 容器化部署指南
运维·docker·容器·kubernetes·apache·rocketmq·transmission
一周困⁸天.19 小时前
K8S-网络组件 Calico
网络·容器·kubernetes
IT_mingY20 小时前
k8S网络概述——详细理论知识
网络·容器·kubernetes