该文档为预防节点 OOM 的开源方案,不提供 SLA,仅做参考,请谨慎使用。
原理
在用户态实时获取 available 内存,当小于阈值时开始依据策略发送 sigterm 与 kill 信号杀死进程
使用方法
- -M 参数实现 oom-protector 内存杀进程阈值, 第一个参数为 sigterm 信号阈值,第二个参数为 kill 信号阈值,以’,‘分割,单位只支持 KB;
- –avoid 参数可以避免杀死符合条件的进程;
- –prefer 参数可以优先杀死符合条件的进程;
进程删除主要依据
根据 oom_score 分值来杀进程,如系统上有自行启动的进程且 oom_score_adj 未设置为-1000,就有被杀死的可能。
备注: 该程序无法阻止瞬时内存暴增引发的内存宕机,依旧需要设置 pod 合理的资源 requests 与 limits。
部署示例
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
|
apiVersion: apps/v1
kind: DaemonSet
metadata:
labels:
app: oom-protector
name: oom-protector
namespace: kube-system
spec:
selector:
matchLabels:
app: oom-protector
template:
metadata:
labels:
app: oom-protector
spec:
hostPID: true
containers:
- image: uhub.service.ucloud.cn/uk8s/earlyoom:alpine
name: earlyoom
args:
- -p
- -M
- "307200,204800"
- --avoid
- "docker|kubelet|containerd|sshd"
securityContext:
capabilities:
add:
- KILL
resources:
requests:
memory: "32Mi"
cpu: "50m"
limits:
memory: "64Mi"
cpu: "100m"
|