工作日志——首次通过k8s Elasticsearch获取新建Pod的日志缓慢的原因

2023-05-16

使用k8s Elasticsearch查看pod日志的时候偶尔会遇到这样的情况,在创建完容器并运行后去查看日志的时候总是加载不出来,需要等待十几秒甚至一分钟才能加载。我“有幸”被分配来解决这个问题,经过一天的努力终于发现这个问题的原因,特与大家分享。

k8s日志记录工作原理

关于k8s日志的介绍可以参考这篇文章,这里简单总结几点:

  • 通过命令行和API查询的日志的生命周期与Pod相同,也就是说Pod重启之后之前的日志就不见了。
  • 为了解决上述问题,可以通过“集群级别日志”技术来获取Pod的历史日志。
  • k8s支持多种类型的“集群级别日志”,我们的产品使用的是Elasticsearch。

关于k8s Elasticsearch日志的相关介绍可以看这篇,这里简单总结几点:

  • k8s会在每个node上启动一个Fluentd agent Pod来收集当前节点的日志。
  • k8s会在整个集群中启动一个Elasticsearch Service来汇总整个集群的日志。
  • 上述内容可以通过kubectl get pod/rc/service –namespace=kube-system来查看。
  • 我们可以通过Elasticsearch API来按条件查询日志。
  • Elasticsearch URL可以通过kubectl cluster-info指令查看

问题定位

Elasticsearch只是用来汇总和查询日志的,系统压力很小时Elasticsearch API查询不到日志基本是由于Fluentd agent没有将日志准时发送到Elasticsearch。所以现在要来了解Fluentd agent的工作机制。k8s github代码库中的Fluentd配置介绍了很多细节,可以参考这里。

简单说就是Fluentd会在node的/var/log/containers/目录中监控日志,这些文件名称包含了namespace、pod名、rc名等信息,文件内容是时间、日志级别和日志内容等信息。Fluentd以tail形式监控这些文件并将修改发送给Elasticsearch。

在Fluentd配置中可以看到“flush_interval 5s”这样的信息,理论上在系统压力很小时应该几秒内就能看到日志,那为何会有文章开头提到的问题呢?原来是由于创建容器后,/var/log/containers/下会创建新的日志文件,而Fluentd对于新生成的日志不会立即进行监控,而是有一个时间间隔,具体可以参考这里。其中讲述的是Fluentd tail Input Plugin的配置,对该问题产生影响的就是refresh_interval配置。由于k8s使用的Fluentd配置文件中没有指定refresh_interval,因此使用的是60s的默认配置。这样就有可能导致在创建容器服务且运行之后最多要等待1分钟才能查到日志。

验证方法

验证方法有很多,我的方法比较笨拙:

  • 首先修改/etc/profile,添加export HISTTIMEFORMAT=”%Y-%m-%d %H:%M:%S “变量,并重新打开shell。该操作目的是让history命令可以显示历史操作的执行时间。
  • 然后准备好Elasticsearch的查询方法,如下所示,其中我用的rc名称是aaa和bbb。
curl http://192.168.1.81:8080/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging/logstash-2016.05.26/_search?pretty -d '{"sort":[{"time_nano":{"order":"desc"}}],"query":{"bool":{"must":[{"match":{"kubernetes.namespace_name":"wangleiatest"}}, {"match": {"kubernetes.container_name":"rc名称"}}]}}}'
  • 创建aaa rc,并使用上述查询方法查看日志。我是间隔5秒进行一次查询。
  • 查询到aaa日志之后,马上创建bbb rc,并用上述方法查询bbb的日志。依然用5秒间隔查询,直到看到日志。
  • 这时用history 20来查看历史记录就可以看到最后一条查询aaa日志的操作与最后一条查询bbb日志操作的时间间隔约为1min。
2010  2016-05-26 18:45:45  curl http://192.168.1.81:8080/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging/logstash-2016.05.26/_search?pretty -d '{"sort":[{"time_nano":{"order":"desc"}}],"query":{"bool":{"must":[{"match":{"kubernetes.namespace_name":"wangleiatest"}}, {"match": {"kubernetes.container_name":"aaa"}}]}}}'
2011  2016-05-26 18:46:45  curl http://192.168.1.81:8080/api/v1/proxy/namespaces/kube-system/services/elasticsearch-logging/logstash-2016.05.26/_search?pretty -d '{"sort":[{"time_nano":{"order":"desc"}}],"query":{"bool":{"must":[{"match":{"kubernetes.namespace_name":"wangleiatest"}}, {"match": {"kubernetes.container_name":"bbb"}}]}}}'

解决方法

问题定位到了,解决就很简单了,只需要修改Fluentd配置,添加指定refresh_interval就好了。参考方法如下:

  • 登入fluentd pod所在node,查找fluentd的container id。并使用docker exec访问容器。
$ docker ps|grep fluentd
4bbd5f71ef85        index.tenxcloud.com/tenxcloud/fluentd-elasticsearch:hosting   "/run.sh"                2 weeks ago         Up 25 minutes                           k8s_fluentd-elasticsearch.5f73fa89_fluentd-elasticsearch-192.168.1.84_kube-system_39c01b250b373a72f082d04d80fa3216_aa1c08a2

$ docker exec -ti 4bbd5f71ef85 /bin/bash
root@fluentd-elasticsearch-192:/#
  • 编辑容器中td-agent.conf,找到path为/var/log/containers/*.log的source配置,添加refresh_interval 10配置项。保存并退出编辑,再退出容器。
root@fluentd-elasticsearch-192:/# vi /etc/td-agent/td-agent.conf
...

<source>
  type tail
  path /var/log/containers/*.log
  pos_file /var/log/es-containers.log.pos
  time_format %Y-%m-%dT%H:%M:%S
  tag kubernetes.*
  format json
  read_from_head true
  # refresh_interval是fluentd刷新path下文件列表的时间间隔的配置,这里改成了10秒
  refresh_interval 10
</source>

...

root@fluentd-elasticsearch-192:/# exit
  • 执行docker restart 4bbd5f71ef85来重启fluentd容器。

修改之后在该node上新建pod的日志加载将在10秒内完成。

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

工作日志——首次通过k8s Elasticsearch获取新建Pod的日志缓慢的原因 的相关文章

  • Win7远程控制fedora ——通过xrdp

    原文地址 http blog sohu com s MTU5MTY3OTE1 302888160 html 最近要分析RDP协议的相关东西 xff0c 然后需要抓包 xff0c 实验室空着的电脑只有Fedora系统了 xff0c 就找了一下
  • 解决Win10/11 WSL 子系统 WslRegisterDistribution failed with error: 0x800701bc 错误

    原因 xff1a wsl1升级到wsl2之后 xff0c 内核却没有升级 xff0c 所以会出现这种错误提示 xff01 解决方法 xff1a 1 下载最新的wsl安装包 2 安装包下载后 xff0c 直接运行安装即可 xff01 3 下载
  • 分布式事务之Seata AT 事务

    1 Seata介绍 Seata 是一款开源的分布式事务解决方案 xff0c 致力于提供高性能和简单易用的分布式事务服务 Seata 将为用户提供了 AT TCC SAGA 和 XA 事务模式 xff0c 为用户打造一站式的分布式解决方案 1
  • Vue引用Element-UI时,组件无效果解决方案

    问题 xff1a Vue在使用Element UI组件的时候 xff0c 已经安装好依赖 span class token operator gt span npm install element span class token oper
  • C语言:编译成可执行程序的步骤

    1 预处理 xff08 头文件的展开 xff0c 宏的替换 ifdef else endif xff09 gcc E test c o test i 2 编译 xff08 生成汇编文件 xff0c 对词法和语法进行检查 xff09 gcc
  • 服务器蓝屏的原因及解决办法

    硬件故障 xff1a 1 散热问题 2 内存主板问题 3 电源问题 4 显卡问题 解决办法 xff1a 1 清理下灰尘 xff0c 风扇 xff0c 温度高会蓝屏 2 检查内存 xff0c 新机器后加的内存是不是不兼容 xff0c 拔插下内
  • 在 CentOS 8 中使用 KVM 安装 Windows 10

    在 CentOS 8 中使用 KVM 安装 Windows 10 本文地址 xff1a blog lucien ink archives 514 使用 esxi 的话总觉得有些别扭 xff1f 故尝试 KVM xff0c 本文使用 Cent
  • 树莓派初始化备忘

    树莓派初始化备忘 本文地址 xff1a blog lucien ink archives 515 最近又开始折腾树莓派了 xff0c 记录一下初始化一个树莓派需要做的一些操作 本次操作以 64 位 Raspberry Pi OS xff08
  • 树莓派禁用 Wi-Fi 和蓝牙

    树莓派禁用 Wi Fi 和蓝牙 本文地址 xff1a blog lucien ink archives 516 因为我的树莓派是直接通过网线连接的 xff0c 并没有启用 Wi Fi xff0c 所以在每次 SSH 连进去之后 Raspbi
  • 树莓派安装 OMV

    树莓派安装 OMV 本文地址 xff1a blog lucien ink archives 517 终究还是忍住了 xff0c 没有出手买 x86 的 NAS xff0c 选择自己折腾树莓派 xff08 因为实在是太穷了 xff09 1 初
  • 树莓派安装 docker 和 docker-compose

    树莓派安装 docker 和 docker compose 本文地址 xff1a blog lucien ink archives 518 因为总是频繁地初始化树莓派 xff0c 所以把安装 docker 的过程也记录下来 1 安装 doc
  • 打印 Go Test 的代码覆盖

    打印 Go Test 的代码覆盖 本文地址 xff1a blog lucien ink archives 520 使用方法 将这段代码复制进 zshrc 或者是 bashrc 等文件中 xff08 取决于你的命令行 xff09 xff0c
  • Typecho HTTPS 无法登陆后台

    Typecho HTTPS 无法登陆后台 本文地址 xff1a blog lucien ink archives 523 背景 因为百度云加速的 HTTPS 证书各种难用 xff0c 最近将博客的 CDN 解决方案整体迁移至 Cloud F
  • git 显示中文

    git 显示中文 本文地址 xff1a blog lucien ink archives 524 默认情况下 xff0c git 会对中文进行转译 xff0c 具体表现如下 xff1a span class token function g
  • 在 PVE 中安装 OpenWrt

    在 PVE 中安装 OpenWrt 本文地址 xff1a blog lucien ink archives 525 最近在捣腾 x86 软路由 xff0c 入门方案一般是底层采用 ESXi 或 PVE xff0c 虚拟层使用 iKuai 4
  • ARM:系统移植1

    一 系统移植的概述 1 目的 xff1a 1 软硬件可裁剪 xff1a 硬件发生变化 xff0c 软件要进行裁剪 xff0c 适配硬件 2 学习linux驱动的开发 xff0c 前提开发板上需要运行linux系统 移植linux内核系统到开
  • hdu 3700 cat

    Cat Time Limit 2000 1000 MS Java Others Memory Limit 32768 32768 K Java Others Total Submission s 181 Accepted Submissio
  • OpenWrt 安装中文语言包

    OpenWrt 安装中文语言包 本文地址 xff1a blog lucien ink archives 527 安装 luci i18n base zh cn 即可 xff08 这不是一篇水文 xff09
  • OpenWrt 安装 OpenClash

    OpenWrt 安装 OpenClash 本文地址 xff1a blog lucien ink archives 528 截止 2022 年 5 月 5 日 xff0c OpenWrt 的最新版本为 21 02 3 xff0c OpenCl
  • OpenWrt 添加自定义 Service

    OpenWrt 添加自定义 Service 本文地址 xff1a blog lucien ink archives 530 span class token shebang important bin sh etc rc common sp

随机推荐

  • PVE 虚拟机心跳检测并重启

    PVE 虚拟机心跳检测并重启 本文地址 xff1a blog lucien ink archives 531 不知为何 xff0c PVE 中的 OpenWrt 时不时会宕机 xff0c 这是背景 秉承着能用就行的思想 xff0c 写了一个
  • WSL2 安装、配置 Cuda、pytorch 记录

    WSL2 安装 配置 Cuda pytorch 记录 本文地址 xff1a blog lucien ink archives 532 最近整了张矿卡 xff0c 为了这盘醋 xff0c 包了盘饺子 虽然我已经预料到买前深度学习 xff0c
  • Windows 删除恢复分区

    Windows 删除恢复分区 本文地址 xff1a blog lucien ink archives 533 目前不论是 Windows 10 还是 Windows 11 xff0c 在安装完成后在 C 盘的后面都会有一个恢复分区 xff0
  • Debian 下 CUDA 生产环境配置笔记

    最近整了张 Tesla P4 xff0c 由于是半高卡 xff0c 索性就直接将其塞进了我的 NAS 里 xff0c 试图将原来用 onnx 跑在 CPU 上的模型迁移至 GPU 上 xff0c 遇到了些许问题 xff0c 在此记录下 本文
  • OpenWRT 扩容

    本文地址 xff1a blog lucien ink archives 535 官网原生的 overlay 只有 100M xff0c 不够用 本文只讨论新安装的情形 xff0c 已安装扩容的场景在本文不涉及 步骤 假设从官网下载的文件名为
  • PVE 下解决 iKuai 断流、重启问题

    本文地址 xff1a blog lucien ink archives 536 0 前言 懒得看过程可直接移步第 2 部分 之前入手了 N5105 43 i225 V xff0c 收到后装了 PVE 7 2 作为底层系统 xff0c 虚拟化
  • OpenWRT 安装 PassWall

    本文地址 xff1a blog lucien ink archives 537 访问 OpenWRT Download Server packges xff0c 找到自己的架构 xff0c 以 x86 64 为例 xff1a 在 etc o
  • ARM:系统移植2

    1 u boot启动程序 1 获取uboot源码渠道 1 xff09 u boot官方 xff1a https ftp denx de pub u boot 2 xff09 开发板厂家 3 xff09 芯片厂家 4 xff09 主管领导 x
  • ChatGPT 相关资料收集

    本文地址 xff1a blog lucien ink archives 538 本文用来收集各种和生成式模型相关的内容 xff0c 由于 ChatGPT 是其代表 xff0c 也是会被写入人类历史进程的一个名字 xff0c 所以便用 Cha
  • Debian配置apache2以及CA

    1 安装apache2 apt install y apache2 systemctl start apache2 启动服务 修改apache2配置文件 cd etc apache2 cp sites available default s
  • Debian之配置squid代理缓存

    1 安装服务 apt install squid 2 修改配置 vim etc squid squid conf set nu 显示行号 1390 转到第1390行 第1391行 http access allow localhost 修改
  • JAVA判断回文数的两种方法

    回文数是指正序 xff08 从左向右 xff09 和倒序 xff08 从右向左 xff09 读都是一样的整数 目录 方法一方法二 方法一 通过 61 61 String valueOf 方法把整数转换为字符串 xff0c 再用toCharA
  • java设置Access-Control-Allow-Origin允许多域名访问

    对于前后端分离的项目难免会遇到跨域的问题 xff0c 在设置跨域的问题中有许多需要注意的事情 xff0c 如本次将要将的设置Access Control Allow Origin使其允许多域名请求 1 设置允许多域名访问最简单的方法是使用通
  • Debian10配置静态ip

    查看网卡 xff1a ip addr 修改网卡网络地址配置 xff1a vim etc network interfaces 配置模板 xff1a auto span class token punctuation span 网卡名 spa
  • Docker(四)Image、Container

    一 Image镜像 Docker把应用程序及其依赖 xff0c 打包在image文件里面 只有通过这个文件 xff0c 才能生成Docker容器 image文件可以看作是容器的模板 Docker根据image文件生成容器的实例 同一个ima
  • 报错:ModuleNotFoundError: No module named ‘PIL‘

    运行代码的时候报错 xff0c 如图所示 xff1a 表示python中没有配置pillow库 纠正的步骤 xff1a window 43 R xff0c 并且在框中输入cmd 进入python所在的目录下 xff0c cd appdata
  • Window10 Excel复制粘贴卡死

    Windows10 Excel复制粘贴卡死 excel复制大量数据有时卡死 xff0c 关机重启也没用 网上找了好多方法没效果 xff0c 突然想到windows10有个云剪切板功能 xff0c 就想关了试试没想到解决了 xff0c 哈哈哈
  • (Latex)期刊论文里的数学字符怎么打出来的?

    xff08 Latex xff09 期刊论文里的数学字符怎么打出来的 导入包试一试 by 今天不飞了 最近边查文献边写文章 xff0c 看到别人文章公式里的变量那叫一个花里胡哨 xff0c 再看看自己的 不能忍 xff0c 我也要 于是搜集
  • 面试:ARM篇

    1 IIC I2C 1 由日本飞利浦公司研发的一种 串行半双工的总线 2 采用两根线 SCL 和 SDA 特点 1 硬件比较简单 比较节约资源的一种总线 2 主要用于两个芯片之间的通信 也可以是多主机多从机 但基本不用 3 传输速度一般在4
  • 工作日志——首次通过k8s Elasticsearch获取新建Pod的日志缓慢的原因

    使用k8s Elasticsearch查看pod日志的时候偶尔会遇到这样的情况 xff0c 在创建完容器并运行后去查看日志的时候总是加载不出来 xff0c 需要等待十几秒甚至一分钟才能加载 我 有幸 被分配来解决这个问题 xff0c 经过一