k8s pod报错Process failed to launch spawn E2BIG

2023-05-16

一.问题描述

近期遇到k8s环境中一个pod无法正常启动,启动报错,[PM2][ERROR] Process failed to launch spawn E2BIG

二.问题分析

2.1.了解报错相关知识

查阅资料发现,上面的问题,是因为环境变量过多引起的。K8S启动时会给容器注入环境变量,K8S集群中的项目数越多,环境变量也就越多。而pm2在启动时会导入系统中的环境变量,当环境变量数量过多时,就会报错[PM2][ERROR] Process failed to launch spawn E2BIG。

2.2.确定变量数量阈值

使用env或者printenv命令查看容器中的变量,果然环境变量特别多有。
但为何内部环境未复现,然后对比客户和内部环境:
客户环境故障pod中:env |wc输出有2111个;
内部环境正常pod中:env |wc输出有1853个;
然后尝试给内部环境正常pod对应values.yaml注入自定义随机环境变量用于增加pod环境变量数目,发现当此pod中环境变量为   2050左右   会出现[PM2][ERROR] Process failed to launch spawn E2BIG异常。

2.3.确定具体原因

1.将客户故障pod的env打印到error.txt后取出;
2.将内部正常pod的env打印后info.txt后取出;
3.对比环境变量;
   对比error.txt和info.txt两个文件内容中环境变量的key,发现error.txt中多了506个GET_JS*服务相关变量相关变量:

4.确定GET_NODEJS* 环境变量来源
   既然pod环境变量是在同一namespace中是叠加的,那他应该属于某个pod,进行pod过滤后过果然发现大量get_yaohong的pod服务,
5.确定get_nodejs服务有效性
    和业务咨询此问题后了解到此服务在客户正常使用的版本中已经废弃。

    文档链接:https://www.cnblogs.com/yaohong/p/16002922.html

三.解决方案

3.1.方案1-清理无效pod

 在第二章中提到了找到了引起环境变量增加500多个的服务,然后删掉此服务的相关资源:

#kubectl get svc |grep get_yaohong |awk '{print $1}' |xargs kubectl delete svc
#kubectl get deployment |grep get_yaohong|awk '{print $1}' |xargs kubectl delete deployment

3.2.方案2-修改pm2源码

修改pm2源码,过滤掉环境变量。
编辑/usr/local/lib/node_modules/pm2/lib/Common.js,修改process.env部分。

function filterDockerEnv(envObj){
	let keys = Object.keys(envObj);
	let new_env = {};
	let allowKeys = keys.filter(item => !item.startsWith("ENV_HOST_"));
	allowKeys.forEach(key => {
		new_env[key] = envObj[key];
	});
	return new_env;
}

var newEnv = filterDockerEnv(env);

// Change to double check  (dropped , {pm_cwd: cwd})
app.env = [{}, newEnv, app.env || {}].reduce(function(e1, e2){
	return util._extend(e1, e2);
});

3.3.方案3-清除环境变量

第三个方案是在pm2启动前清除系统中的环境变量。
正常启动命令前,先执行一段清除系统变量的脚本。

for i in `env | grep -E -i 'SERVICE|HOST|ADDR|PORT' | sed 's/=.*//'` ; do unset $i;done

3.4.方案4-修改k8s资源

在报错服务的deployment.spec.template.spec模块下添加如下内容,其中enableServiceLinks 表示是否将 Service 的相关信息注入到 Pod 的环境变量中,默认是 true:

enableServiceLinks: false

 文档链接:https://www.cnblogs.com/yaohong/p/16002922.html

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

k8s pod报错Process failed to launch spawn E2BIG 的相关文章

  • 如何在容器化世界中独特地解决“流程”?

    这是一个普遍问题 但出于争论的目的 您可以假设我们有一组通过 AMQP 和 HTTP 组合进行通信的进程 有两种具体情况需要考虑 最简单的一个 Q 如果 A 向 B 发送消息 B 如何识别 A 发送回复的位置 A A 必须以某种方式告诉 B
  • Delphi - 获取应用程序打开了哪些文件

    如何使用 Delphi 获取应用程序打开的文件的列表 例如 winword exe 打开哪些文件 使用原生API函数NtQuery系统信息 http msdn microsoft com en us library ms724509 28V
  • YUI 压缩机和 .NET 应用程序

    我想使用 YUI Compressor 原始版本 并将其用作典型 MS 构建过程 Visual Studio 2008 MSBuild 的一部分 有人对此有任何指导或想法吗 例如 合并到项目中的好方法 如何处理现有的 CSS 和 JS 引用
  • Kill - 它会立即终止进程吗?

    什么是kill到底是怎么做的 我有一个父进程 它正在一个接一个地创建 100 个 作为示例 子进程 在任何孩子的工作结束时 我都会杀死孩子kill pid of child SIGKILL 我看不到ps输出 但是如果父进程出现问题并且我退出
  • python:运行一个超时进程并捕获stdout、stderr和退出状态[重复]

    这个问题在这里已经有答案了 可能的重复 带有超时的子进程 https stackoverflow com questions 1191374 subprocess with timeout 在 Python 中执行以下操作的最简单方法是什么
  • 使用用户名和密码在 C# 中启动进程会引发“访问被拒绝”异常

    在运行模拟的 NET 3 5 Web 应用程序中 我尝试通过以下方式执行进程 var process new Process StartInfo CreateNoWindow true FileName someFileName Domai
  • Windows 中的 Perl Kill(0, $pid) 总是返回 1

    我正在尝试制作一个 Perl 脚本来运行 Windows 中的一组其他程序 我需要能够捕获进程的 stdout stderr 和退出代码 并且需要能够查看进程是否超出了分配的执行时间 现在 我的代码的相关部分如下所示 pid open3 w
  • Ruby 进程之间的共享变量

    我有一个 Ruby 程序 可以加载两个非常大的 yaml 文件 因此我可以通过分叉一些进程来利用多核来提高速度 我尝试过寻找 但我无法弄清楚如何或是否可以在不同的进程中共享变量 以下代码是我目前拥有的 proteins decoyProte
  • 玩具外壳管道不正确

    我不会撒谎 这是一个家庭作业问题 然而 就我而言 积分已经消失了 现在 我只是在寻找答案 因为我想我可能疯了 该程序的目标是执行命令ps A grep inputstring wc l其方式与 shell 的操作方式类似 因此 我生成进程
  • 不受信任的 URL 字符串的安全 Process.Start 实现

    我的目标是在用户默认浏览器中安全地打开网页 该网页的 URL 被视为 不受信任 将其视为使用该软件打开的文档中的链接 但该文档可能来自任何地方 并且其中的链接可能是恶意的 我想避免有人将 C Windows malicious code e
  • 如何知道gdb附加了哪个进程(stat: T)?

    当 gdb 附加进程时 该进程的 stat 为 T 例如 root 6507 0 0 0 0 67896 952 Ss 12 01 0 00 mytest root 6508 0 0 0 0 156472 7120 Sl 12 01 0 0
  • Android中AIDL的实时示例和使用?

    我想知道aidl 的实时示例及其使用 我研究了有关此主题的android 开发人员博客 我无法在实时世界中实现这一点 谁能举个例子告诉我 AIDL用于以某种格式共享数据 primitive and parcelable 与其他应用程序 现实
  • 如何在 C++ 中检查文件是否已被另一个应用程序打开?

    我知道 有is open C 中的函数 但我希望一个程序检查文件是否尚未被另一个应用程序打开 有没有办法使用标准库来做到这一点 编辑 在答案中澄清这是针对 Linux 应用程序的 不仅标准库没有这个功能 一般来说也是不可能的 你可以 在li
  • 获取后台进程的退出代码

    我有一个从我的主 bourne shell 脚本中调用的命令 CMD 该命令需要很长时间 我想修改脚本如下 作为后台进程并行运行命令 CMD CMD 在主脚本中 有一个循环每隔几秒监视生成的命令 该循环还向标准输出回显一些消息 指示脚本的进
  • 进程终止时释放资源

    当进程被任务管理器等进程终止时 如何释放资源 有没有办法在进程关闭之前调用函数 如果您的进程被终止 您实际上无能为力 根据定义 杀死一个进程就是杀死它 该进程没有机会运行任何代码 这很大程度上是 设计使然 想象一下 您可以注册一个例程 当您
  • 如何触发并忘记子进程?

    我有一个长时间运行的进程 我需要它来启动另一个进程 该进程也会运行很长一段时间 我只需要开始它 然后就完全忘记它 我设法通过从 Ruby 编程 一书中获取一些代码来完成我需要的操作 但我想找到最好 正确的方法 并了解发生了什么 这是我最初得
  • 如何使用 python 显示当前用户的进程列表?

    我知道它与 proc 有关 但我不太熟悉它 教科书的答案是使用psutil像这样的模块 import psutil getpass os user name getpass getuser process dict proc pid pro
  • 从 java servlet 运行长进程的最佳方法是什么?

    我想问从 java servlet 运行长进程的最佳方法是什么 我有一个网络应用程序 当客户端发出请求时 它会运行一个 servlet 该 servlet 应该从请求中获取一些参数 然后运行一个进程 这个过程可能需要很长时间 所以我需要单独
  • CreateProcess error=2,系统找不到指定的文件

    我正在用java编写一个程序 它将执行winrar并解压一个jar文件 放在h myjar jar进入文件夹h new 我的java代码是这样的 import java io File import java io IOException
  • 如何查找或计算Linux进程的页表大小和其他内核占用?

    我怎样才能知道 Linux 进程页表有多大 以及任何其他可变大小的进程统计 如果您真的对页表感兴趣 请执行以下操作 cat proc meminfo grep PageTables PageTables 24496 kB

随机推荐

  • The power input for PSU 2 is lost

    错误信息 Dell戴尔 PowerEdge R720 服务器错误 xff1a PSU0003 Power input for PSU 2 is lost Please check PSU cables 这个错误信息为 xff1a PSU 2
  • 如何保存token-localStorage存储

    1 原理 原理是通过vue router的beforeEach钩子 xff0c 在每次路由到一个地址的时候先判断该路由是否携带了meta信息 xff0c 且该信息中的requireAuth是否为true xff0c 如果为true表示该路由
  • 在Tomcat服务器部署jar包

    在Tomcat服务器部署jar包 1 输出jar包 在eclipse环境下 xff0c 进入Run Configuration界面 xff0c 在Maven Build下选择demo 将Goals的内容改成package 2 将jar包部署
  • PTA 程序设计天梯赛(1~20题)

    文章目录 1 Hello World 5 分 2 打印沙漏 20 分 3 个位数统计 15 分 4 计算摄氏温度 5 分 5 考试座位号 15 分 6 连续因子 20 分 7 A B 20 分 8 计算指数 5 分 9 计算阶乘和 10 分
  • 关于动态(长度不定)结构体数组的两种处理方法

    讲解这个问题 xff0c 以一个例子入手 xff1a PAT xff08 A xff09 1080 Graduate Admission 方法一 xff1a 定义一个结构体数组 xff0c 为该数组开辟一块大的存储空间 xff0c 然后进行
  • 关于C++中string头文件的用法

    注意 xff1a 这里需要声明一点 xff0c 头文件string和string h是不同的 下面的代码是string的使用例子 xff0c 在string头文件下 xff0c 函数中 xff0c 是可以采取string str 61 34
  • 基于VS2010下利用MFC编写软件控制安捷伦信号源

    程控信号源 最近接触关于写 自动化测试软件 xff0c 里面用到了 xff0c 需要实现频谱仪 信号源的程序控制 所以 xff0c 就把每天遇到的问题 xff0c 和学到的知识 xff0c 进行一个总结思考 信号源程控实现 xff1a 信号
  • Qt中emit的用法:发射信号

    emit是为了调用对应的槽函数 xff0c 用来发射信号
  • OAI:Ubuntu20.04不支持OAI

    遇到一个无法解决的问题 xff0c 将ubuntu从18 04升级到了20 04 xff0c 发现ubuntu20 04不支持OAI啊 xff01
  • OAI:eNB模块和UE模块的示波器显示

  • 力扣网页PC端无法进入(问题得到解决)

    最近发现在不同地方 xff0c 使用不同WiFi时 xff0c 有些地点出现力扣网页PC端无法加载的问题 按照网上方法进行了调试 xff0c 发现帖子推荐改hosts文件 xff0c 将自己电脑https leetcode cn com 的
  • Linux临时动态调整kvm虚拟机内存

    一 运维内容描述 同事反馈在用的虚拟机内存不足 xff0c 需要调整 查看一个虚拟机的内存情况 xff0c 最大是8G内存 xff0c 当前内存显示是4G 虚拟机调整最大内存是需要关闭虚拟机的 xff0c 但现在虚拟机上部了服务 xff0c
  • stringstream的用法

    1 用stringstream来分割指定的字符字符串 xff0c 代码如下 xff1a span class token comment 用stringstream来分割指定的字符字符串 span span class token macr
  • C++字符串输入问题

    经常写核心代码模式 xff0c 对于输入输出很多情况下 xff0c 不怎么会写了 所以 xff0c 做个总结 对于如下输入 xff1a span class token comment 输入 xff1a span span class to
  • 中国系统面试0819

    一面 xff1a 30min C 43 43 xff1a 1 C 43 43 的三大特性 xff0c 以及在项目中是如何是用到的 xff08 封装 继承 多态 xff09 2 STL了解哪些 xff0c 在项目中如何使用的 xff0c 举例
  • C语言实现多态

    利用C语言实现多态 xff1a c语言多态的实现 xff0c 需要用到函数指针 函数名实际上是该函数代码存储空间的首地址 xff0c 这个地址可以通过函数指针来存放 通过改变函数指针存储的地址就可以实现多态 span class token
  • 深入浅析Mysql联合索引原理 之 最左匹配原则。

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章 xff0c 自以为就了解了其原理 xff0c 最近面试时和大牛交流中 xff0c 发现遗漏了些东西 xff0c 这里自己整理一下这方面的内容 最左前缀匹配原则 在mysql
  • kubernetes Value:将磁盘挂载到容器,PV,PVC

    6 1 介绍卷 6 1 1 卷的类型 emptyDir 用于存储临时数据的简单空目录 hostPath 用于将目录从工作节点的文件系统挂载到pod nfs 挂载到pod中的NFS共享卷 还有其他的如gitRepo gcepersistenD
  • 记一次容器内执行ansible命令卡住

    1 由来 最近在使用kylin v10系统 xff0c 发现当在此系统下运行的容器内执行 ansible localhost m setup 命令会卡住不动 xff0c 于是和同事一起经过如下排查最终找到解决问题的办法 2 环境 2 1 系
  • k8s pod报错Process failed to launch spawn E2BIG

    一 问题描述 近期遇到k8s环境中一个pod无法正常启动 xff0c 启动报错 xff0c PM2 ERROR Process failed to launch spawn E2BIG 二 问题分析 2 1 了解报错相关知识 查阅资料发现