如何设置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.2system-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
相关产品推荐
相关产品推荐

