影响K8S Pod分配和调度策略的两大关键特性
admin
2023-01-24 20:42:43
0

在Kubernetes中有一个最复杂的调度器可以处理pod的分配策略。基于在pod规范中所提及的资源需求,Kubernetes调度器会自动选择最合适的节点来运行pod。

 
但在许多实际场景下,我们必须干预调度过程才能在pod和一个节点或两个特定pod之间进行匹配。因此,Kubernetes中有一种十分强大的机制来管理及控制pod的分配逻辑。

 

那么,本文将探索影响Kubernetes中默认调度决定的关键特性。
 

节点亲和性/反亲和性

 

Kubernetes一向以来都是依赖label和selector来对资源进行分组。例如,某服务使用selector来过滤具有特定label的pod,这些label可以选择性地接收流量。Label和selector可以使用简单的基于等式的条件(=and!=)来评估规则。通过nodeSelector的特性(即强制将pod调度到特定节点上),可以将这一技术扩展到节点中。
 
影响K8S Pod分配和调度策略的两大关键特性
 
此外,label和selector开始支持基于集合的query,它带来了基于in、notin和exist运算符的高级过滤技术。与基于等式的需求相结合,基于集合的需求提供了复杂的技术来过滤Kubernetes中的资源。

 

节点亲和性/反亲和性使用label和annotation的基于表达集的过滤技术来定义特定节点上的pod的分配逻辑。Annotation可以提供不会暴露到selector的其他元数据,这意味着用于annotation的键不会包含在query和过滤资源中。但是节点亲和性可以在表达式中使用annotation。反亲和性可以确保pod不会被强制调度到与规则匹配的节点上。

 

除了能够在query中使用复杂的逻辑之外,节点亲和性/反亲和性能够为分配逻辑强制施加硬性和软性规则。硬性规则将会执行严格的策略,可能会阻止将pod分配到不符合条件的节点上。而软性规则则会首先确认节点是否与特定的条件相匹配,如果它们不匹配,它将使用默认的调度模式来分配Pod。表达式requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution将会分别执行硬性规则和软性规则。

 

以下是在硬性和软性规则下使用节点亲和性/反亲和性的示例:
 

affinity:
  nodeAffinity:
    preferredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
          - key: "failure-domain.beta.kubernetes.io/zone"
            operator: In
            values: ["asia-south2-a"]

 
以上规则将指示Kubernetes调度器尝试将Pod分配到在GKE集群的asia-south2-a区域中运行的节点上。如果没有可用的节点,则调度器将会直接应用标准的分配逻辑。
 

affinity:
  nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
      nodeSelectorTerms:
        - matchExpressions:
          - key: "failure-domain.beta.kubernetes.io/zone"
            operator: NotIn
            values: ["asia-south2-a"]

 
以上规则通过使用NotIn运算符来强制执行反亲和性。这是一个硬性规则,它能够确保没有pod被分配到运行在asia-south2-a空间中的GKE节点。
 

Pod亲和性/反亲和性

 

尽管节点亲和性/反亲和性能够处理pod和节点之间的匹配,但是有些场景下我们需要确保pod在一起运行或在相同的节点上不运行2个pod。Pod亲和性/反亲和性将帮助我们应用强制实施粒度分配逻辑。

 

与节点亲和性/反亲和性中的表达式类似,pod亲和性/反亲和性也能够通过requiredDuringSchedulingIgnoredDuringExecutionpreferredDuringSchedulingIgnoredDuringExecution强制实施硬性以及软性规则。还可以将节点亲和性与pod亲和性进行混合和匹配,以定义复杂的分配逻辑。

 
为了能够更好地理解概念,想象一下我们有一个web和缓存deployment,其中三个副本在一个3节点的集群中运行。为了确保在web和缓存pod之间低延迟,我们想要在用一个节点上运行它们。与此同时,我们不想在相同的节点上运行超过1个缓存pod。基于此情况,我们需要实施以下策略:每个节点仅运行1个且只有1个缓存Pod的web pod。

 

首先,我们将使用反亲和性规则来部署缓存,它将阻止超过1个pod运行在1个节点上:
 

      affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - redis
            topologyKey: "kubernetes.io/hostname"

 
topoloyKey使用附加到节点的默认label动态过滤节点的名称。请注意,我们使用podAntiAffinity表达式和in运算符来应用规则的方式。
 

假设在集群的某个节点上安排了3个pod缓存,那么现在我们想要在与缓存Pod相同的节点上部署web pod。我们将使用podAffinity来实施这一逻辑:
 

        podAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
          - labelSelector:
              matchExpressions:
              - key: app
                operator: In
                values:
                - redis
            topologyKey: "kubernetes.io/hostname"

 
以上代码表明Kubernetes调度器要寻找有缓存Pod的节点并部署web pod。

 
除了节点和pod的亲和性/反亲和性之外,我们还能使用taints和tolerations来定义自定义分配逻辑。此外,我们还能写自定义调度程序,它可以从默认的调度程序中接管调度逻辑。

相关内容

热门资讯

玩家最新攻略“凑一桌游戏.究竟... 有 亲,根据资深记者爆料凑一桌游戏是可以开挂的,确实有挂(咨询软件无需打...
终于懂了“掌中乐游戏中心.到底... 家人们!今天小编来为大家解答掌中乐游戏中心透视挂怎么安装这个问题咨询软件客服徽4282891的挂在哪...
今日重大通报“战皇炸金花.开挂... 网上科普关于“战皇炸金花有没有挂”话题很是火热,小编也是针对战皇炸金花作*弊开挂的方法以及开挂对应的...
今日重磅消息“游游棋牌.怎么开... 家人们!今天小编来为大家解答游游棋牌透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里买很...
玩家分享攻略“老友十三水.究竟... 玩家分享攻略“老友十三水.究竟有挂吗?”必胜开挂神器您好,老友十三水这个游戏其实有挂的,确实是有挂的...
今日重大通报“新大圣牛牛.可以... 有 亲,根据资深记者爆料新大圣牛牛是可以开挂的,确实有挂(咨询软件无需打...
【第一财经】“兴动棋牌麻将.怎... 网上科普关于“兴动棋牌麻将有没有挂”话题很是火热,小编也是针对兴动棋牌麻将作*弊开挂的方法以及开挂对...
终于懂了“经典联盟牛牛.有挂吗... 您好:经典联盟牛牛这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9752949】很多玩家在这款...
今日重大通报“新华棋牌.到底有... 您好:新华棋牌这款游戏可以开挂,确实是有挂的,需要了解加客服微信【9784099】很多玩家在这款游戏...
今日重磅消息“九九麻将.怎么装... 家人们!今天小编来为大家解答九九麻将透视挂怎么安装这个问题咨询软件客服徽9784099的挂在哪里买很...