节点压力驱逐
官方解释: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.inodesFree | inode 相关驱逐: inode 是文件系统的一个数据结构,用于存储文件和目录的信息。当 inode 耗尽时,即使磁盘上有足够的空间,也无法再创建新的文件或目录。Kubernetes 会驱逐一些 Pod 以释放 inode,确保新的文件或目录能够被创建。 |
imagefs.available | 用于监控用于存储容器镜像的文件系统的剩余存储空间。该文件系统通常用于存储 Docker 或其他容器运行时所需的镜像和层。当可用存储空间低于预设的阈值时,Kubernetes 会驱逐一些 Pod 以释放空间。 |
imagefs.inodesFree | 用于监控用于存储容器镜像的文件系统中的可用 inode 数量。inode 是文件系统中的一个数据结构,每个文件和目录都会占用一个 inode。当 inode 耗尽时,即使磁盘上有足够的存储空间,也无法再创建新的文件或目录。 |
pid.available | PID 相关驱逐: 每个操作系统有一个限制节点上可以运行的进程数量。如果节点上的可用 PID 数量低于阈值,Kubernetes 会驱逐一些 Pod 来释放 PID,确保系统能够继续创建新的进程。 |
仅登录用户可评论,点击 登录