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 | 开发

Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐