当宿主机上的资源不足时,Kubernetes会触发Pod驱逐,释放资源以满足紧急需求。本文将深入讨论Pod驱逐策略的触发条件、配置参数以及如何通过优化来提高集群的稳定性。
1. 驱逐触发条件
Kubernetes触发Pod驱逐的主要条件包括:
可用内存不足(memory.available): 可用内存低于阈值时触发,默认阈值为100Mi。
可用磁盘空间不足(nodefs.available): 可用磁盘空间低于阈值时触发,默认阈值为总空间的10%。
可用磁盘inodes不足(nodefs.inodesFree): 仅对Linux节点生效,可用inodes低于阈值时触发,默认阈值为总inodes的5%。
容器运行时镜像存储空间不足(imagefs.available): 可用镜像存储空间低于阈值时触发,默认阈值为总空间的15%。
2. 驱逐配置参数
在kubelet配置中,可以通过以下参数配置驱逐策略:
系统保留资源:
--system-reserved=cpu=200m,memory=1G
设置预留给系统服务的资源,提高Node节点的稳定性。
Kubernetes组件保留资源:
--kube-reserved=cpu=200m,memory=1G
设置预留给Kubernetes组件的资源,如Kubelet、Docker Daemon等。
驱逐硬阈值:
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
设置触发硬阈值时的资源限制条件。
最小驱逐资源回收:
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"
确保每次资源回收后Node的最少可用资源,避免频繁触发驱逐。
节点状态更新频率:
--node-status-update-frequency=10s
设置节点状态更新的时间间隔。
驱逐等待时间:
--eviction-pressure-transition-period=20s
驱逐等待时间,防止Node Condition在短时间内多次切换引起错误的调度决策。
3. 驱逐优化实践
3.1 调整kubelet服务配置(CentOS)
对于CentOS系统,可以通过修改/usr/lib/systemd/system/kubelet.service.d/10-kubeadm.conf文件来调整kubelet配置:
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --system-reserved=cpu=200m,memory=250Mi --kube-reserved=cpu=200m,memory=250Mi --eviction-hard=memory.available<1Gi,nodefs.available<1Gi,imagefs.available<1Gi --eviction-minimum-reclaim=memory.available=500Mi,nodefs.available=500Mi,imagefs.available=1Gi --node-status-update-frequency=10s --eviction-pressure-transition-period=30s"
3.2 调整kubelet服务配置(Ubuntu)
对于Ubuntu系统,可以通过修改/etc/systemd/system/kubelet.service.d/10-kubeadm.conf文件来调整kubelet配置:
Environment="KUBELET_KUBECONFIG_ARGS=--bootstrap-kubeconfig=/etc/kubernetes/bootstrap-kubelet.conf --kubeconfig=/etc/kubernetes/kubelet.conf --cgroups-per-qos=true --kube-reserved=cpu=500m,memory=2Gi"
4. 驱逐操作分类
在触发驱逐时,Kubelet进行的驱逐操作分为两类:
Hard Eviction: 立即进行资源回收,按照预设的硬阈值进行驱逐。
Soft Eviction: 等待一段时间后开始进行Pod驱逐,该时间由eviction-soft-grace-period和eviction-max-pod-grace-period中的最小值决定。
5. 驱逐策略与优先级
Kubelet在驱逐时,会根据Pod的QoS类别和资源使用情况进行选择:
首先删除BestEffort类别的Pod。
其次删除属于Burstable类别的Pod,且发生资源饥饿的使用量超过requests的Pod。
最后删除Guaranteed类别的Pod,仅当资源使用量超过limits或宿主机内存紧张时。
此外,根据Pod优先级进行选择,优先删除优先级较低的Pod。
6. 驱逐的优雅处理
Kubelet通过Eviction Signal记录监控到的Node节点使用情况。Eviction Signal支持多种资源监控,如memory.available、nodefs.available等。
Kubelet还通过eviction-pressure-transition-period参数防止Node Condition在驱逐操作中来回切换引起错误的调度决策。
7. 修改默认阈值
可以通过以下命令修改默认阈值:
kubelet --eviction-hard=imagefs.available<10%,memory.available<500Mi,nodefs.available<5%,nodefs.inodesFree<5% --eviction-soft=imagefs.available<30%,nodefs.available<10% --eviction-soft-grace-period=imagefs.available=2m,nodefs.available=2m --eviction-max-pod-grace-period=600
8. 驱逐的具体实施
在实施Pod的驱逐时,Kubelet根据不同的QoS类别和资源使用情况采用不同的策略:
BestEffort类别的Pod: 优先被删除,因为它们对节点资源没有硬性要求。
Burstable类别的Pod: 仅当资源使用量超过其requests且发生资源饥饿时才被删除。
Guaranteed类别的Pod: 仅在资源使用量超过其limits或节点内存紧张时才会被驱逐。
此外,Kubelet还会按照Pod的优先级进行选择,首先删除优先级较低的Pod。
9. 驱逐的优雅处理
Kubelet通过Eviction Signal记录监控到的Node节点使用情况,支持多种资源监控,如memory.available、nodefs.available等。这样可以更精确地了解节点的健康状况,有助于进行更准确的驱逐决策。
通过eviction-pressure-transition-period参数,Kubelet确保在驱逐操作中Node Condition不会在短时间内频繁切换,从而避免Scheduler做出错误的调度决策。
10. 总结与最佳实践
在Kubernetes集群中,合理配置和优化Pod的驱逐策略至关重要,这有助于提高集群的稳定性和资源利用率。通过设置系统和Kubernetes组件的保留资源、调整硬阈值和最小资源回收、优化节点状态更新频率等参数,可以更好地适应集群的实际情况。
此外,在配置时应根据具体场景调整阈值和参数,确保驱逐操作是基于实际需要而非过度敏感地触发。通过对Pod的QoS类别和优先级的理解,可以更精确地控制驱逐的顺序,保障重要服务的稳定运行。
最终,通过实施上述最佳实践,可以有效地管理节点资源,确保Pod的合理调度,提高整个Kubernetes集群的可靠性和性能。