kubernetes - 如何在Kubernetes中对所有BestEffort Pod进行OOM?

标签 kubernetes google-cloud-platform google-kubernetes-engine

为了演示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/

相关文章:

google-cloud-platform - 在构建时处理 secret ,以便对部署到 Cloud Run 的容器进行单元和集成测试

kubernetes - Istio |不使用 Istio 入口网关的 TLS 双向认证

jenkins - Docker 镜像无法在 Jenkins Kubernetes 构建管道中保持活力

java - 使用 Apache Beam 的 Join 类时出现问题

kubernetes - kubectl 运行本地 docker image- ImagePullBackOff 状态

c# - 如何修复不一致且缓慢的 Google Cloud Storage 响应时间?

credentials - gcr.io 上的 GKE imagePullBackOff

google-app-engine - 将 App Engine 上的应用连接到 GKE 上运行的集群

docker - 在centos上安装特定版本的kubernetes

kubernetes - 如何使用kubernetes将数据从一个容器cp到另一个容器