首页 > 其他分享 >如何收集pod重启前现场

如何收集pod重启前现场

时间:2023-12-04 13:44:19浏览次数:34  
标签:容器 收集 dump 重启 pod 回调

之前分享过几篇优化pod重启的文章,有朋友发私信问:看你的优化文章很过瘾,可否分享下如何收集pod重启前的现场。

 

案例分享-full gc导致k8s pod重启

记一次k8s pod频繁重启的优化之旅

 

的确是个好问题,之前写文章的时候忽略了这一点,一个完整的现场对破案的作用不言而喻,今天花点时间和大伙探讨一下。

守株待兔阶段

这个时期处于人工盯屏阶段,打开rancher(一款k8s集群管理工具)界面观察pod的状态,如果发现pod的状态变成下图(Container with unready status意味着健康检查失败)这样的时候立刻进入容器的命令行使用jmap命令收集dump信息。

 显然运气的成分多一些,比较浪费时间。

 

全自动阶段

盯屏效率太低,有没有机制能在pod重启前自动收集现场,无人值守,为开发在事后分析提供充分的证据。

 

接下来就是今天的主角登场,容器的生命周期回调,Kubernetes 为容器提供了生命周期回调。回调使容器能够了解其管理生命周期中的事件,并在执行相应的生命周期回调时运行在处理程序中实现的代码。

有两个回调暴露给容器:

PostStart

这个回调在容器被创建之后立即被执行。但是,不能保证回调会在容器入口点(ENTRYPOINT)之前执行。没有参数传递给处理程序。

PreStop

在容器因 API 请求或者管理事件(诸如存活态探针、启动探针失败、资源抢占、资源竞争等) 而被终止之前,此回调会被调用。如果容器已经处于已终止或者已完成状态,则对 preStop 回调的调用将失败。在用来停止容器的 TERM 信号被发出之前,回调必须执行结束。Pod 的终止宽限周期在 PreStop 回调被执行之前即开始计数, 所以无论回调函数的执行结果如何,容器最终都会在 Pod 的终止宽限期内被终止。没有参数会被传递给处理程序。

我们最终决定借助PreStop回调来实现自动收集现场,配置如下:

lifecycle:
          preStop:
            exec:
              command:
              - /bin/sh
              - -c
              - pid=`ps -ef |grep java | grep -v grep |awk '{print $1}'`; jmap -dump:format=b,file=/data/dump/${JAR_NAME}.dump
                ${pid}

大致意思是在容器销毁前通过jmap命令收集dump到指定目录。

有两点需要特别说明:

1.注意这个目录需要做持久化,而且要及时清理减少磁盘占用,因为日常的发布也会触发preStop;

2.另一个需要注意的是终止宽限期-terminationGracePeriodSeconds需要调整,给jmap预留充分的时间保留现场,也不能太长,调长的副作用是滚动发布会变慢。

推荐阅读

https://kubernetes.io/zh-cn/docs/concepts/containers/container-lifecycle-hooks/

  

 

标签:容器,收集,dump,重启,pod,回调
From: https://www.cnblogs.com/chopper-poet/p/17874735.html

相关文章

  • 【深度学习】[传送门] 链接收集帖
    前言  本帖子用于收集一些查阅问题时遇到的有所帮助的帖子。  或因精力不足、或因前人之述备矣、或因不想浏览器收藏夹栏过于冗重,出于上述三个主要原因,本贴简略记录学习过程中所思索过的问题以及对应的帖子或网站,并择而简评。  主要格式为:“问题大致关键词,我的问题描述,帖......
  • dump 日志收集与分析(jmap 和 jstack 工具)讲解与实战操作
    目录一、概述二、常见的dump工具三、dump可能会导致进程卡住风险(生产谨慎操作)四、安装JDK五、jmap介绍与示例讲解1)jmap介绍2)Kafka安装(单机)1、下载安装包2、配置环境变量3、配置kafka3、配置ZooKeeper4、启动kafka5、验证3)示例讲解【示例一】执行jmap命令查看内存使用情况【......
  • SQLServer2019及SQLServer FC日志收集
    日志收集:===============1.SQLServer 错误日志 SQLServer2019:<DataDrive>:\ProgramFiles\MicrosoftSQLServer\MSSQL15.<instancename>\MSSQL\Log 以上路径可能根据您的实例名称不同而有所不同。请找到相应的“LOG”文件夹并压缩以后发送给我。 2. 应用程序日......
  • Kubernetes Pods如何访问外部域名
    Pods如何访问外网域名在Kubernetes环境中,并不是所有服务都适合部署中集群中,如数据库服务,在这种情况下集群中的Pods如何访问集群外的服务,有以下几种方式CoreDNS方式新增一段配置,如下范例范例.:53{errorshealth{lameduck15s}readykuber......
  • 苹果iPhone因没有存储空间而死机和不断重启,重启白苹果黑底,恢复模式更新系统报错1110,解
    参考自:https://www.bilibili.com/video/BV1Mr4y1X7cT/?spm_id_from=333.337.search-card.all.click&vd_source=869b36c3961d4a89a184a469bc7589bb手机苹果iPhone,存储满,提示重启后白苹果,无法进入系统。操作方法:1、mac雷电接手机后,进入DFU,短按一下音量加键并松开,立刻再短按音量减......
  • [Vue] 案例:收集表单数据
    创建一个表单,利用vue完成所有逻辑准备一个容器<divid="root"> <!---@submit指定提交行为,prevent阻止默认的刷新页面行为---> <[email protected]="submitForm"> username:<inputtype="text"v-model="userInfo.username"><b......
  • 垃圾收集器
    G1垃圾收集器遵循分代收集理论设计的,但其堆内存的布局与其他收集器有非常明显的差异:G1不再坚持固定大小以及固定数量的分代区域划分,而是把连续的Java堆划分为多个大小相等的独立区域(Region),每一个Region都可以根据需要,扮演新生代的Eden空间、Survivor空间,或者老年代空间。收集器能......
  • 垃圾收集算法
    垃圾收集算法在Java内存运行时区域中,堆和方法区有着显著的不确定性:接口的多个实现类需要的内存可能不同方法执行中不同条件需要的内存空间也不同这部分内存的分配和回收是动态的。两个问题,回收谁、怎么回收回收谁——可回收垃圾(算法)当对象没有被任何地方引用时,显然是可回......
  • supervisor管理启动重启,Java,Go程序Demo
    简介Supervisor是一款Python开发的进程管理系统,允许用户监视和控制Linux上的进程,能将一个普通命令行进程变为后台守护进程,异常退出时能自动重启1、安装yum-yinstallsupervisor2、配置默认配置文件echo_supervisord_conf>/etc/supervisord.conf3、修改主配置文件......
  • K8S内POD使用内存缓慢增长问题
    背景生产环境服务容器化后,部分服务频繁触发内存使用超80%告警,POD内存限制内存以及JVM内存设置如下resources:requests: cpu:1000m memory:2200Milimits: cpu:3000m memory:3000MiJAVA_OPTS='-Xmx2000m'问题排查步骤通过查看K8Spod的监......