使用Loki采集Kubernetes应用日志

2023-11-01

本文章旨在指导如何使用轻量级日志引擎Loki来采集Kubernetes的应用日志,并展示在grafana中。

背景

最近我们公司的项目上了Kubernetes集群,产生的大量应用的日志需要采集起来,便于溯源问题、跟踪问题和及时报警。考虑到ELK那一套框架实在太大了,所以我们采用了更轻量化,更便捷部署和维护的Loki+grafana。

新建Loki服务

这里考虑到Loki服务需要持久化存储数据,我就直接部署在虚拟机了。

$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.7.3/loki-linux-amd64.zip
$ unzip loki-linux-amd64.zip

$ cat /etc/systemd/system/loki.service 
[Unit]
Description=loki
After=network.target 
[Service]
ExecStart=/data/loki/loki-linux-amd64 \
        -config.file=/data/loki/loki-config.yaml &>> /data/loki/logs/loki-3100.log
Restart=on-failure
[Install]
WantedBy=multi-user.target

优化Loki服务的参数

为了避免Loki服务器出现io瓶颈,需要对Loki得参数进行优化。


$ cat loki-config.yaml
auth_enabled: false
 
server:
  http_listen_port: 3100     #如是云服务需打开3100端口
  grpc_listen_port: 9096
  grpc_server_max_recv_msg_size: 8388608
  grpc_server_max_send_msg_size: 8388608
 
ingester:
  lifecycler:
    address: 0.0.0.0      #监听地址,可不做修改。
    ring:
      kvstore:
        store: inmemory
      replication_factor: 1
    final_sleep: 0s
  chunk_idle_period: 5m
  chunk_retain_period: 30s
  max_transfer_retries: 0

ingester_client:
  remote_timeout: 2m

schema_config:
  configs:
    - from: 2023-01-29
      store: boltdb
      object_store: filesystem
      schema: v11
      index:
        prefix: index_
        period: 168h
 
storage_config:
  boltdb:
    directory: /data/loki/index   #自定义boltdb目录(在loki目录下新建data文件来存放)
 
  filesystem:
    directory: /data/loki/chunks	#自定义filesystem目录(在loki目录下新建data文件来存放)
 
limits_config:
  enforce_metric_name: false
  reject_old_samples: true
  reject_old_samples_max_age: 168h
  #ngestion_rate_strategy: local
  ingestion_rate_mb: 30
  ingestion_burst_size_mb: 60
  per_stream_rate_limit: 10MB
  per_stream_rate_limit_burst: 20MB
  max_query_length: 0h
 
chunk_store_config:
  max_look_back_period: 0s
 
table_manager:
  retention_deletes_enabled: false
  retention_period: 180h
# service file
$ cat /etc/systemd/system/loki.service 
[Unit]
Description=loki
After=network.target 
[Service]
ExecStart=/data/loki/loki-linux-amd64 \
        -config.file=/data/loki/loki-config.yaml &>> /data/loki/logs/loki-3100.log
Restart=on-failure
[Install]
WantedBy=multi-user.target

# start loki
sudo systemctl daemon-reload
sudo systemctl enable loki
sudo systemctl start loki

在kubernetes集群部署日志采集器

Loki的日志采集器是promtail,相当于prometheus的node-exporter,充当采集器角色。
这里的日志采集有几种办法:
针对服务器service:可以直接配置service得名字,promtail就能自动采集
针对磁盘日志文件:配置日志文件的目录,或者用通配符匹配目录下的日志文件
这里因为我们的应用没有输出日志到指定的文件,只能去node节点上的docker日志目录采集,
配置如下:

首先创建role和rolebinding:

--- # Clusterrole.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: promtail-clusterrole
rules:
  - apiGroups: [""]
    resources:
    - nodes
    - services
    - pods
    verbs:
    - get
    - watch
    - list

--- # ServiceAccount.yaml
apiVersion: v1
kind: ServiceAccount
metadata:
  name: promtail-serviceaccount
  namespace: uat

--- # Rolebinding.yaml
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: promtail-clusterrolebinding
subjects:
    - kind: ServiceAccount
      name: promtail-serviceaccount
      namespace: uat
roleRef:
    kind: ClusterRole
    name: promtail-clusterrole
    apiGroup: rbac.authorization.k8s.io

创建configmap:

% cat configmap.yaml 
--- # configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: promtail-config
data:
  promtail.yaml: |
    server:
      http_listen_port: 9080
      grpc_listen_port: 0

    clients:
    - url: http://10.x.x.x:3100/loki/api/v1/push # 替换为loki服务的地址

    positions:
      filename: /tmp/positions.yaml
    target_config:
      sync_period: 60s
    scrape_configs:
    - job_name: pod-logs
      kubernetes_sd_configs:
        - role: pod
      pipeline_stages:
        - docker: {}
      relabel_configs:
        - source_labels:
            - __meta_kubernetes_pod_node_name
          target_label: __host__
        - action: labelmap
          regex: __meta_kubernetes_pod_label_(.+)
        - action: replace
          replacement: $1
          separator: /
          source_labels:
            - __meta_kubernetes_namespace
            - __meta_kubernetes_pod_name
          target_label: job
        - action: replace
          source_labels:
            - __meta_kubernetes_namespace
          target_label: namespace
        - action: replace
          source_labels:
            - __meta_kubernetes_pod_name
          target_label: pod
        - action: replace
          source_labels:
            - __meta_kubernetes_pod_container_name
          target_label: container
        - replacement: /var/log/*$1/*.log # 这里是采集node节点的容器目录的日志
          separator: /
          source_labels:
            - __meta_kubernetes_pod_uid
            - __meta_kubernetes_pod_container_name
          target_label: __path__

创建daemonset格式的资源,以采集每个node上的log。

--- # Daemonset.yaml
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: promtail-daemonset
spec:
  selector:
    matchLabels:
      name: promtail
  template:
    metadata:
      labels:
        name: promtail
    spec:
      serviceAccount: promtail-serviceaccount
      containers:
      - name: promtail-container
        image: grafana/promtail
        args:
        - -config.file=/etc/promtail/promtail.yaml
        env: 
        - name: 'HOSTNAME' # needed when using kubernetes_sd_configs
          valueFrom:
            fieldRef:
              fieldPath: 'spec.nodeName'
        volumeMounts:
        - name: logs
          mountPath: /var/log
        - name: promtail-config
          mountPath: /etc/promtail
        - mountPath: /var/lib/docker/containers
          name: varlibdockercontainers
          readOnly: true
      volumes:
      - name: logs
        hostPath:
          path: /var/log/pods
      - name: varlibdockercontainers
        hostPath:
          path: /var/lib/docker/containers
      - name: promtail-config
        configMap:
          name: promtail-config

创建后的资源:
在这里插入图片描述

将Loki数据源接入Grafana

登陆grafana,新建Loki类型的数据源
在这里插入图片描述

使用Lokiql查询日志

登陆grafana,点击explore,选择刚创建的数据源,点Log Browser
在这里插入图片描述
在这里就能看到采集到的每一个pod的日志

在这里插入图片描述
也可以自己写promql查询指定应用的日志:
例如ql:{pod=~“nginx-gateway-.+”},搜索名字为nginx-gateway应用的日志
例如ql:搜索应用nginx-gateway近期日志中包含ERROR或error或Error的行

{pod=~"nginx-gateway-.+"}|~"ERROR|error|Error"

在这里插入图片描述
例如ql:搜索nginx-gateway-应用中包含关键字“RobotCacheHandler”的日志

{pod=~"nginx-gateway-.+"}|~"RobotCacheHandler"

在这里插入图片描述

至此,我们使用Loki+promtail+grafana实现了对K8s集群中应用日志的采集和展示。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Loki采集Kubernetes应用日志 的相关文章

随机推荐

  • new与默认构造函数

    class A public A int i int 0 private int a b class B public 无需构造函数 因为数据成员的全部为public int a b c int main A a 3 B b 1 2 3 A
  • Python之selenium,使用webdriver模拟登录网站(含验证码)

    文章目录 一 前言 二 准备工作 三 模拟登陆网站 1 加载驱动和配置 2 打开网站 3 寻找元素并填入账号密码 4 填写验证码 四 遇到的一些坑 五 后记 一 前言 这段时间做了一个小项目 其中有一段需要自动获取网站后台的数据 但是这个网
  • 如何扩展mvc的消息转换器?

    问题 在服务端向客户端传输id时 由于是采用雪花算法 id长度足有19位之多 于是js接收时就产生了精度丢失问题 那么我们就需要扩展mvc的消息转换器来使后台传向前台的数据格式化为我们想要的格式 自定义消息转换器 public class
  • LaTex创建四级目录

    默认情况下 目录的深度是3级 也就是说 对于 ctexart article 文类 只对 section subsection subsubsection 编目 如果你的文档结构用到了 paragraph 一级 那么它将不会被编入目录中 但
  • Qt5类之QLine and QLineF

    QLine include
  • 成功解决 /bin/sh: 1: source: not found

    执行下列语句报错 解决办法 在命令行输入 exec bash 或直接输入bash 如下图 便可成功使用source命令
  • C++ 开发 Web 服务框架 - HTTP Web 框架的设计与实现(二)

    C 开发 Web 服务框架 HTTP Web 框架的设计与实现 一 概述 项目介绍 服务器开发中 Web 服务是一个基本的代码单元 将服务端的请求和响应部分的逻辑抽象出来形成框架 能够做到最高级别的框架级代码复用 本次项目将综合使用 C 1
  • 【unity】角色动画的 Has Exit Time是什么?什么时候需要打钩?

    场景 在动画的状态机Animator中的Transitions中总能看到Has Exit Time这个选项 到底是否勾选 探究 Has Exit Time 我的理解翻译过来是 是否有一个结束的时间 如果不勾选的话 就是没有结束的反应时间 那
  • 什么是IOC(控制反转),IOC的原理

    什么是控制反转 控制反转也可以理解为创建对象权利的交接 我们在获取对象时 都是采用 new 的方式 是主动的 现在 我们获取对象时 同时跟工厂要 由工厂为我们查找或者创建对象 是被动的 IOC的原理 IOC是通过反射 工厂 容器来完成了对象
  • Win11安装wsl2及深度学习环境配置(Win10应该类似)

    一 wsl2 Ubuntu安装 参考教程 https blog csdn net qq 36622589 article details 123402704 我是从第3步开始的 做到第9步结束就行 图形化我装了 但如果要安装pycharm专
  • Java学习之IDEA环境搭建

    Java学习之IDEA环境搭建 序言 PicGO的Gitee图床设置 owner QMei repo BlogHome path 环境搭建 IDEA环境搭建 同步 2020 11 1 IDEA 版本 Ultimate 2020 2 搜索功能
  • (ros/navigation/slam_gmapping) map_server地图服务器

    http wiki ros org map server 概述 map server提供map server ROS节点 它提供地图数据作为一个ROS服务器 也提供map saver命令行功能 能动态生成保存到文件中的地图 地图格式 包中通
  • leetcode872. 叶子相似的树(java)

    叶子相似的树 题目描述 递归 题目描述 难度 简单 leetcode 872 叶子相似的树 请考虑一棵二叉树上所有的叶子 这些叶子的值按从左到右的顺序排列形成一个 叶值序列 举个例子 如上图所示 给定一棵叶值序列为 6 7 4 9 8 的树
  • QT注册界面练习(信号与槽实现页面跳转)

    一 注册界面练习思路以及具体代码 在完成注册页面搭建的前提下 通过信号与槽机制实现多组件之间的相互通信 实现页面跳转 基本步骤 首先 将注册页面的登录按钮与成功登陆信号绑定 当用户名与密码均匹配时 关闭注册页面 发送跳转信号 其次 在成功登
  • 10款强大的开源 Javascript 图表库

    1 ECharts ECharts 由百度前端技术部开发的 是一个纯 Javascript 的图表库 可以流畅的运行在 PC 和移动设备上 兼容当前绝大部分浏览器 IE8 9 10 11 Chrome Firefox Safari等 底层依
  • 网络安全入门学习第九课——计算机网络基础

    文章目录 一 网路通信三要素 1 IP地址 互联网协议地址 分为公网地址和私有地址 1 1 公网地址的范围 1 2 私网地址的范围 2 端口 2 1 周知端口 2 2 注册端口 2 3 动态端口 3 协议 二 两个终端间通信的五大要素 三
  • vs 引用动态链接库

    1 添加头文件目录 工程 属性 配置属性 c c 常规 附加包含目录 加入头文件所在目录 2 添加静态库目录 工程 属性 配置属性 连接器 常规 附加库目录 加入lib文件所在目录 3 添加lib文件名 工程 属性 配置属性 连接器 输入
  • 浅谈电源芯片选型之低功耗

    浅谈电源芯片选型之低功耗 硬件电路设计中电源芯片选型必不可少 电源芯片选型的好坏关系到系统的稳定性 电源的转换效率等等 在低功耗产品设计中 更关系到系统睡眠或者低功耗模式时的系统总的耗电情况 低功耗产品设计中 电源芯片选型 暂时以LDO电源
  • SPI采样和输出指主从同时的采样和输出

    SPI总线是Motorola公司推出的三线同步接口 同步串行3线方式进行通信 一条时钟线SCK 一条数据输入线MOSI 一条数据输出线MISO 用于 CPU与各种外围器件进行全双工 同步串行通讯 SPI主要特点有 可以同时发出和接收串行数据
  • 使用Loki采集Kubernetes应用日志

    本文章旨在指导如何使用轻量级日志引擎Loki来采集Kubernetes的应用日志 并展示在grafana中 背景 最近我们公司的项目上了Kubernetes集群 产生的大量应用的日志需要采集起来 便于溯源问题 跟踪问题和及时报警 考虑到EL