一篇带你学习Kubernetes Descheduler 使用( 三 )


# pdb-demo.yamlapiVersion: policy/v1kind: PodDisruptionBudgetmetadata:name: pdb-demospec:maxUnavailable: 1 # 设置最多不可用的副本数量,或者使用 minAvailable,可以使用整数或百分比selector:matchLabels: # 匹配Pod标签App: demo 
关于 PDB 的更多详细信息可以查看官方文档:https://kubernetes.io/docs/tasks/run-application/configure-pdb/ 。
所以如果我们使用 descheduler? 来重新平衡集群状态,那么我们强烈建议给应用创建一个对应的 PodDisruptionBudget 对象进行保护 。
策略PodLifeTime:驱逐超过指定时间限制的 pod该策略用于驱逐比 maxPodLifeTimeSeconds? 更旧的 Pods,可以通过 podStatusPhases 来配置哪类状态的 Pods 会被驱逐,建议为每个应用程序创建一个 PDB,以确保应用程序的可用性,比如我们可以配置如下所示的策略来驱逐运行超过 7 天的 Pod:
apiVersion: "descheduler/v1alpha1"kind: "DeschedulerPolicy"strategies:"PodLifeTime":enabled: trueparams:maxPodLifeTimeSeconds: 604800 # Pods 运行最多7天 
RemoveDuplicates该策略确保只有一个和 Pod 关联的 RS、Deployment 或者 Job 资源对象运行在同一节点上 。如果还有更多的 Pod 则将这些重复的 Pod 进行驱逐,以便更好地在集群中分散 Pod 。如果某些节点由于某些原因崩溃了,这些节点上的 Pod 漂移到了其他节点,导致多个与 RS 关联的 Pod 在同一个节点上运行,就有可能发生这种情况,一旦出现故障的节点再次准备就绪,就可以启用该策略来驱逐这些重复的 Pod 。

一篇带你学习Kubernetes Descheduler 使用

文章插图
配置策略的时候,可以指定参数 excludeOwnerKinds 用于排除类型,这些类型下的 Pod 不会被驱逐:
apiVersion: "descheduler/v1alpha1"kind: "DeschedulerPolicy"strategies:"RemoveDuplicates":enabled: trueparams:removeDuplicates:excludeOwnerKinds:- "ReplicaSet" LowNodeUtilization该策略主要用于查找未充分利用的节点,并从其他节点驱逐 Pod,以便 kube-scheduler 重新将它们调度到未充分利用的节点上 。该策略的参数可以通过字段 nodeResourceUtilizationThresholds 进行配置 。
节点的利用率不足可以通过配置 thresholds 阈值参数来确定,可以通过 CPU、内存和 Pods 数量的百分比进行配置 。如果节点的使用率均低于所有阈值,则认为该节点未充分利用 。
一篇带你学习Kubernetes Descheduler 使用

文章插图
此外,还有一个可配置的阈值 targetThresholds?,用于计算可能驱逐 Pods 的潜在节点,该参数也可以配置 CPU、内存以及 Pods 数量的百分比进行配置 。thresholds? 和 targetThresholds 可以根据你的集群需求进行动态调整,如下所示示例:
apiVersion: "descheduler/v1alpha1"kind: "DeschedulerPolicy"strategies:"LowNodeUtilization":enabled: trueparams:nodeResourceUtilizationThresholds:thresholds:"cpu": 20"memory": 20"pods": 20targetThresholds:"cpu": 50"memory": 50"pods": 50 
需要注意的是:
  • 仅支持以下三种资源类型:cpu、memory、pods
  • thresholds? 和 targetThresholds 必须配置相同的类型
  • 参数值的访问是 0-100(百分制)
  • 相同的资源类型,thresholds? 的配置不能高于 targetThresholds 的配置
如果未指定任何资源类型,则默认是 100%,以避免节点从未充分利用变为过度利用 。和 LowNodeUtilization? 策略关联的另一个参数是 numberOfNodes,只有当未充分利用的节点数大于该配置值的时候,才可以配置该参数来激活该策略,该参数对于大型集群非常有用,其中有一些节点可能会频繁使用或短期使用不足,默认情况下,numberOfNodes 为 0 。
RemovePodsViolatingInterPodAntiAffinity该策略可以确保从节点中删除违反 Pod 反亲和性的 Pod,比如某个节点上有 podA 这个 Pod,并且 podB 和 podC(在同一个节点上运行)具有禁止它们在同一个节点上运行的反亲和性规则,则 podA 将被从该节点上驱逐,以便 podB 和 podC 运行正常运行 。当 podB 和 podC 已经运行在节点上后,反亲和性规则被创建就会发送这样的问题 。
一篇带你学习Kubernetes Descheduler 使用

文章插图
要禁用该策略,直接配置成 false 即可:


推荐阅读