You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何设置microk8s全局内存上限 避免单节点集群资源耗尽宕机

MicroK8s单节点全局资源过载保护方案

你需要的能力Kubernetes原生已经提供,通过节点资源预留+ kubelet硬驱逐策略组合即可实现:既允许Pod资源超售保证利用率,又能在节点总资源触达阈值时自动驱逐Pod,彻底避免节点资源被打满导致无响应。

1. 配置资源预留与驱逐阈值

这一步是核心,先给宿主机操作系统、MicroK8s自身管控组件预留保底资源,再配置触发驱逐的资源阈值:

  • 打开MicroK8s kubelet配置文件:/var/snap/microk8s/current/args/kubelet
  • 末尾追加以下配置(可根据你的8G内存节点调整数值):
    --system-reserved=memory=1.5Gi,cpu=1
    --kube-reserved=memory=512Mi,cpu=0.5
    --eviction-hard=memory.available<1Gi,cpu.available<0.2
    
    参数说明:
    • system-reserved:给宿主机基础进程(sshd、systemd等)预留的资源,避免Pod占满资源后连SSH都连不上
    • kube-reserved:给MicroK8s自身管控组件(kubelet、containerd、apiserver等)预留的资源,保证集群管控能力正常
    • eviction-hard:你需要的全局阈值,当节点可用内存低于1Gi、可用CPU低于0.2核时,立刻触发Pod驱逐,永远不会让资源打满到节点崩溃的程度
  • 重启MicroK8s生效配置:microk8s stop && microk8s start

2. 配置Pod优先级明确驱逐顺序

默认触发驱逐时,kubelet会优先杀死资源使用量超出request比例更高、优先级更低的Pod,你可以给预发环境的Pod划分优先级,优先保留核心业务的预发Pod:
首先创建优先级类对象:

apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: preprod-core
value: 1000
globalDefault: false
description: "核心预发业务Pod优先级"
---
apiVersion: scheduling.k8s.io/v1
kind: PriorityClass
metadata:
  name: preprod-common
value: 100
globalDefault: true
description: "普通预发Pod默认优先级"

需要高优先级的Pod在spec中添加priorityClassName: preprod-core即可,未指定的Pod默认使用低优先级。

3. 保留原有Pod资源配置保证利用率

你之前的request: 50Mi、limit:500Mi的配置完全可以继续使用:

  • 30个Pod总request仅1.5Gi,远低于节点可调度容量(8Gi减去2G预留后剩余6Gi),所有Pod都能正常调度
  • 低负载时总内存占用仅1.5Gi左右,利用率极高
  • 出现峰值多Pod内存上涨时,触达驱逐阈值后自动杀死低优先级Pod释放资源,不会打满节点

多命名空间适配优化

你提到每个Pod运行在独立命名空间,可以通过LimitRange给所有命名空间的Pod自动注入默认资源配置,无需逐个Pod手动设置:

apiVersion: v1
kind: LimitRange
metadata:
  name: default-res-config
spec:
  limits:
  - default:
      memory: 500Mi
      cpu: 1
    defaultRequest:
      memory: 50Mi
      cpu: 0.1
    type: Container

每个命名空间创建时部署该LimitRange即可。

内容的提问来源于stack exchange,提问作者Martin Melka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:51:02