kubernetes集群之GC处理
一.简单说明
GC(Garbage Collector)即垃圾收集清理,kubernetes集群中,kubelet的GC功能将会清理未使用的image和container。其中kubelet对container每分钟执行一次GC,对image每5分钟执行一次GC。这样可以保障kubernetes集群资源紧缺的情况下,保证其NODE节点的稳定性。
二.kubernetes的驱逐策略
kubelet能够主动检测和防止计算资源的全面短缺,这种情况下,kubelet可以主动的结束一个或多个pod以回收短缺的资源,如果被驱逐的Pod由Deployment管理,这里Deployment会创建另一个Pod给kubernetes来调度。
三.kubernetes的驱逐信号
kubelet支持按照以下表格中描述的信号触发驱逐
驱逐信号 | 描述 |
---|---|
memory.available | memory.available := node.status.capacity[memory] - node.stats.memory.workingSet |
nodefs.available | nodefs.available := node.stats.fs.available |
nodefs.inodesFree | nodefs.inodesFree := node.stats.fs.inodesFree |
imagefs.available | imagefs.available := node.stats.runtime.imagefs.available |
imagefs.inodesFree | imagefs.inodesFree := node.stats.runtime.imagefs.inodesFree |
上面的每个信号都支持字面值或百分比的值,基于百分比的值的计算与每个信号对应的总容量有关。
- memory.available
memory.available的值从cgroupfs获取,而不是通过类似free -m
的工具,因为free -m
不能在容器中工作。
kubelet支持两种文件系统分区:
- nodefs
nodefs文件系统,kubelet将其用于卷和守护程序日志等。 - imagefs
imagefs文件系统,容器运行时用于保存镜像和容器可写层。
四.驱逐阈值
kubelet支持指定驱逐阈值,用于触发kubelet回收资源。
阈值配置形式如下:
[eviction-signal][operator][quantity]
- eviction-signal:这里是驱逐的信号
- operator:是所需的关系运算符,例如
<
- quantity:是驱逐阈值值标志,例如1Gi,也可以使用
%
标记表示百分比
举例说明:
如果一个节点由10Gi内存,希望在可用内存下降到1Gi以下时,引起驱逐操作,则驱逐阈值可以使用下面任意一种方式指定(但不是两者同时):
- memory.available<10%
或 - memory.available<1Gi
4.1 软驱逐阈值
软驱逐阈值使用一对由驱逐阈值和管理员必须指定的宽限期组成的配置对。在超过宽限期前,kubelet不会采取任何动作回收和驱逐信号关联的资源。如果没有提供宽限期,kubelet启动时将报错。
此外,如果达到了软驱逐阈值,操作员可以指定从节点驱逐 pod 时,在宽限期内允许结束的 pod 的最大数量。如果指定了pod.Spec.TerminationGracePeriodSeconds
值,kubelet将使用它和宽限期二者中较小的一个。如果没有指定,kubelet将立即终止 pod,而不会优雅结束它们。
软驱逐阈值的配置支持下列标记:
- eviction-soft
描述了驱逐阈值的集合(例如 memory.available<1.5Gi),如果在宽限期之外满足条件将触发 pod 驱逐。 - eviction-soft-grace-period
描述了驱逐宽限期的集合(例如 memory.available=1m30s),对应于在驱逐 pod 前软驱逐阈值应该被控制的时长。 - eviction-max-pod-grace-period
描述了当满足软驱逐阈值并终止 pod 时允许的最大宽限期值(秒数)。
4.2 硬驱逐阈值
硬驱逐阈值没有宽限期,一旦察觉,kubelet将立即采取行动回收关联的短缺资源。如果满足硬驱逐阈值,kubelet将立即结束 pod 而不是优雅终止。
硬驱逐阈值的配置支持下列标记:
- eviction-hard
描述了驱逐阈值的集合(例如 memory.available<1Gi),如果满足条件将触发 pod 驱逐。
kubelet 有如下所示的默认硬驱逐阈值:
- memory.available<100Mi
- nodefs.available<10%
- nodefs.inodesFree<5%
- imagefs.available<15%
五.kubernetes最小驱逐回收
在某些场景,驱逐 pod 会导致回收少量资源。这将导致 kubelet 反复碰到驱逐阈值。除此之外,对如 disk 这类资源的驱逐时比较耗时的。
为了减少这类问题,kubelet可以为每个资源配置一个 minimum-reclaim。当 kubelet 发现资源压力时,kubelet将尝试至少回收驱逐阈值之下 minimum-reclaim 数量的资源。
例如使用下面的配置:
--eviction-hard=memory.available<500Mi,nodefs.available<1Gi,imagefs.available<100Gi
--eviction-minimum-reclaim="memory.available=0Mi,nodefs.available=500Mi,imagefs.available=2Gi"`
如果 memory.available 驱逐阈值被触发,kubelet将保证 memory.available 至少为 500Mi。对于 nodefs.available,kubelet将保证 nodefs.available 至少为 1.5Gi。对于 imagefs.available,kubelet将保证 imagefs.available 至少为 102Gi,直到不再有相关资源报告压力为止。
所有资源的默认 eviction-minimum-reclaim 值为 0。
注意:当磁盘驱逐成熟时,下面的 kubelet 标志将被标记为废弃的,以简化支持驱逐的配置。
现有标签 | 新标签 |
---|---|
--image-gc-high-threshold | --eviction-hard or eviction-soft |
--image-gc-low-threshold | --eviction-minimum-reclaim |
--maximum-dead-containers | deprecated |
--maximum-dead-containers-per-container | deprecated |
--minimum-container-ttl-duration | deprecated |
--low-diskspace-threshold-mb | --eviction-hard or eviction-soft |
--outofdisk-transition-frequency | --eviction-pressure-transition-period |
参考官网链接:https://kubernetes.io/zh/docs/tasks/administer-cluster/out-of-resource/