为k8s节点预留资源,防止pod占用资源过多导致雪崩

Kubernetes 的节点可以按照节点的资源容量进行调度,默认情况下 Pod 能够使用节点全部可用容量。这样就会造成一个问题,因为节点自己通常运行了不少驱动 OS 和 Kubernetes 的系统守护进程。除非为这些系统守护进程留出资源,否则它们将与 Pod 争夺资源并导致节点资源短缺问题。

当我们在线上使用 Kubernetes 集群的时候,如果没有对节点配置正确的资源预留,我们可以考虑一个场景,由于某个应用无限制的使用节点的 CPU 资源,导致节点上 CPU 使用持续100%运行,而且压榨到了 kubelet 组件的 CPU 使用,这样就会导致 kubelet 和 apiserver 的心跳出问题,节点就会出现 Not Ready 状况了。默认情况下节点 Not Ready 过后,5分钟后会驱逐应用到其他节点,当这个应用跑到其他节点上的时候同样100%的使用 CPU,是不是也会把这个节点搞挂掉,同样的情况继续下去,也就导致了整个集群的雪崩,集群内的节点一个一个的 Not Ready 了,后果是非常严重的,或多或少的人遇到过 Kubernetes 集群雪崩的情况,这个问题也是面试的时候镜像询问的问题。

要解决这个问题就需要为 Kubernetes 集群配置资源预留,kubelet 暴露了一个名为 Node Allocatable 的特性,有助于为系统守护进程预留计算资源,Kubernetes 也是推荐集群管理员按照每个节点上的工作负载来配置 Node Allocatable。

我的k8s集群版本v1.23.x

#查看节点资源,再master节点执行下面命令
$ kubectl describe node test-k8s-node00x

知识性文档我就不写了,网上到处都是,文末放几个链接,大家去看看就了解了个参数含义

直接修改这几个参数配置文件,重启kubelet.service即可生效;也可以以命令行参数的形式写入kubelet.service,参考文末文档,本文采用修改配置文件的方式。

# 查看kubelet服务命令参数,中--config=/var/lib/kubelet/config.yaml
$ systemctl status kubelet
# 添加资源限制参数到下面这个文件
$ vim /var/lib/kubelet/config.yaml
#为kube预留资源
kubeReserved:
  cpu: 250m
  memory: 500Mi
  ephemeral-storage: 1Gi
#为系统预留资源
systemReserved:
  cpu: 250m
  memory: 500Mi
  ephemeral-storage: 1Gi
#资源不足是驱逐pod到其他节点的条件
evictionHard:
  imagefs.available: 15%
  memory.available: 300Mi
  nodefs.available: 10%
  nodefs.inodesFree: 5%

红色框内是增加或改动的部分 ,需要再每个node节点上做修改和重启kubelet服务。具体参数设置多少,可以参考文末文档,有最佳实践,我这里就凭感觉来预留的资源。

 

参考文档:

为系统守护进程预留计算资源 | Kubernetes 

Kubernetes 资源预留配置 - 腾讯云开发者社区-腾讯云

k8s节点资源预留与 pod 驱逐 | Vermouth | 博客 | docker | k8s | python | go | 开发

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kubernetes集群中的单个节点资源使用率过高时,可以采取以下措施来解决问题: 1. 找出资源使用率高的Pod:使用kubectl命令查看节点上运行的Pod,并根据资源使用情况找出资源使用率高的Pod。 ```shell kubectl top pod --all-namespaces ``` 2. 调整Pod资源请求和限制:根据资源使用率高的Pod,可以通过修改Pod资源请求和限制来调整资源分配。可以通过编辑Pod的配置文件或使用kubectl命令进行修改。 ```shell kubectl edit pod <pod-name> ``` 在配置文件中,可以通过spec.containers.resources字段来设置资源请求和限制。例如,可以增加或减少CPU和内存的请求和限制。 3. 水平扩展Pod:如果资源使用率高的Pod无法通过调整资源请求和限制来解决问题,可以考虑水平扩展Pod。通过增加Pod的副本数量,可以将负载分散到多个Pod上,从而降低单个Pod资源使用率。 ```shell kubectl scale deployment <deployment-name> --replicas=<new-replica-count> ``` 4. 调整节点资源:如果以上措施无法解决问题,可以考虑调整节点资源。可以通过增加节点的CPU和内存来提高节点资源容量,或者通过调整节点的调度策略来将负载分散到其他节点上。 ```shell kubectl cordon <node-name> # 阻止新的Pod被调度到该节点上 kubectl drain <node-name> # 将节点上的Pod迁移到其他节点上 ``` 注意:在调整节点资源之前,需要确保集群中有足够的可用资源

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值