解决k8s调度不均

在近期的工作中,我们发现 k8s 集群中有些节点资源使用率很高,有些节点资源使用率很低,尝试重新部署应用和驱逐 Pod,发现并不能有效解决负载不均衡问题。

调度不均衡的问题可能有多个原因导致,下面是一些可能的原因:

  1. 节点资源分配不均:某些节点可能被分配了更多的资源(如CPU、内存)而导致使用率高,而其他节点可能分配较少的资源而使用率低。这可能是由于初始资源配置不均或者节点上运行的应用程序对资源的需求不同所导致。

  2. Pod亲和性设置不当:Kubernetes允许设置Pod的亲和性规则,即将Pod调度到特定的节点上。如果亲和性设置不当,可能导致一些Pod被调度到相同的高使用率节点上,而其他节点上的资源利用率较低。(目前我们未对服务做亲和性规则限制)

  3. Pod资源请求和限制不合理:Pod的资源请求和限制设置对于调度均衡也很重要。如果某些Pod的资源请求设置过高,调度器可能无法将其调度到资源利用率较低的节点上,从而导致负载不均衡。

解决方法:

编写一个脚本来定期采集节点的内存使用率,并根据阈值设置禁止调度。

#!/bin/bash

THRESHOLD=80  # 定义内存使用率的阈值,超过该阈值将禁止调度
NODES=(node1 node2 node3)  # 定义要监测的节点列表

for node in "${NODES[@]}"; do
  memory_usage=$(kubectl describe node $node | grep -i "memory pressure" | awk '{print $3}' | tr -d '%')
  
  if [[ $memory_usage -gt $THRESHOLD ]]; then
    kubectl cordon $node  # 设置节点为禁止调度
    echo "Node $node is cordoned due to high memory usage."
  else
    kubectl uncordon $node  # 放开节点的调度
    echo "Node $node is uncordoned."
  fi
done

  

脚本中使用kubectl describe node命令来获取节点的内存使用率,并通过grepawk命令提取出所需的信息。然后,根据内存使用率是否超过设定的阈值,使用kubectl cordon命令禁止调度或使用kubectl uncordon命令放开调度。

将脚本保存为.sh文件,并使用cron等工具定期执行该脚本,以实现定期检查和调度节点的功能。

posted @ 2024-05-15 16:31  瘦阿瘦  阅读(48)  评论(0编辑  收藏  举报