千家信息网

影响K8S Pod分配和调度策略的两大关键特性

发表于:2024-10-15 作者:千家信息网编辑
千家信息网最后更新 2024年10月15日,在Kubernetes中有一个最复杂的调度器可以处理pod的分配策略。基于在pod规范中所提及的资源需求,Kubernetes调度器会自动选择最合适的节点来运行pod。但在许多实际场景下,我们必须干预
千家信息网最后更新 2024年10月15日影响K8S Pod分配和调度策略的两大关键特性

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


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

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

节点亲和性/反亲和性

Kubernetes一向以来都是依赖label和selector来对资源进行分组。例如,某服务使用selector来过滤具有特定label的pod,这些label可以选择性地接收流量。Label和selector可以使用简单的基于等式的条件(=and!=)来评估规则。通过nodeSelector的特性(即强制将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来定义自定义分配逻辑。此外,我们还能写自定义调度程序,它可以从默认的调度程序中接管调度逻辑。

节点 亲和 亲和性 规则 调度 分配 逻辑 运行 缓存 强制 软性 复杂 表达式 资源 策略 相同 之间 技术 条件 运算符 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 网络安全三级等保需要ca 启东泰畅网络技术有限公司 网络安全50强2019 数据库完全停止以后进行备份 宣城系统软件开发外包 软件开发5类功能点 软件开发培训学校l 能源互联网科技报告心得体会 长沙直销软件开发 保护网络安全构建和谐校园手抄报 网络安全软件加密的例子 浪潮软件开发的软件 单位的服务器怎么进 江苏仪征数据服务器 长沙软件开发服务有限公司 网络安全论文下载百度云 网络安全法施行什么制度 大兴区互联网网络技术推广怎么样 上海 银行 解读网络安全法 网络安全文明上网文章 网络安全产品推广话术 上海网络时间服务器配置 中国互联网经济论坛随锐科技 网络安全专业怎么样容易学吗 上海小程序软件开发机构 山东服务器硬盘报价 信息技术课件 网络技术 一个网站服务器多少钱 珠海智能软件开发收费 上海 银行 解读网络安全法
0