当节点内存管理遇上 Kubernetes:自动调度与控制

这篇具有很好参考价值的文章主要介绍了当节点内存管理遇上 Kubernetes:自动调度与控制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

原理

在现代的容器化环境中,节点资源的管理是一个重要的任务。特别是对于内存资源的管理,它直接影响着容器应用的性能和可用性。在 Kubernetes 中,我们可以利用自动调度和控制的机制来实现对节点内存的有效管理。本文将介绍一种基于 Bash 脚本的节点内存管理方案,并探讨其原理、优势、缺点以及部署和应用趋势。

背景

注意到一个节点的内存使用率非常高,一些 Pods 在这个节点上无法正常运行并不断重启。经过仔细研究,发现是因为这个节点的内存资源不足,导致一些高内存需求的 Pods 无法正常运行。您决定实施一种解决方案,以确保这些高内存需求的 Pods 不会被调度到这个节点上,直到您能够通过扩容或升级硬件等方式来解决这个问题。
当节点内存管理遇上 Kubernetes:自动调度与控制当节点内存管理遇上 Kubernetes:自动调度与控制

方案

为了实现这个解决方案,您决定使用 Kubernetes 中的污点(Taint)和容忍度(Toleration)机制。您将首先添加一个污点到这个节点,以标识它当前无法容纳高内存需求的 Pods。然后,您将在这些 Pods 的 YAML 文件中添加容忍度字段,以允许它们在具有更充足内存资源的其他节点上运行。最后,您将设置 SchedulingDisabled 标志,以确保后续的 Pods 不会被调度到这个节点上,直到您解决了该节点的内存问题。

脚本

#!/bin/bash

# 功能:控制节点内存
# 如果节点内存占用率超过 90%,则禁止在该节点上调度 Pod
# 如果节点内存占用率低于平均值且平均值小于 90%,则允许在该节点上调度 Pod

# 使用 kubectl top 命令获取节点的内存占用率,并忽略掉一些特定的节点
data=$(kubectl top node | grep -v "MEMORY" | grep -v "cn-shenzhen" | sed "s/%//g")
# 计算所有节点的内存占用率的平均值
avg=$(echo "$data" | awk '{ sum += $NF } END { print sum / NR }' | awk -F. '{ print $1 }')
# 逐行读取每个节点的信息(节点名称和内存占用率)
echo "$data" | awk '{ print $1, $NF }' | while read line
do
  # 获取节点名称和内存占用率
  n=$(echo $line | awk '{ print $1 }')
  m=$(echo $line | awk '{ print $2 }')
  # 如果内存占用率超过 90%,并且该节点没有被设置为不可调度状态,则禁止在该节点上调度 Pod
  if [ "$m" -ge "90" ];then
    if kubectl get node | grep $n | grep -q "SchedulingDisabled";then
      continue
    else
      kubectl cordon $n
    fi
  # 如果内存占用率低于平均值且平均值小于 90%,并且该节点已被设置为不可调度状态,则允许在该节点上调度 Pod
  elif [ "$m" -lt "$avg" ] && [ "$avg" -lt "90" ];then
    if kubectl get node | grep $n | grep -q "SchedulingDisabled";then
      kubectl uncordon $n
    fi
  fi
done

当节点内存管理遇上 Kubernetes:自动调度与控制
当节点内存管理遇上 Kubernetes:自动调度与控制

升级版(动态)

它实现了以下功能:

使用 kubectl top 命令获取节点的内存占用率,并忽略掉特定节点(例如 “MEMORY” 和 “cn-shenzhen”)的数据。
计算所有节点的内存占用率的平均值。
遍历每个节点的内存占用率,并根据阈值动态调整节点的调度状态。
如果某个节点的内存占用率超过 90%,并且该节点没有被设置为不可调度状态,则禁止在该节点上调度 Pod(使用 kubectl cordon 命令)。
如果某个节点的内存占用率低于下限阈值,并且该节点已被设置为不可调度状态,则允许在该节点上调度 Pod(使用 kubectl uncordon 命令)。
这样,脚本会根据节点的内存占用率动态调整节点的调度状态,以确保每台机器资源使用率基本一样,并在内存占用率达到 90% 时禁止调度 Pod。

#/**********************************************************
# * Author        : 南宫乘风
# * Email         : 1794748404@qq.com
# * Last modified : 2023-07-31 16:21
# * Filename      : k8s_auto_mem.sh
# * Description   : 根据节点的内存占用率动态调整节点的调度状态,以确保每台机器资源使用率基本一样,并在内存占用率达到 90% 时禁止调度 Pod。
# * *******************************************************/
#/bin/bash


# 日志函数,接收时间、日志级别和日志内容作为参数
log() {
  local timestamp=$(date +"%Y-%m-%d %H:%M:%S")
  local level=$1
  local message=$2
  echo "[$timestamp] [$level] $message"
}

log "info" "开始执行脚本"

# 使用 kubectl top 命令获取节点的内存占用率,并忽略掉一些特定的节点
data=$(kubectl top node | grep -v "MEMORY" | grep -v "cn-shenzhen" | sed "s/%//g")

# 计算所有节点的内存占用率的平均值
avg=$(echo "$data" | awk '{ sum += $NF } END { print sum / NR }' | awk -F. '{ print $1 }')

# 逐行读取每个节点的信息(节点名称和内存占用率)
echo "$data" | awk '{ print $1, $NF }' | while read line
do
  # 获取节点名称和内存占用率
  n=$(echo $line | awk '{ print $1 }')
  m=$(echo $line | awk '{ print $2 }')

  # 输出节点名称和内存占用率日志
  log "info" "节点 $n 的内存占用率为 $m%"
  
  # 如果内存占用率超过90%,并且该节点没有被设置为不可调度状态,则禁止在该节点上调度 Pod
  if [ "$m" -ge 90 ];then
    if kubectl get node $n | grep -q "SchedulingDisabled";then
      log "info" "节点 $n 内存占用率超过90%,已经禁止调度 Pod"
    else
      log "info" "节点 $n 内存占用率超过90%,禁止调度 Pod"
      kubectl cordon $n
    fi
  else
    # 根据平均阈值动态调整阈值范围(比如将平均阈值的上限和下限设置为平均值的上下10%)
    threshold=$(echo "$avg * 0.1" | bc)
    upper_threshold=$(printf "%.0f" $(echo "$avg + $threshold" | bc))
    lower_threshold=$(printf "%.0f" $(echo "$avg - $threshold" | bc))

    # 如果内存占用率超过上限阈值,并且该节点没有被设置为不可调度状态,则禁止在该节点上调度 Pod
    if [ "$m" -ge "$upper_threshold" ];then
      if kubectl get node $n | grep -q "SchedulingDisabled";then
        log "info" "节点 $n 内存占用率过高,已经禁止调度 Pod"
      else
        log "info" "节点 $n 内存占用率过高,禁止调度 Pod"
        kubectl cordon $n
      fi
    # 如果内存占用率低于下限阈值,并且该节点已被设置为不可调度状态,则允许在该节点上调度 Pod
    elif [ "$m" -lt "$lower_threshold" ];then
      if kubectl get node $n | grep -q "SchedulingDisabled";then
        log "info" "节点 $n 内存占用率较低,允许调度 Pod"
        kubectl uncordon $n
      fi
    fi
  fi
done

log "info" "脚本执行完成"

原理

该脚本的原理是通过获取节点的内存占用率,并根据预设的阈值进行判断和操作。具体流程如下:

  1. 使用 kubectl top 命令获取节点的内存占用率,并忽略掉特定的节点。
  2. 计算所有节点的内存占用率的平均值。
  3. 逐行读取每个节点的信息,包括节点名称和内存占用率。
  4. 如果节点内存占用率超过设定的阈值(例如 90%),并且该节点没有被设置为不可调度状态,则禁止在该节点上调度 Pod。
  5. 如果节点内存占用率低于平均值且平均值小于阈值,并且该节点已被设置为不可调度状态,则允许在该节点上调度 Pod。

通过这样的原理,我们可以在集群中实现对节点内存的动态管理,确保节点资源的合理利用和容器应用的稳定运行。

优势

自动化管理: 该脚本实现了自动化的节点内存管理,无需手动干预,减轻了运维人员的负担。
实时监测:通过定期执行脚本,可以实时监测节点的内存占用情况,及时做出调整,提高了容器应用的性能和可用性。
智能决策:根据设定的阈值和平均值,脚本能够智能地决策是否禁止或允许在节点上调度 Pod,确保资源的合理分配。

缺点

依赖性: 该脚本依赖于 Kubernetes 命令行工具 kubectl 和集群的配置,因此需要保证环境的正确配置和可用性。
单一维度: 该脚本仅基于节点的内存占用率进行管理,没有考虑其他资源(如 CPU、存储)的情况,因此在综合资源管理方面还有待完善。文章来源地址https://www.toymoban.com/news/detail-466597.html

到了这里,关于当节点内存管理遇上 Kubernetes:自动调度与控制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 利用 Kubernetes 内置 PodTemplate 管理 Jenkins 构建节点

    作者:Rick Jenkins 可以很好地与 Kubernetes 集成,不管是控制器(controller)还是构建节点(agent),都能以 Pod 的形式运行在 Kubernetes 上。 熟悉 Jenkins 的用户,都知道 Jenkins 支持多种类型的构建节点,例如:固定配置、动态配置。而节点与控制器连接的方式, 又包括:JNLP、SSH

    2024年02月04日
    浏览(21)
  • Kubernetes 启动Pod的方法-Pod的调度算法-Pod间的通信-k8s的控制器-Pod资源控制-发布Service服务

    目录 Pod 参考文档:Pod | Kubernetes Pod配置文件:simple-pod.yaml 对master进行如下操作 Pod的状态有: 参考文档:(70条消息) Pod生命周期中的状态解释_pod状态_闹玩儿扣眼珠子的博客-CSDN博客 进入Pod内的nginx容器: 当我们创建一个Pod,其中的步骤是什么?(启动Pob的流程) 大概步骤:

    2024年02月13日
    浏览(50)
  • mediapipe 手势节点识别自动控制音量

    参考:https://www.computervision.zone/topic/volumehandcontrol-py/ 主函数: VolumeHandControl.py

    2024年02月11日
    浏览(29)
  • 【探索 Kubernetes|作业管理篇 系列 11】控制器的核心功能

    大家好,我是秋意零。 上一篇结束了 Pod 对象的内容。 今天要探讨的内容是 “控制器”,它是 Kubernetes 编排最核心的功能。理解了 “控制器”,你就能理解 Deployment、StatefulSet、DaemontSet、Job、CroJob 控制器对象。 最近搞了一个扣扣群,旨在技术交流、博客互助,希望各位大佬

    2024年02月11日
    浏览(24)
  • Docker和Kubernetes与容器自动化管理:最佳实践

    作者:禅与计算机程序设计艺术 容器技术在企业级应用中扮演着重要角色,通过容器化部署应用程序可以极大的降低IT成本、缩短交付周期、提高资源利用率。对于容器技术来说,Docker和Kubernetes无疑是其两大支柱产品。由于Docker和Kubernetes都提供了统一的编排接口(API),使

    2024年02月07日
    浏览(42)
  • 自动化的运维管理:探究Kubernetes工作机制的奥秘

    Kubernetes 是一个生产级别的 容器编排平台 和 集群管理系统 ,能够 创建 、 调度容器 , 监控 、 管理服务器 。 容器是什么?容器是软件,是应用,是进程。 服务器是什么?服务器是硬件,是 CPU、内存、硬盘、网卡等。 那么,既可以管理软件,也可以管理硬件,就是一个操

    2024年01月16日
    浏览(37)
  • 当音乐遇上Python:用Pydub自动分割音频

    🎵 🎵 🎵 当音乐遇上Python:用Pydub自动分割音频 随着短视频应用的普及,越来越多人开始了解并尝试制作自己的短视频作品。而在制作短视频时,背景音乐的选择和使用也是非常重要的一步。很多人喜欢选择一首长音乐,再通过剪辑软件将其剪成多段来使用,这种做法虽然

    2024年02月02日
    浏览(26)
  • 【Kubernetes】Kubernetes的调度

      Kubernetes 是通过 List-Watch 的机制进行每个组件的协作,保持数据同步的,每个组件之间的设计实现了解耦。   用户是通过 kubectl 根据配置文件,向 APIServer 发送命令,在 Node 节点上面建立 Pod 和 Container。 APIServer 经过 API 调用,权限控制,调用资源和存储资源的过程,实

    2024年02月13日
    浏览(36)
  • Kubernetes的默认调度和自定义调度详解

    默认调度是 Kubernetes 中的内置机制,它使用调度器组件来管理分配容器的节点。调度器依据以下原则选择合适的节点: 资源需求 :调度器会为每个 Pod 根据其 CPU 和内存需求选择一个具有足够资源的节点。 亲和性和容忍性 :通过亲和性规则和容忍性设置,可以将 Pod 调度到满

    2024年02月13日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包