节点压力驱逐

官方解释:https://kubernetes.io/zh-cn/docs/concepts/scheduling-eviction/node-pressure-eviction/
节点压力驱逐分为两种:

  • 节点软驱逐

    • 允许 Kubernetes 在资源利用率较高但尚未达到紧急程度时,预先发出警告并给予 Pod 时间进行调整。
    • 有助于在资源压力增大但尚未严重到需要立即驱逐的情况下,提供一个缓冲期,使系统能够平稳过渡并减少因突然驱逐导致的服务中断。
    • 配置 evictionSoft 时,通常会设置一个宽限时间 (grace period),在这段时间内,受影响的 Pod 有机会自行释放资源或调整状态以避免被驱逐。
    • 宽限时间结束后,如果资源使用情况未能改善,Kubernetes 才会实际执行驱逐操作。
  • 节点硬驱逐

    • 立即驱逐,当达到阈值时,不给予宽限期,直接触发驱逐操作。

设置节点硬驱逐

1. 修改kulelet文件/var/lib/kubelet/config.yaml

evictionHard:
  memory.available: 20%     #当可用内存低于总内存的 20% 时触发驱逐。
  pid.available: 10%        #当可用 PID 数量低于总 PID 数量的 10% 时触发驱逐。
  cpu.available: 20%        #当可用 CPU 使用率低于总 CPU 使用率的 20% 时触发驱逐。
  nodefs.available: 10%     #当节点根文件系统的可用存储空间低于总空间的 10% 时,触发驱逐机制。
  nodefs.inodesFree: 5%     #当节点根文件系统的可用 inode 数量低于总 inode 数量的 5% 时,触发驱逐机制。
  imagefs.available: 10%    #当用于存储容器镜像的文件系统的可用存储空间低于总空间的 10% 时,触发驱逐机制。
  imagefs.inodesFree: 5%    #当用于存储容器镜像的文件系统的可用 inode 数量低于总 inode 数量的 5% 时,触发驱逐机制。

2. 重启kubelet使配置生效

systemctl daemon-reload && systemctl restart kubelet

3. 测试是否和预期一致

3.1 查看各节点内存

root@master:~# free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       1.1Gi       9.4Gi       3.0Mi       5.2Gi        14Gi
Swap:            0B          0B          0B

root@node:~# free -h
              total        used        free      shared  buff/cache   available
Mem:           15Gi       1.1Gi       9.4Gi       3.0Mi       5.2Gi        14Gi
Swap:            0B          0B          0B

3.2 创建测试YAML文件

apiVersion: apps/v1
kind: Deployment
metadata:
  name: test
spec:
  replicas: 3
  selector:
    matchLabels: #rs or deployment
      app: testing
  template:
    metadata:
      labels:
        app: testing
    spec:
      containers:
      - name: testing
        image: registry.cn-shanghai.aliyuncs.com/qwx_images/test-tools:v4
        imagePullPolicy: IfNotPresent
        resources:
          limits:
            cpu: "100m" 
            memory: "6Gi" 
          requests:
            cpu: "100m" 
            memory: "6Gi" 

预期结果:

三个Pod每个Pod请求6Gi内存,其中两个Pod在master和node各一个,第三个应处于Pending状态。因15Gi内存的80%是12Gi,系统本身占用1Gi还剩14Gi,14Gi的80%是11.2Gi,如果其中一台节点运行了两个Pod将占用12Gi内存,12Gi大于11.2Gi 所以三个Pod只能runing两个,另外一个超出节点压力阈值不予运行

查看结果:

root@master:~# kubectl get pod -o wide
NAME                    READY   STATUS    RESTARTS   AGE   IP             NODE     NOMINATED NODE   READINESS GATES
test-7b6f997776-dtl9k   1/1     Running   0          27m   10.233.94.13   node     <none>           <none>
test-7b6f997776-fk6pm   0/1     Pending   0          27m   <none>         <none>   <none>           <none>
test-7b6f997776-jwmsp   1/1     Running   0          27m   10.233.70.1    master   <none>           <none>




root@master:~#kubectl describe pod test-7b6f997776-fk6pm
Events:
  Type     Reason            Age                From               Message
  ----     ------            ----               ----               -------
  Warning  FailedScheduling  28m                default-scheduler  0/2 nodes are available: 1 Insufficient memory, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
  Warning  FailedScheduling  23m (x4 over 27m)  default-scheduler  0/2 nodes are available: 1 Insufficient memory, 1 node(s) had taint {node-role.kubernetes.io/master: }, that the pod didn't tolerate.
  Warning  FailedScheduling  15m (x6 over 22m)  default-scheduler  0/2 nodes are available: 2 Insufficient memory.

设置节点软驱逐

1. 修改kulelet文件/var/lib/kubelet/config.yaml

evictionSoft:
  memory.available: "15%"     #当节点的可用内存低于 15% 时,触发软驱逐条件。
  nodefs.available: "12%"     #当节点根文件系统的可用存储空间低于 12% 时,触发软驱逐条件。
  nodefs.inodesFree: "7%"     #当节点根文件系统的可用 inode 数量低于 7% 时,触发软驱逐条件。
  imagefs.available: "15%"     #当用于存储容器镜像的文件系统的可用存储空间低于 15% 时,触发软驱逐条件。
  imagefs.inodesFree: "7%"     #当用于存储容器镜像的文件系统的可用 inode 数量低于 7% 时,触发软驱逐条件。
evictionSoftGracePeriod:
  memory.available: "1m"      #当内存使用触发软驱逐条件(即可用内存低于 15%)时,给予 Pod 1 分钟的宽限期。
  nodefs.available: "2m"      #当根文件系统的存储使用触发软驱逐条件(即可用存储空间低于 12%)时,给予 Pod 2 分钟的宽限期。
  nodefs.inodesFree: "2m"     #当根文件系统的 inode 使用触发软驱逐条件(即可用 inode 低于 7%)时,给予 Pod 2 分钟的宽限期。
  imagefs.available: "1m"     #当镜像存储文件系统的存储使用触发软驱逐条件(即可用存储空间低于 15%)时,给予 Pod 1 分钟的宽限期。
  imagefs.inodesFree: "1m"    #当镜像存储文件系统的 inode 使用触发软驱逐条件(即可用 inode 低于 7%)时,给予 Pod 1 分钟的宽限期。

2. 重启kubelet使配置生效

systemctl daemon-reload && systemctl restart kubelet

常见的驱逐信号有:

驱逐信号描述
memory.available内存相关驱逐:主要针对内存资源的过度使用。如果某个节点的内存使用率过高,剩余内存低于预定的阈值(可以是绝对值或相对值),Kubernetes 会通过驱逐低优先级的 Pod 来释放内存资源,确保系统的稳定运行。
nodefs.available文件系统存储空间驱逐: 这些驱逐信号涉及节点文件系统的存储空间。如果节点上的文件系统剩余空间不足,Kubernetes 会开始驱逐 Pod 来释放磁盘空间。nodefs 通常指节点的根文件系统,而 imagefs 则指用于存储容器镜像的文件系统。
nodefs.inodesFreeinode 相关驱逐: inode 是文件系统的一个数据结构,用于存储文件和目录的信息。当 inode 耗尽时,即使磁盘上有足够的空间,也无法再创建新的文件或目录。Kubernetes 会驱逐一些 Pod 以释放 inode,确保新的文件或目录能够被创建。
imagefs.available用于监控用于存储容器镜像的文件系统的剩余存储空间。该文件系统通常用于存储 Docker 或其他容器运行时所需的镜像和层。当可用存储空间低于预设的阈值时,Kubernetes 会驱逐一些 Pod 以释放空间。
imagefs.inodesFree用于监控用于存储容器镜像的文件系统中的可用 inode 数量。inode 是文件系统中的一个数据结构,每个文件和目录都会占用一个 inode。当 inode 耗尽时,即使磁盘上有足够的存储空间,也无法再创建新的文件或目录。
pid.availablePID 相关驱逐: 每个操作系统有一个限制节点上可以运行的进程数量。如果节点上的可用 PID 数量低于阈值,Kubernetes 会驱逐一些 Pod 来释放 PID,确保系统能够继续创建新的进程。
最后修改:2024 年 06 月 13 日
如果觉得我的文章对你有用,请随意赞赏