kubernetes中不可见的OOM
最近看了一篇文章:Tracking Down “Invisible” OOM Kills in Kubernetes,其讲述的是由于内存不足导致Pod中的进程被killed,但Pod并没有重启,也没有任何日志或kubernetes事件,只有一个"Exit Code: 137"的信息,导致难以进一步定位问题。最后还是通过查看节点系统日志才发现如下信息:
kernel: Memory cgroup out of memory: Killed process 18661 (helm) total-vm:748664kB, anon-rss:41748kB, file-rss:0kB, shmem-rss:0kB, UID:999 pgtables:244kB oom_score_adj:992
kernel: oom_reaper: reaped process 18661 (helm), now anon-rss:0kB, file-rss:0kB, shmem-rss:0kB
在上述文章中,作者做了个总结:
When the Linux OOM Killer activated, it selected a process within the container to be killed. Apparently only when OOM selects the container’s init process
PID 1will the container itself be killed and have a status ofOOMKilled. If that container was marked as restartable, then Kubernetes would restart the container and then you would see an increase in restart count.As I’ve seen, when
PID 1is not selected then some other process inside the container is killed. This makes it “invisible” to Kubernetes. If you are not watching thettyconsole device or scanning kernel logs, you may not know that part of your containers are being killed. Something to consider when you enable container memory limits.
大意就是只有Pod中的PID 1被OOM kill时才会出现OOMKilled状态,并重启容器,此时我们可以清楚地看到OOM信息。
但在出现问题的场景中,被kill的并不是PID 1,这就导致容器或kubernetes无法记录相关信息,且不会重启容器。这种情况下只能通过查看系统日志才能发现相关信息。
文中也提出了一种解决该问题的方式:VPA。
PS
我之前也遇到过类似的问题,当问题出现时,也只是有个"Exit Code: 137"信息,Pod正常运行,没有任何错误日志和事件,但其实Pod内的某个进程已经被killed,无法执行正常功能。
出现"被隐藏的OOM"的原因可能是Pod中单独启动了多个独立的进程(进程间无父子关系),在我的场景中就是单独启动了一个脚本进程,当内存不足的时候会导致kill脚本进程。因此还有一种解决思路就是,如果要启动多个独立的进程,还可以将其作为sidecar方式,避免出现这种问题。
kubernetes中不可见的OOM的更多相关文章
- Kubernetes中 Pod 是怎样被驱逐的?
前言 在 Kubernetes 中,Pod 使用的资源最重要的是 CPU.内存和磁盘 IO,这些资源可以被分为可压缩资源(CPU)和不可压缩资源(内存,磁盘 IO).可压缩资源不可能导致 Pod 被驱 ...
- docker对cpu使用及在kubernetes中的应用
docker对CPU的使用 docker对于CPU的可配置的主要几个参数如下: --cpu-shares CPU shares (relative weight) --cpu-period Limit ...
- 【转】干货,Kubernetes中的Source Ip机制。
准备工作 你必须拥有一个正常工作的 Kubernetes 1.5 集群,用来运行本文中的示例.该示例使用一个简单的 nginx webserver 回送它接收到的请求的 HTTP 头中的源 IP 地址 ...
- kubernetes中的Pause容器如何理解?
前几篇文章都是讲的Kubernetes集群和相关组件的部署,但是部署只是入门的第一步,得理解其中的一些知识才行.今天给大家分享下Kubernets的pause容器的作用. Pause容器 全称infr ...
- Kubernetes中的RBAC
Kubernetes中,授权有ABAC(基于属性的访问控制).RBAC(基于角色的访问控制).Webhook.Node.AlwaysDeny(一直拒绝)和AlwaysAllow(一直允许)这6种模式. ...
- Kubernetes 中的渐进式交付:蓝绿部署和金丝雀部署
渐进式交付是持续交付的下一步, 它将新版本部署到用户的一个子集,并在将其滚动到全部用户之前对其正确性和性能进行评估, 如果不匹配某些关键指标,则进行回滚. 这里有一些有趣的项目,使得渐进式交付在 Ku ...
- 如何将云原生工作负载映射到 Kubernetes 中的控制器
作者:Janakiram MSV 译者:殷龙飞 原文地址:https://thenewstack.io/how-to-map-cloud-native-workloads-to-kubernetes- ...
- 关于 Kubernetes 中的 Volume 与 GlusterFS 分布式存储
容器中持久化的文件生命周期是短暂的,如果容器中程序崩溃宕机,kubelet 就会重新启动,容器中的文件将会丢失,所以对于有状态的应用容器中持久化存储是至关重要的一个环节:另外很多时候一个 Pod 中可 ...
- Kubernetes 中的核心组件与基本对象概述
Kubernetes 是 Google 基于 Borg 开源的容器编排调度,用于管理容器集群自动化部署.扩容以及运维的开源平台.作为云原生计算基金会 CNCF(Cloud Native Computi ...
- Kubernetes中的Configmap和Secret
本文的试验环境为CentOS 7.3,Kubernetes集群为1.11.2,安装步骤参见kubeadm安装kubernetes V1.11.1 集群 应用场景:镜像往往是一个应用的基础,还有很多需要 ...
随机推荐
- 云小课|手把手教您在PyCharm中连接云端资源进行代码调试
摘要:让我们看看如何在PyCharm中连接云端资源进行代码调试吧! 本文分享自华为云社区<[云小课]EI第54课 手把手教您在PyCharm中连接云端资源进行代码调试>,作者:Hello ...
- Solon 开发进阶,五、全局异常订阅
Solon 开发进阶 一.插件扩展机制 二.体外扩展机制 三.常用配置说明 四.启动参数说明 五.全局异常订阅 所谓"全局异常",是指通过事件总线发布的异常.目前框架会把未吃掉的异 ...
- .Net Core NLog 配置
using NLog; private static Logger logger = LogManager.GetCurrentClassLogger(); //初始化日志类 NLog.config ...
- 无法访问Docker 里的 mysql, redis
[root@centos-linux jimmy]# firewall-cmd --state not running [root@centos-linux jimmy]# sysctl net.ip ...
- k8s-部署 Kubernetes 集群(kubeadm方式)
一 机器准备 IP 主机名 角色 配置 安装组件 192.168.198.150 master-1 master 2U2G master组件 etcd kubectl 192.168.198.151 ...
- modint 板子
自动对 int 取模 // modint template<int MOD> struct Fp { ll val; constexpr Fp(ll v = 0) noexcept : v ...
- 【调试】ftrace(三)trace-cmd和kernelshark
之前使用ftrace的时候需要一系列的配置,使用起来有点繁琐,这里推荐一个ftrace的一个前端工具,它就是trace-cmd trace-cmd安装教程 安装trace-cmd及其依赖库 git c ...
- websocket扫码登录
二维码由web端生成,解析结果 https://www.qycloud.com.cn/home/welcome?{"type":"login","da ...
- latex · markdown | 如何写矩阵和大公式
1 \left[\begin{array}{c} a & b \\ c & d \end{array}\right] 效果: \[\left[\begin{array}{c} a &a ...
- for-each循环使用iterator进行遍历
示例如下: public static void main(String args[]) { List list = new LinkedList(); list.add("aa" ...