前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2.1.了解报错相关知识

2.1.了解报错相关知识

作者头像
yaohong
发布2022-05-10 08:34:13
3041
发布2022-05-10 08:34:13
举报
文章被收录于专栏:姚红专栏

一.问题描述

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

二.问题分析

2.1.了解报错相关知识

查阅资料发现,上面的问题,是因为环境变量过多引起的。K8S启动时会给容器注入环境变量,K8S集群中的项目数越多,环境变量也就越多。而pm2在启动时会导入系统中的环境变量,当环境变量数量过多时,就会报错PM2 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 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://cloud.tencent.com/developer/article/1998179

三.解决方案

3.1.方案1-清理无效pod

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

代码语言:javascript
复制
#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部分。

代码语言:javascript
复制
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启动前清除系统中的环境变量。

正常启动命令前,先执行一段清除系统变量的脚本。

代码语言:javascript
复制
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:

代码语言:javascript
复制
enableServiceLinks: false

 文档链接:https://cloud.tencent.com/developer/article/1998179

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022-03-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一.问题描述
  • 二.问题分析
    • 2.1.了解报错相关知识
      • 2.2.确定变量数量阈值
        • 2.3.确定具体原因
        • 三.解决方案
          • 3.2.方案2-修改pm2源码
            • 3.3.方案3-清除环境变量
              • 3.4.方案4-修改k8s资源
              相关产品与服务
              容器服务
              腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档