【发布时间】:2018-08-17 23:28:44
【问题描述】:
为了演示 kubelet 的驱逐行为,我正在尝试部署一个 Kubernetes 工作负载,该工作负载将消耗内存到 kubelet 由于内存压力而驱逐所有 BestEffort Pod 但不会杀死我的工作负载(或至少不会在 BestEffort 之前)豆荚)。
我的最佳尝试如下。它写入两个 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
此脚本的目的是将内存耗尽到节点内存使用量处于硬驱逐阈值边界的程度,从而导致 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 有时间做出反应之前就被内核杀死了。
【问题讨论】:
-
您是否以任何方式更改了驱逐政策?顺便说一句,这个问题真的很有趣,我跟着。
-
@GalloCedrone 不,这是一个普通的 GKE 集群,我没有使用任何 PriorityClasses - 是的,我认为让我找到的工作更容易
标签: kubernetes google-cloud-platform google-kubernetes-engine