Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VictoriaLogs初体验

VictoriaLogs初体验

作者头像
我是阳明
发布于 2023-08-21 07:29:23
发布于 2023-08-21 07:29:23
1.3K00
代码可运行
举报
文章被收录于专栏:k8s技术圈k8s技术圈
运行总次数:0
代码可运行

前面我们介绍了 VictoriaMetrics 发布了其日志解决方案 VictoriaLogs,只是简单介绍了其特性,但是并没有介绍其使用方法,本文我们就来体验下 VictoriaLogs

VictoriaLogs 是一个日志存储和查询的后端,并没有提供直接的日志采集功能,而是兼容其他常见的日志采集工具,比如 fluentbitfilebeatlogstash 等,这里我们使用 fluentbit 来采集日志。

日志采集

比如现在我们需要采集 Kubernetes 集群的日志,然后将其存入到 VictoriaLogs 中去,我们这里的环境采用的是 containerd 这种容器运行时,所以在使用的时候需要和 docker 进行区分,这里我们使用 fluentbit 来采集日志,同样这里我们也将其部署到我们的 Kubernetes 集群中,完整的部署文件如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
apiVersion: v1
kind: ConfigMap
metadata:
  name: fluent-bit-config
  namespace: monitor
  labels:
    k8s-app: fluentbit-logging
    kubernetes.io/cluster-service: "true"
data:
  fluent-bit.conf: |
    [SERVICE]
        Flush         1
        Log_Level     info
        Daemon        off
        Parsers_File  parsers.conf
        HTTP_Server   On
        HTTP_Listen   0.0.0.0
        HTTP_Port     2020
    @INCLUDE input-kubernetes.conf
    @INCLUDE filter-kubernetes.conf
    @INCLUDE output.conf

  output.conf: |
    # [OUTPUT]
    #     Name            stdout
    #     Match           kube.var.log.containers.*.*
    [OUTPUT]
        Name http
        Match kube.var.log.containers.*.*
        host victorialogs
        port 9428
        compress gzip
        uri /insert/jsonline?_stream_fields=stream&_msg_field=message&_time_field=time
        format json_lines
        json_date_format iso8601
        header AccountID 0
        header ProjectID 0

  input-kubernetes.conf: |
    [INPUT]
        Name              tail
        Tag               kube.*
        Path              /var/log/containers/*.log
        Parser            cri
        DB                /var/log/flb_kube.db
        Mem_Buf_Limit     5MB
        Skip_Long_Lines   On
        Refresh_Interval  10

  filter-kubernetes.conf: |
    [FILTER]
        Name                kubernetes
        Match               kube.*
        Kube_URL            https://kubernetes.default.svc:443
        Kube_CA_File        /var/run/secrets/kubernetes.io/serviceaccount/ca.crt
        Kube_Token_File     /var/run/secrets/kubernetes.io/serviceaccount/token
        Kube_Tag_Prefix     kube.var.log.containers.
        Merge_Log           On
        Merge_Log_Trim      On
        Keep_Log            Off
        K8S-Logging.Parser  On
        K8S-Logging.Exclude Off
        Annotations         Off
        Labels              On

    [FILTER]
        Name          nest
        Match         kube.*
        Operation     lift
        Nested_under  kubernetes
        Add_prefix    kubernetes_

    [FILTER]
        Name          nest
        Match         kube.*
        Operation     lift
        Nested_under  kubernetes_labels
        Add_prefix    kubernetes_labels_

  parsers.conf: |
    [PARSER]
        Name        json
        Format      json
        Time_Key    time
        Time_Format %d/%b/%Y:%H:%M:%S %z
        Time_Keep   Off

    [PARSER]
        Name docker
        Format json
        Time_Key time
        Time_Format %Y-%m-%d %H:%M:%S
        Time_Keep Off

    [PARSER]
        Name        cri
        Format      regex
        Regex       ^(?<time>[^ ]+) (?<stream>stdout|stderr) (?<logtag>[^ ]*) (?<log>.*)$
        Time_Key    time
        Time_Format %Y-%m-%d %H:%M:%S

---
# fluentbit rbac
apiVersion: v1
kind: ServiceAccount
metadata:
  name: fluentbit
  namespace: monitor
  labels:
    k8s-app: fluentbit-logging
    kubernetes.io/cluster-service: "true"
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: fluentbit
  namespace: monitor
  labels:
    k8s-app: fluentbit-logging
    kubernetes.io/cluster-service: "true"
rules:
  - apiGroups: [""]
    resources:
      - namespaces
      - pods
      - pods/log
    verbs: ["get", "list", "watch"]
  - apiGroups: ["extensions", "apps"]
    resources:
      - deployments
      - replicasets
    verbs: ["get", "list", "watch"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: fluentbit
  namespace: monitor
  labels:
    k8s-app: fluentbit-logging
    kubernetes.io/cluster-service: "true"
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: fluentbit
subjects:
  - kind: ServiceAccount
    name: fluentbit
    namespace: monitor
---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: fluentbit
  namespace: monitor
  labels:
    k8s-app: fluentbit-logging
    kubernetes.io/cluster-service: "true"
spec:
  selector:
    matchLabels:
      k8s-app: fluentbit-logging
  template:
    metadata:
      labels:
        k8s-app: fluentbit-logging
    spec:
      serviceAccount: fluentbit
      serviceAccountName: fluentbit
      tolerations:
        - key: node-role.kubernetes.io/control-plane
          operator: Exists
          effect: NoSchedule
      containers:
        - name: fluentbit
          image: cr.fluentbit.io/fluent/fluent-bit:2.1.4
          imagePullPolicy: Always
          ports:
            - containerPort: 2020
          volumeMounts:
            - name: varlog
              mountPath: /var/log
            - name: fluent-bit-config
              mountPath: /fluent-bit/etc/fluent-bit.conf
              subPath: fluent-bit.conf
            - name: fluent-bit-config
              mountPath: /fluent-bit/etc/input-kubernetes.conf
              subPath: input-kubernetes.conf
            - name: fluent-bit-config
              mountPath: /fluent-bit/etc/filter-kubernetes.conf
              subPath: filter-kubernetes.conf
            - name: fluent-bit-config
              mountPath: /fluent-bit/etc/output.conf
              subPath: output.conf
      volumes:
        - name: varlog
          hostPath:
            path: /var/log
        - name: fluent-bit-config
          configMap:
            name: fluent-bit-config

首先在 ConfigMap 中我们配置了要采集的日志,日志源路径为 /var/log/containers/*.log,这是默认的容器日志路径,我们可以在节点上去查看,但是需要注意的是该路径下面的日志只是一个软连接,真正的日志路径在 /var/log/pods 下面,所以我们在 fluentbit 的 pod 中需要挂载宿主机/var/log 目录,只挂载 /var/log/containers/ 目录则无法获取到真正的日志。

此外我们还为日志打上了 kube.* 标签,这是为了方便后续的日志过滤,我们可以根据标签来过滤日志进行相应的处理。

日志经过各种处理后,最重要的就是 OUTPUT 输出源的配置,在调试阶段我们可以先配置一个 stdout 的输出源。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[OUTPUT]
    Name            stdout
    Match           kube.var.log.containers.*.*

这样我们就可以通过 fluentbit 的 pod 日志来查看日志是否被采集到了。

如果采集到了,那么我们就可以配置其他的输出源了,比如 elasticsearchkafkaredis 等等,当然我们这里是要将日志输出到 VictoriaLogs 中,所以我们需要配置 VictoriaLogs 的输出源,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
[OUTPUT]
    Name http
    Match kube.var.log.containers.*.*
    host victorialogs
    port 9428
    compress gzip
    uri /insert/jsonline?_stream_fields=stream&_msg_field=message&_time_field=time
    format json_lines
    json_date_format iso8601
    header AccountID 0
    header ProjectID 0

这里我们配置了 VictoriaLogshostport,其中最重要的是 uri 参数,这个参数是 VictoriaLogs 的插入接口 /insert/jsonline?_stream_fields=stream&_msg_field=message&,这里我们需要注意的是 uri 参数中的 _stream_fields_msg_field_time_field 这三个参数,这三个参数是 VictoriaLogs 的插入接口所必须的,其中 _stream_fields 是指定日志流的字段,这里我们指定为 stream_msg_field 是指定日志内容的字段,这里我们指定为 message_time_field 是指定日志时间的字段,这里我们指定为 time,具体要取什么字段需要根据我们的日志来决定,这样我们就可以将日志采集到 VictoriaLogs 中了。当然还有两个字段 AccountIDProjectID,可以用来区分不同的租户,这里我们暂时不用,所以设置为 0

直接部署上面的资源清单即可,部署完成后我们可以查看 fluentbit 的 pod 日志,如果日志中没有报错,那么就说明我们的 fluentbit 部署成功了,接下来就可以部署 VictoriaLogs 了。

安装 VictoriaLogs

由于 VictoriaLogs 目前预览版本仅仅是一个单节点的应用,所以我们只需要部署一个 Deployment 即可,如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# deploy victorialogs
apiVersion: apps/v1
kind: Deployment
metadata:
  name: victorialogs
  namespace: monitor
  labels:
    app: victorialogs
spec:
  selector:
    matchLabels:
      app: victorialogs
  template:
    metadata:
      labels:
        app: victorialogs
    spec:
      containers:
        - name: victorialogs
          image: victoriametrics/victoria-logs:latest
          # command:
          #   - -storageDataPath=/vlogs  # 指定日志存储路径
          ports:
            - containerPort: 9428
          volumeMounts:
            - name: logs
              mountPath: victoria-logs-data # 默认日志存储路径
      volumes:
        - name: logs
          persistentVolumeClaim:
            claimName: victorialogs-pvc
---
# deploy victorialogs service
apiVersion: v1
kind: Service
metadata:
  name: victorialogs
  namespace: monitor
  labels:
    app: victorialogs
spec:
  ports:
    - port: 9428
      targetPort: 9428
  type: NodePort
  selector:
    app: victorialogs
---
# deploy victorialogs pvc
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: victorialogs-pvc
  namespace: monitor
spec:
  accessModes:
    - ReadWriteOnce
  storageClassName: cfsauto
  resources:
    requests:
      storage: 10Gi

这里我们需要注意的是 VictoriaLogs 的存储路径,VictoriaLogs 默认的存储路径是 victoria-logs-data,可以通过参数 -storageDataPath 进行指定,如果想要持久化日志数据,则需要将该路径进行挂载,比如我们这里就指定了一个 PVC 进行关联。另外由于上面 fluentbit 我们输出到了 VictoriaLogs 的 host 地址为 victorialogs,所以我们还需要创建名为 victorialogs 的 Service 对象将其暴露出去,并且要和 fluentbit 在同一个命名空间下,此外 VictoriaLogs 本身还自带一个 Web 界面,这里我们通过 NodePort 来对外进行暴露,这样我们就可以通过 NodeIP:NodePort 来访问 VictoriaLogs 了。

同样直接部署上面的资源清单即可,部署完成后我们可以查看 VictoriaLogs 的 pod 日志,如果日志中没有报错,那么就说明我们的 VictoriaLogs 部署成功了。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
$ kubectl get pods -n monitor
NAME                            READY   STATUS    RESTARTS   AGE
fluentbit-6rmp8                 1/1     Running   0          28m
fluentbit-bbgxb                 1/1     Running   0          28m
fluentbit-xwrzs                 1/1     Running   0          28m
victorialogs-5856895b4c-mcffw   1/1     Running   0          41m
$ kubectl get svc -n monitor
NAME           TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)             AGE
victorialogs   NodePort    10.101.31.122   <none>        9428:30694/TCP      48m

部署完成后我们就可以通过 NodeIP:30694 来访问 VictoriaLogs 如下所示:

点击 select/vmui 就可以跳转到 VictoriaLogs 的 Logs Explorer 界面了,如下所示:

然后我们就可以根据自己的需求来进行日志的查询了,比如查询日志中包含 alog 关键字的日志:

此外还有 Table 和 JSON 两种展示模式:

日志查询使用的是 VictoriaLogs 的 LogsQL 语法,具体语法可以参考官方文档: https://docs.victoriametrics.com/VictoriaLogs/LogsQL.html

目前 VictoriaLogs 还处于预览版本,所以还有很多功能没有完善,只有简单的日志查询功能,比如目前还不支持日志的告警,可视化图表等等功能,但是 VictoriaLogs 的开发者已经在开发中了,相信很快就会支持了。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2023-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 k8s技术圈 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
12-部署EFK插件
配置和安装 EFK 官方文件目录:cluster/addons/fluentd-elasticsearch $ ls *.yaml es-controller.yaml es-service.yaml fluentd-es-ds.yaml kibana-controller.yaml kibana-service.yaml efk-rbac.yaml 同样EFK服务也需要一个efk-rbac.yaml文件,配置serviceaccount为efk。 已经修改好的 yaml 文件见:EFK 配置 es
程序员同行者
2018/07/03
1.1K0
K8S集群模式下fluent-bit日志收集方案设计和实践
「随着 K8s 不断更新迭代,使用 K8s 日志系统建设的开发者,逐渐遇到了各种复杂的问题和挑战。本篇文章中结合作者使用经验,分析和设计 K8s 日志收集实践过程。」
用户5166556
2020/06/07
3.7K0
Kubernetes-基于EFK进行统一的日志管理
通过应用和系统日志可以了解Kubernetes集群内所发生的事情,对于调试问题和监视集群活动来说日志非常有用。对于大部分的应用来说,都会具有某种日志机制。因此,大多数容器引擎同样被设计成支持某种日志机制。对于容器化应用程序来说,最简单和最易接受的日志记录方法是将日志内容写入到标准输出和标准错误流。 但是,容器引擎或运行时提供的本地功能通常不足以支撑完整的日志记录解决方案。例如,如果一个容器崩溃、一个Pod被驱逐、或者一个Node死亡,应用相关者可能仍然需要访问应用程序的日志。因此,日志应该具有独立于Node、Pod或者容器的单独存储和生命周期,这个概念被称为群集级日志记录。群集级日志记录需要一个独立的后端来存储、分析和查询日志。Kubernetes本身并没有为日志数据提供原生的存储解决方案,但可以将许多现有的日志记录解决方案集成到Kubernetes集群中。在Kubernetes中,有三个层次的日志:
菲宇
2019/06/12
1.4K0
Kubernetes-基于EFK进行统一的日志管理
fluent-bit 按 pod 名生成不同索引
EFK 版本:es 7.12, fluent-bit 1.7.5, kibana 7.12
逝兮诚
2021/12/06
1.4K0
Kubernetes中部署ELK Stack日志收集平台
ELK是Elasticsearch、Logstash、Kibana三大开源框架首字母大写简称。市面上也被称为Elastic Stack。其中Elasticsearch是一个基于Lucene、分布式、通过Restful方式进行交互的近实时搜索平台框架。像类似百度、谷歌这种大数据全文搜索引擎的场景都可以使用Elasticsearch作为底层支持框架,可见Elasticsearch提供的搜索能力确实强大,市面上很多时候我们简称Elasticsearch为es。Logstash是ELK的中央数据流引擎,用于从不同目标(文件/数据存储/MQ)收集的不同格式数据,经过过滤后支持输出到不同目的地(文件/MQ/redis/elasticsearch/kafka等)。Kibana可以将elasticsearch的数据通过友好的页面展示出来,提供实时分析的功能。
没有故事的陈师傅
2021/07/21
1.9K6
Kubernetes 集群日志监控 EFK 安装
Kubernetes 集群中会编排非常多的服务,各个服务不可能保证服务一定能稳定的运行,于是每个服务都会打印出各自的日志信息方便调试。由于服务的众多,每个服务挨个查看日志显然是一件非常复杂的事情,故而日志的统一收集、整理显得尤为重要。
高楼Zee
2021/03/16
1.8K0
使用fluent bit+ClickHouse 实现K8s日志采集
Fluent bit是一个用C写成的插件式、轻量级、多平台开源日志收集工具。它允许从不同的源收集数据并发送到多个目的地。完全兼容docker和kubernetes生态环境。
灵雀云
2021/12/28
2.8K0
使用fluent bit+ClickHouse 实现K8s日志采集
K8S学习笔记之filebeat采集K8S微服务java堆栈多行日志
K8S内运行Spring Cloud微服务,根据定制容器架构要求log文件不落地,log全部输出到std管道,由基于docker的filebeat去管道采集,然后发往Kafka或者ES集群。
Jetpropelledsnake21
2019/08/23
2.5K0
云原生架构下的日志平台方案
Ford, 云原生布道师,云原生实验室(CloudnativeLab.COM)创始人 专注于云计算领域数年,目前主要从事容器云平台的建设,推进各类基础设施服务的云原生化,乐于研发效能建设、产品驱动模式探索和敏捷高效的产品研发团队打造,ServiceMesh拥护者,持续交付、敏捷实践者。
云原生实验室
2020/12/08
2.7K0
fluent-bit debug调试,采集k8s podIP
有时候调试fluent-bit的配置,达到想要的输出效果,并不是件简单的事情,以下通过debug镜像调试fluent-bit采集kubernetes Pod的IP。
我的小碗汤
2021/11/02
2K0
fluent-bit debug调试,采集k8s podIP
Fluentd 实现 Kubernetes Pod 日志收集
Fluentd 典型的部署架构需要包含两种不同角色:转发器(forwarder),聚合器(aggregator)。
后端云
2021/12/08
2.8K0
Fluentd 实现 Kubernetes Pod 日志收集
EFK日志平台部署
日志收集方案是采用 Elasticsearch、Fluentd、Filebeat 和 Kibana(EFK)技术栈。 Fluented主要用来收集k8s组件和docker容器日志,Filebeat主要用来收集应用日志,主要因为目前项目中应用日志并未全部通过stdout方式输出到docker日志驱动中,导致flunted收集日志并不全面,需要通过Filebeat来将应用日志收集到es中,再由kibana来展示。
mikelLam
2022/10/31
1.2K0
EFK日志平台部署
在 Kubernetes 上搭建 EFK 日志收集系统
上节课和大家介绍了 Kubernetes 集群中的几种日志收集方案,Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案。
我是阳明
2020/06/13
5.4K0
在 Kubernetes 上搭建 EFK 日志收集系统
Logging Operator - 优雅的云原生日志管理方案 (一)
Logging Operator是BanzaiCloud下开源的一个云原生场景下的日志采集方案。之前小白转载过崔大佬介绍的一篇文章,不过由于之前一直认为在单个k8s集群下同时管理Fluent bit和Fluentd两个服务在架构上比较臃肿,便留下了一个不适用的初步印象。后来小白在一个在多租户场景下对k8s集群的日志管理做方案时,发现将日志配置统一管理的传统方式灵活性非常的弱。通常操作者会站在一个全局的角度,尽量的让日志的配置做成模版来适配业务,久而久之模版就变得非常庞大且臃肿,对后续维护和接任者都带来了不小挑战。
云原生小白
2021/04/09
1.7K1
TKE上搭建EFK日志采集系统
需要创建一个SC,用来后续ES创建时候动态挂载PVC,在腾讯云中,如果挂载了卷,又起了多个pod,可以采用自动动态挂载PVC
聂伟星
2020/06/10
9240
Kubernetes集群监控-使用ELK实现日志监控和分析
日志对于调试问题和监视集群情况也是非常有用的。而且大部分的应用都会有日志记录,对于传统的应用大部分都会写入到本地的日志文件之中。对于容器化应用程序来说则更简单,只需要将日志信息写入到 stdout 和 stderr 即可,容器默认情况下就会把这些日志输出到宿主机上的一个 JSON 文件之中,同样也可以通过 docker logs 或者 kubectl logs 来查看到对应的日志信息。
王先森sec
2023/11/20
1.1K0
Kubernetes集群监控-使用ELK实现日志监控和分析
腾讯云TKE-日志案例: 基于fluentbit、elasticsearch、kibana日志解决方案
本文介绍利用在腾讯云TKE应用市场中的三款软件 fluentbit,elasticsearch和kibana搭建一套适用于kubernetes环境的云原生一站式日志解决方案。
朱瑞卿
2020/11/02
2.2K0
腾讯云TKE-日志案例: 基于fluentbit、elasticsearch、kibana日志解决方案
使用 EFKLK 搭建 Kubernetes 日志收集工具栈
前面大家介绍了 Kubernetes 集群中的几种日志收集方案,Kubernetes 中比较流行的日志收集解决方案是 Elasticsearch、Fluentd 和 Kibana(EFK)技术栈,也是官方现在比较推荐的一种方案。
CNCF
2021/05/07
2.2K0
使用 EFKLK 搭建 Kubernetes 日志收集工具栈
TKE中部署EFK日志收集
通过DaemonSet在每一台Node节点上跑一个Filebeat或fluentd,然后通过挂载的形式将容器日志与该Pod关联,从而处理发送至后端存储;
蒋经纬
2020/06/19
6190
k8s DaemonSet 介绍与实例
我们之前说k8s中使用deployment、statefulset工作负载资源来分别维护无状态和有状态应用。这篇小作文我们会学习如何使用DaemonSet来维护一个守护进程(应用)。
你大哥
2021/11/02
2.1K0
相关推荐
12-部署EFK插件
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验