首页 > 其他分享 >记一次 K8s 故障处理

记一次 K8s 故障处理

时间:2024-03-31 21:35:41浏览次数:16  
标签:node kernel 22 容器 处理 max PID 故障 K8s

记一次 K8s 故障处理

k8s技术圈 2024-03-31 20:38 四川 听全文  

以下文章来源于SRE运维进阶之路 ,作者Clay

SRE运维进阶之路.

专注于 SRE 运维、云原生、稳定性、高可用性、可观测性、DevOps 等技术

 

Calico 异常重启问题复盘

集群内网络架构为,基于Calico BGP 的路由模式,直接与交互机建联。

影响范围和故障时间线

影响范围

线下环境  node-xx 物理机上 Pod 网络不可用

影响时间线(2023-07-23 22:09 ~ 22:14)

[22:13] 收到网工反馈 Peer Down

图片

[22:14] Calico 故障自愈(自动重启)

故障发生原因

故障现象

1)查看 calico 事件信息:kubectl -n kube-system describe pod calico-node-xx图片

图片图片

ok , 从上面事件日志可得找到以下关键信息:

Readiness probe failed、Liveness probe failed 就绪探针、存活探针 探测失败 → 查看探测方式,是使用 exec 进行探测(fork 新命令方式)→ 具体错误信息 Resource temporarily unavailable

2)查看 kubelet 系统日志 journalctl -u kubelet.service --since "2023-07-23 22:00:00"

图片

从上面日志可以得到以下关键信息:runtime: failed to create new OS thread (have 5 already; errno=11) runtime: may need to increase max user processes (ulimit -u) fatal error: newosproc

3)查看 Node-exporter 监控大盘,Processes 相关监控

图片

从监控大盘可以分析出来:

从22点开始出现了大量的 Processes Forks, 没收集到 PIDs Number 和 Threads Number

4)有没有可能是 PID 跑满了,由于没有收集到 PIDs Number 和 Threads Number,所以换个思路,看看容器 cadvisor 是否有收集 Processes 相关信息,是不是容器捣的鬼,使用 promql 查询 node-xx 容器线程趋势 sum(container_threads{node="node-xx"})

图片

查询到 22点多 容器总线程量达到 46k

根因分析

总结一下,上述现象的有用信息

  • calico-node 使用 exec 进行监控探测,探测失败,Resource temporarily unavailable
  • kubelet 无法初始化线程,需要增加所处运行用户的进程限制,大致意思就是需要调整ulimit -u
  • 22 点有大量的 process forks,node-xx 容器总线程 突增到 46k,无法确定当时宿主机的总线程数,可以通过 如下命令实时计算 ps -eLf | wc -l

继续分析,登录服务查看 ulimit -u 的限制数 204k ,46k 比 204k 还差得远图片

因为ulimit是针对于每用户而言的,具体还要验证每个用户的limit的配置,如下

根据以下配置判断,并没有超出设定的范围,最后的取值是会取 /etc/security/limits.d/20-nofile.conf 里面的值(优先级高) ,还是 204k图片

图片

-→  继续找 Google Resource temporarily unavailable 错误,翻阅linux内核文档,搜索PID相关字段,其中找到如下相关的PID参数 kernel.pid_max

https://www.kernel.org/doc/html/latest/admin-guide/sysctl/kernel.html#pid-max

参数大致意思是,kernel允许当前系统分配的最大PID identify,如果kernel 在fork时hit到这个值时,kernel会wrap back到内核定义的minimum PID identify,意思就是不能分配大于该参数设定的值+1,该参数边界范围是全局的,属于系统全局边界

同理,还有threads-max 参数

OK,安排,确认当前的 PID 限制,检查全局 PID 最大限制: cat /proc/sys/kernel/pid_max  49k,没错,应该就是它了,49k = 46k(容器总线程) + 非容器线程数

也检查下线程数限制:cat /proc/sys/kernel/threads-max 1545k

图片image-20240327203325829图片image-20240327203403343

结论:全局 PID(/proc/sys/kernel/pid_max ) 达到上限,导入 calico 无法 fork 进程,进而监控检查失败,存活探针自动重启

等等,还没完,到底是谁把 PID 耗尽了呢,还要找出真凶,容器总线程 突增,说明是某个容器造成的,安排promql 查,container_threads{node="node-xx"}图片

至此,结案了,联系开发改代码,有线程泄露。

Why 分析

1)导致问题的直接原因是什么?

Xxx 应用线程泄露,导致全局 PID 耗尽,进而导致 calico 监控检查失败,自动重启。

2)K8s Pod 中没有限制 PID 数吗?

默认 K8s Pod 是不对 PID 数进行限制的。

图片

3)为何排查问题耗时较长?

未收集物理机 Processes 的相关监控指标,也未设置 PID 使用百分比触发器

4)全局PID限制,为何比用户PID限制要小?

参数设置不合理,未进行调优

后续 TODO

1)调整 pid_max 参数

2)开启 Node-exporter Process 监控并补全告警

node-exporter 启动参数中新增 --collector.processes,并添加告警规则 (node_processes_threads / on(instance) min by(instance) (node_processes_max_processes or node_processes_max_threads) > 0.8)

3)评估业务是否需要开始 Pod PID 限制:https://kubernetes.io/zh-cn/docs/concepts/policy/pid-limiting/

我是 Clay,下期见  

标签:node,kernel,22,容器,处理,max,PID,故障,K8s
From: https://www.cnblogs.com/cheyunhua/p/18107307

相关文章

  • 【C语言基础篇】字符串处理函数(四)strcmp的介绍及模拟实现
    目录 一、strcmp函数介绍函数原型函数参数功能描述返回值使用示例二、strcmp函数模拟实现思路代码测试         个人主页:    倔强的石头的博客        系列专栏 :C语言指南         C语言刷题系列  系列文章【C语言基础篇......
  • C语言----预处理(详解)
         好了书接上回。我在讲编译与链接的时候写过宏和条件建议。我说会在下一篇博客中讲解,那么来了。今天我们来详细的讲讲预处理。宏与条件编译也在其中,那么我们现在就来好好会会这个预处理吧。预定义符号    关于预定义符号,我暂时只知道几个。并且我知道的......
  • 继承之同名成员的处理
    #include<iostream>classBase{public:Base(){m_A=100;}voidfunc(){std::cout<<"basefunc"<<std::endl;};intm_A;};classSon:publicBase{public:Son(){m_A=200;......
  • 环保产业新篇章,污水处理药剂市场蓬勃发展
    一、行业简述   污水处理药剂是指用于污水处理过程中的各类化学药剂,主要包括絮凝剂、消毒剂、酸碱调节剂、重金属捕捉剂等。这些药剂通过化学或物理作用,能有效去除或降低污水中的有害物质,达到净化水质的目的。污水处理药剂行业的发展,对于保障水资源安全、推动绿色循环经......
  • 【博客708】victoriametrics如何处理counter跳变
    victoriametrics如何处理counter跳变背景监控中我们经常会使用一些counter类型的metrics来计算速率,比如:rate(https_request_total)但是如果我们的服务突然由于异常导致重启了,那么这时候counter会重新从0开始计算,那么这时候就会有问题,假设我们原来https_request_total是......
  • 【C语言终章】预处理详解(下)
      【C语言终章】预处理详解(下)  当你看到了这里时,首先要恭喜你!因为这里就是C语言的最后一站了,你的编程大能旅途也将从此站开始,为坚持不懈的你鼓个掌吧!......
  • dbt this macro 处理简单说明
    dbtthismacro提供了一种方便的对于当前模型展现的方法,可以使用在增量模型以及pre&posthooks中this实际是就类似ref('<the_current_model>')是一个relation包含了database,schema以及模型标识使用示例一个增量处理的,基于this可以方便的引用模型{{config(mater......
  • 阻塞外挂 TCP 端口 让外挂服务器做附加处理
    //UDPER.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。//usingnamespacestd;#include<stdlib.h>#pragmacomment(lib,"WS2_32.lib")#include<iostream>#include<Windows.h>SOCKETg_socket;SOCKETg_socket2;SOCKETg_socket3;SOCKET......
  • Matlab|孤岛划分|弹性配网故障划分模型
    目录1 主要内容1.1 DistFlow模型1.2 虚拟潮流1.3 目标函数2 部分代码3 程序结果4下载链接1 主要内容程序主要复现《ANewModelforResilient DistributionSystemsbyMicrogridsFormation》,建立灾害情况下配网优化孤岛划分方案,通过虚拟潮流的方式优......
  • 前端应用开发实验:事件处理
    目录实验目的相关知识点实验内容购物车功能的拓展代码实现效果实验目的(1)熟练掌握v-on指令的用法,学会使用v-on指令监听DOM元素的事件,并通过该事件触发调用事件处理程序。(2)掌握v-on指令修饰符的基本用法。相关知识点(1)事件监听:使用v-on指令、事件处理方法......