Kubernetes descheduler 几种使用方式

举报
Kubeservice@董江 发表于 2023/12/07 20:54:42 2023/12/07
【摘要】 Kubernetes descheduler 几种使用方式descheduler是对于现有的 kube-scheduler 精细化调度丰富. de-scheduler 当业务长期运行后, 出现warning到一定情况,通过预先设置的自动干预法策略,来重新调度资源。主要是丰富了: 掉漆中Filter、strategy环节中,实现插件middleware功能。从而影响调度决策。 desche...

Kubernetes descheduler 几种使用方式

descheduler是对于现有的 kube-scheduler 精细化调度丰富. de-scheduler 当业务长期运行后, 出现warning到一定情况,通过预先设置自动干预法策略,来重新调度资源。

主要是丰富了: 掉漆中Filterstrategy环节中,实现插件middleware功能。从而影响调度决策。

descheduler架构

Descheduler的配置主要由Policies组成. PoliciesEvictorStrategies组成。

策略决定在什么情况下应该重新分配 Pod,而 Evictor 则确定哪些 Pod 有资格重新分配.

Evictor 驱逐者

Evictor 目前采用两种内置机制,即 FilterPreEvicitionFilter 两套interface接口插件。

其中 Filter 默认放通以下pod. 有些特殊的pod,是不是被descheduler调度的. 包括:

  • Static pods
  • DaemonSet Pods
  • Terminating Pods
  • Success Pods
  • 满足特定命名空间/优先级/标签条件的 Pod

还有:

  • 具有本地存储的 Pod 永远不会被驱逐
  • 带有 PVC 的 Pod 会被驱逐
  • 带有 PDB 的 Pod 会被驱逐(利用齐本身的PDB做驱逐)

而,PreEvicitionFilter 会检查 Pod 的 NodeSelector/Affinity/Taint/Request 是否有可用于重新部署的节点。

Strategies 策略

Strategy 内置两种策略:取消计划Remove资源均衡Balance

名称 已实现的扩展点 说明
RemoveDuplicates 余额 传播副本
LowNodeUtilization Balance 根据 Pod 资源请求和可用节点资源分散 Pod
HighNodeUtilization Balance 根据 Pod 资源请求和可用节点资源分散 Pod
RemovePodsViolatingInterPodAntiAffinity 取消计划 驱逐违反 Pod 反亲和力的 Pod
RemovePodsViolatingNodeAffinity 取消计划 驱逐违反节点亲和力的 Pod
RemovePodsViolatingNodeTaints 取消计划 驱逐违反节点污点的 Pod
RemovePodsViolatingTopologySpreadConstraint 平衡 驱逐违反 TopologySpreadConstraints 的 Pod
RemovePodsHavingTooManyRestarts 取消计划 驱逐重启次数过多的 Pod
PodLifeTime 取消计划 驱逐超过指定年龄限制的 Pod
RemoveFailedPods 取消计划 因某些失败原因驱逐 Pod

具体策略介绍

建议使用:发现pod不知原因的N多次重启,将此pod驱逐到其他机器上

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemovePodsHavingTooManyRestarts"
      args:
        podRestartThreshold: 50   # 重启次数高达50次以上
        includingInitContainers: true # 是否check InitContainer的重启次数
        states:
        - CrashLoopBackOff
    plugins:
      deschedule:
        enabled:
          - "RemovePodsHavingTooManyRestarts"

建议使用: 确保只有一个 pod 与在同一节点上运行, 删除重复Pod主动驱逐

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemoveDuplicates"
      args:
        excludeOwnerKinds: # ReplicationController/ReplicaSet/StatefulSet/Job
          - "ReplicaSet"
          - "ReplicationController"
        namespaces: # namespaces 白名单和黑名单
        	  include:
          - "namespace1"
          - "namespace2"
          exclude:
          - "namespace3"
          - "namespace4"
    plugins:
      balance:
        enabled:
          - "RemoveDuplicates"

谨慎使用: 查找未充分利用的节点,并在可能的情况下从其他节点逐出 pod

PS: 依赖metrice-server Node利用率资源

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "LowNodeUtilization"
      args:
        useDeviationThresholds: true # 如果设置为true, 是集群平均资源的偏差值;如果为false, 是节点node绝对值百分比;
        thresholds:
          "cpu" : 20
          "memory": 20
          "pods": 20
        targetThresholds:
          "cpu" : 50
          "memory": 50
          "pods": 50
        numberOfNodes: 5 # 仅当未充分利用的节点数高于5时, 才激活该策略
        evictableNamespaces: # namespaces 白名单和黑名单
          include:
          - "namespace1"
          - "namespace2"
          exclude:
          - "kube-system"
    plugins:
      balance:
        enabled:
          - "LowNodeUtilization"

不建议使用: 找到未充分利用的节点,并将 pod 从节点中逐出,将 pod 紧凑地调度到更少利用率的节点

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "HighNodeUtilization"
      args:
        numberOfNodes: 5 # 仅当未充分利用的节点数高于5时, 才激活该策略
        thresholds:
          "cpu" : 20
          "memory": 20
          "pods": 20
        evictableNamespaces: # namespaces 白名单和黑名单
          exclude:
          - "kube-system"
          - "namespace1"
       	  include:
          - "namespace2"
          - "namespace3"
    plugins:
      balance:
        enabled:
          - "HighNodeUtilization"

不建议使用: 删除违反 Pod 间反亲和性的 Pod(PodA、PodB有亲和性,会祸及 PodC)

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemovePodsViolatingInterPodAntiAffinity"
      args:
        numberOfNodes: 5 # 仅当未充分利用的节点数高于5时, 才激活该策略
        labelSelector:
          matchLabels:   # label match
            component: xxxx  
          matchExpressions: 
            - {key: tier, operator: In, values: [cache]}
            - {key: environment, operator: NotIn, values: [dev]}
        namespaces: # namespaces 白名单和黑名单
          exclude:
          - "kube-system"
          - "namespace1"
       	  include:
          - "namespace2"
          - "namespace3"
    plugins:
      deschedule:
        enabled:
          - "RemovePodsViolatingInterPodAntiAffinity"

谨慎使用: 删除节点上违反 NoSchedule 污点的 Pod,将有NoSchedule的Node排除考虑调度之外

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemovePodsViolatingNodeTaints"
      args:
        excludedTaints:
        - key1=value1 # 剔除 taints 包含 key "key1" and value "value1"
        - reserved    # 剔除所有 taints 包含 key "reserved"
        namespaces:   # namespaces 白名单和黑名单
          exclude:
          - "kube-system"
          - "namespace1"
       	  include:
          - "namespace2"
          - "namespace3"
    plugins:
      deschedule:
        enabled:
          - "RemovePodsViolatingNodeTaints"

不建议使用: Pod提前驱逐,早于 的 pod maxPodLifeTimeSeconds进行驱逐

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "PodLifeTime"
      args:
        maxPodLifeTimeSeconds: 86400
        states:
        - "Pending"
        - "PodInitializing"
        labelSelector:
          matchLabels:   # label match
            component: xxxx  
          matchExpressions: 
            - {key: tier, operator: In, values: [cache]}
            - {key: environment, operator: NotIn, values: [dev]}
        namespaces: # namespaces 白名单和黑名单
          exclude:
          - "kube-system"
          - "namespace1"
       	  include:
          - "namespace2"
          - "namespace3"
    plugins:
      deschedule:
        enabled:
          - "PodLifeTime"

建议使用: 驱逐处于失败状态阶段的 Pod

apiVersion: "descheduler/v1alpha2"
kind: "DeschedulerPolicy"
profiles:
  - name: ProfileName
    pluginConfig:
    - name: "RemoveFailedPods"
      args:
        reasons: # 错位原因
        - "NodeAffinity"
        - "CrashLoopBackOff"
        includingInitContainers: true # 也需要check InitContainers的错误原因
        excludeOwnerKinds: # 过滤类型,Job类型Pod不考虑
        - "Job"
        minPodLifetimeSeconds: 360 # 逐出错位指定秒数的 Pod,单位秒
          labelSelector:
          matchLabels:   # label match
            component: xxxx  
          matchExpressions: 
            - {key: tier, operator: In, values: [cache]}
            - {key: environment, operator: NotIn, values: [dev]}
        namespaces: # namespaces 白名单和黑名单
          exclude:
          - "kube-system"
          - "namespace1"
       	  include:
          - "namespace2"
          - "namespace3"
    plugins:
      deschedule:
        enabled:
          - "RemoveFailedPods"

其他

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。