0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Pod一直处于Pending状态?什么是Pod拓扑约束?

马哥Linux运维 来源:稀土掘金 2023-12-18 11:46 次阅读

起因: 今天在部署组件的时候,发现组件的pod一直处于Pending状态,报错显示的原因是:不满足Pod拓扑分布约束,看了代码发现是原来同事给组件新增了Pod拓扑约束。对于Pod拓扑约束,我先前并没有认真了解过,刚好可以借这个排查问题的机会深入了解什么是Pod拓扑约束。

文档参考主要是上述两篇k8s官方的文档,建议英文功底好的可以直接看第二篇文档。

topologySpreadConstraints是一个Pod Spec层级的字段,其定义的结构体如下:


spec:
  topologySpreadConstraints:
  - maxSkew: 
    topologyKey: 
    whenUnsatisfiable: 
    labelSelector: 

在官方文档里还描述了许多beta特性的字段,但如果是刚上手Pod拓扑约束的小伙伴,可以从这上面的四个基本字段入手,先把这四个字段的含义吃透。

5e5a9f6a-9c10-11ee-8b88-92fbcf53809c.jpg

labelSelector:labelSelector是用来寻找匹配标签的Pod,对于每一个拓扑域来说,k8s调度器会计算其中匹配labelSelector的Pod数量。在上图中,我们定义的拓扑约束只针对含有label app=foo的Pod生效。

topologyKey:topologyKey用于一个拓扑域,这个值通常情况下是定义在节点上的标签。在上图中,我们定义的拓扑域就是zone,也就是含有zone这个label的节点才算在我们的拓扑域中。

maxSkew:maxSkew指的就是Pod分布在不同的拓扑域中的数量差异。maxSkew要求其设定的值大于0,其值越小,说明我们期望Pod能够越均衡地打散分布在拓扑域中,其值越大,则反之。在上图中,如果新的Pod调度到Zone1中,则Zone1和Zone2的skew就是3-0=3,如果新的Pod调度到Zone2中,则Zone1和Zone2的skew就是2-1=1.

whenUnsatisfiable:whenUnsatisfiable指当skew不满足maxSkew时,调度器会执行的动作,可选值为:

DoNotSchedule:(默认值)不调度。

ScheduleAnyway:仍然调度,但会趋向于调度到使skew最小的拓扑域中。

了解到这里,我就已经排查出来调度不上去的原因了:集群是一个两节点的集群(1master+1worker),但这两个节点属于同一个可用区,但有一点奇怪的是,按照算法,应该会有一个Pod调度上去,另一个Pod处于Pending状态,但现实却是两个Pod都处于Pending状态。继续看代码,我发现了同事不仅用了topologySpreadConstraints,还结合了亲和性反亲和性一起使用。

Pod拓扑约束可以结合亲和和反亲和特性一起使用,达到更丰富的效果,以实际业务场景中的代码为例:


    affinity:
        podAntiAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            - labelSelector:
                matchLabels:
                  app.kubernetes.io/name: app-server
              topologyKey: kubernetes.io/hostname
      schedulerName: default-scheduler
     topologySpreadConstraints:
        - maxSkew: 1
          topologyKey: topology.kubernetes.io/zone
          whenUnsatisfiable: DoNotSchedulable
          labelSelector:
            matchLabels:
              app.kubernetes.io/instance: app-server
              app.kubernetes.io/name: app-server

可以看到,我们设置了Pod 反亲和性,禁止符合条件的Pod调度到同一个节点上(可能是出于容灾或其他方面的考虑),再看Pod拓扑约束,要求Pod均匀地分布在每个可用区中,且每个可用区之间符合条件的Pod的数量差值最大为1,如果不满足的条件下,禁止调度。(强打散Pod到每个可用区中,可能是出于网络带宽,cpu内存等资源角度的考虑)。

因此,在仅有两个节点的集群中,且这两个节点还是属于同一个可用区的情况下,无法满足上述的调度条件,因此两个Pod均处于Pending状态。

解决方式有两种,可以设置maxSkew的值为2,或者设置whenUnsatisfiable的值为ScheduleAnyway。

链接:https://juejin.cn/post/7245179553886486584







审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • SPEC
    +关注

    关注

    0

    文章

    31

    浏览量

    15677
  • POD
    POD
    +关注

    关注

    0

    文章

    16

    浏览量

    5972
  • 调度器
    +关注

    关注

    0

    文章

    95

    浏览量

    5161

原文标题:Pod一直处于Pending状态?可以看一下是不是拓扑约束的问题

文章出处:【微信号:magedu-Linux,微信公众号:马哥Linux运维】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    介绍如何安装E1135C PDU和Pod升级

    Describes how to install the E1135C PDU and Pod upgrade.
    发表于 08-21 14:07

    从零开始入门 K8s| 详解 Pod 及容器设计模式

    100~200KB 左右,是个汇编语言写的、永远处于“暂停”状态的容器。由于有了这样个 Infra container 之后,其他所有容器都会通过 Join Namespace
    发表于 09-20 15:12

    Pod资源配置

    《Kubernetes进阶实战》第四章《管理Pod资源对象》
    发表于 10-22 14:39

    寻找Kintex UltraScale POD12输出Vol / Voh?

    Vol / Voh值吗?我问,因为DDR4和相关的LRDIMM组件似乎期望输入集中在0.5 * VDD,但JEDEC POD12标准中唯的数据输出是Vref = 0.7 * VDDQ和Vol_max = 0.5V。谢谢!
    发表于 07-27 14:52

    Land Pattern and POD

    Land Pattern and POD
    发表于 03-05 15:59 0次下载
    Land Pattern and <b class='flag-5'>POD</b>

    Kubernetes组件pod核心原理

    1. 核心组件原理 —— pod 核心原理 1.1 pod 是什么 pod 也可以理解是一个容器,装的是 docker 创建的容器,也就是用来封装容器的一个容器; pod 是一个虚拟化
    的头像 发表于 09-02 09:27 1585次阅读

    如何利用Docker实现Pod

    Container 和 Pod 是相似的。在底层,它们主要依赖 Linux 命名空间和 cgroup。但是,Pod 不仅仅是一组容器。Pod 是一个自给自足的高级构造。
    发表于 11-14 12:51 991次阅读

    Kubernetes中的Pod简易理解

    Pod是Kubernetes中非常重要的概念,也是Kubernetes管理的基本单位。正如其名,Pod像一个豌豆荚,可以容纳多个container,拥有相同的IP地址。
    的头像 发表于 02-15 10:44 934次阅读

    什么是CNI,基于Calico的Pod网络介绍

    每一个Node上都会有一个tunl0的虚拟网卡,这个网卡可以理解成网桥,所有Pod都要基于此网桥来和其它Pod通信。 ② 每生成一个新的Pod,那么在Node上都会生成一个calixxxx的虚拟网卡,这个网卡会对应到
    发表于 04-20 09:37 1711次阅读

    k8s与pod之间是如何进行网络隔离的?

    NetworkPolicy用来控制PodPod之间的网络通信,它也支持针对Namespace进行限制。
    的头像 发表于 05-11 09:35 1186次阅读
    k8s与<b class='flag-5'>pod</b>之间是如何进行网络隔离的?

    iOS中Pod库资源引用探究

    Cocoapods中Pod引用资源的方式有多种,不同的方式对资源的使用还是有区别的,但也有一定的规律,这里我用一个样例工程来进行说明,样例工程名叫:AssetsDemo,使用pod lib create AssetsDemo命令创建,目录结构如图:
    的头像 发表于 05-26 11:11 573次阅读
    iOS中<b class='flag-5'>Pod</b>库资源引用探究

    POD到底是什么?聊聊POD

    POD,即Plain Old Data的缩写,plain代表普通,Old代表旧,从字面意思看是老的、普通的数据类型。
    的头像 发表于 06-19 15:24 3079次阅读

    如何快速查看Kubernetes Pod崩溃前的日志

    pod处于crash状态的时候,容器不断重启,此时用 kubelet logs 可能出现一直捕捉不到日志。
    的头像 发表于 07-06 09:25 398次阅读

    Kubernetes Pod如何获取IP地址呢?

    Kubernetes 网络模型的核心要求之一是每个 Pod 都拥有自己的 IP 地址并可以使用该 IP 地址进行通信。很多人刚开始使用 Kubernetes 时,还不清楚如何为每个 Pod 分配 IP 地址。
    的头像 发表于 07-21 10:00 540次阅读
    Kubernetes <b class='flag-5'>Pod</b>如何获取IP地址呢?

    Pod是如何在底层实现的?如何使用Docker创建Pod

    刚开始接触 Kubernetes 时,你学到的第一件事就是每个 Pod 都有一个唯一的 IP 和主机名,并且在同一个 Pod 中,容器可以通过 localhost 相互通信。所以,显而易见,一个 Pod 就像一个微型的服务器。
    的头像 发表于 08-14 10:33 839次阅读
    <b class='flag-5'>Pod</b>是如何在底层实现的?如何使用Docker创建<b class='flag-5'>Pod</b>?