为了演示kubelet的逐出行为,我正在尝试部署一个Kubernetes工作负载,该工作负载将消耗内存,以至于kubelet由于内存压力而将所有BestEffort Pods逐出,但不会杀死我的工作负载(或至少在BestEffort Pods之前没有)。
我最大的尝试是在下面。它写入两个tmpfs卷(因为默认情况下,tmpfs卷的限制是节点总内存的一半)。 100
来自在kubelet上设置了--eviction-hard=memory.available<100Mi
的事实:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: fallocate
namespace: developer
spec:
selector:
matchLabels:
app: fallocate
template:
metadata:
labels:
app: fallocate
spec:
containers:
- name: alpine
image: alpine
command:
- /bin/sh
- -c
- |
count=1
while true
do
AVAILABLE_DISK_KB=$(df /cache-1 | grep /cache-1 | awk '{print $4}')
AVAILABLE_DISK_MB=$(( $AVAILABLE_DISK_KB / 1000 ))
AVAILABLE_MEMORY_MB=$(free -m | grep Mem | awk '{print $4}')
MINIMUM=$(( $AVAILABLE_DISK_MB > $AVAILABLE_MEMORY_MB ? $AVAILABLE_MEMORY_MB : $AVAILABLE_DISK_MB ))
fallocate -l $(( $MINIMUM - 100 ))MB /cache-1/$count
AVAILABLE_DISK_KB=$(df /cache-2 | grep /cache-2 | awk '{print $4}')
AVAILABLE_DISK_MB=$(( $AVAILABLE_DISK_KB / 1000 ))
AVAILABLE_MEMORY_MB=$(free -m | grep Mem | awk '{print $4}')
MINIMUM=$(( $AVAILABLE_DISK_MB > $AVAILABLE_MEMORY_MB ? $AVAILABLE_MEMORY_MB : $AVAILABLE_DISK_MB ))
fallocate -l $(( $MINIMUM - 100 ))MB /cache-2/$count
count=$(( $count+1 ))
sleep 1
done
resources:
requests:
memory: 2Gi
cpu: 100m
limits:
cpu: 100m
volumeMounts:
- name: cache-1
mountPath: /cache-1
- name: cache-2
mountPath: /cache-2
volumes:
- name: cache-1
emptyDir:
medium: Memory
- name: cache-2
emptyDir:
medium: Memory
该脚本的目的是耗尽内存,以至于Node内存使用量处于硬驱逐阈值边界内,从而导致kubelet开始逐出。它驱逐了某些BestEffort Pod,但在大多数情况下,在驱逐所有BestEffort Pod之前先杀死工作负载。有更好的方法吗?
我在集群版本为1.9.3-gke.0的GKE上运行。
编辑:
我也尝试使用simmemleak:
apiVersion: apps/v1
kind: DaemonSet
metadata:
name: simmemleak
namespace: developer
spec:
selector:
matchLabels:
app: simmemleak
template:
metadata:
labels:
app: simmemleak
spec:
containers:
- name: simmemleak
image: saadali/simmemleak
resources:
requests:
memory: 1Gi
cpu: 1m
limits:
cpu: 1m
但是,这种工作量在任何驱逐之前一直在消亡。我认为问题在于,在kubelet有时间使用react之前,它已被内核杀死。
最佳答案
为避免系统OOM在逐出kubelet之前生效,您可以配置kubepods内存限制--system-reserved
和--enforce-node-allocatable
Read more。
例如,Node具有32Gi的内存,配置为将kubepods内存限制为最大20Gi
--eviction-hard=memory.available<500Mi
关于kubernetes - 如何在Kubernetes中对所有BestEffort Pod进行OOM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49192964/