V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
farmer01
V2EX  ›  问与答

k8s 的 statefulSet 的 Pod 调度问题

  •  
  •   farmer01 · 2021-05-28 17:39:28 +08:00 · 1329 次点击
    这是一个创建于 1276 天前的主题,其中的信息可能已经有所发展或是发生改变。
    有 3 台 Node,我想把 elasticsearch sclae 为 3,并且保证每台 Node 上都有一个 elasticsearch
    打了 label 后,发现经常会有 1 个 node 上有 2 个 ES pod (因为设置了 hostPath,所以 2 个 ES Pod 分配到同一台 Node 上会导致第二个 ES 启动失败)

    请问大佬们有没有办法保证这种 statefulSet 集群的 Pod 都被均匀地分配到不同 Node 上,特别是不能有一台 Node 上存在多个同 statefulSet 的情况
    15 条回复    2021-05-30 17:44:26 +08:00
    sniperking1234
        1
    sniperking1234  
       2021-05-28 17:44:16 +08:00
    使用 podAntiffinity
    finian
        2
    finian  
       2021-05-28 17:55:14 +08:00
    `podAntiffinity` 是软满足(尽量满足),也可能会出现分布不均的情况。如果 K8s 是 1.18 及以上版本的话,用 `topologySpreadConstraints` 吧,并设置 `whenUnsatisfiable: DoNotSchedule`,这样能保证均匀分布
    finian
        3
    finian  
       2021-05-28 17:57:46 +08:00
    @finian 还要设置 `maxSkew: 1`
    RudyS
        4
    RudyS  
       2021-05-28 18:00:39 +08:00
    topologySpreadConstraints
    anubu
        5
    anubu  
       2021-05-28 18:19:49 +08:00
    用 PodAntiAffinity 的 requiredDuringSchedulingIgnoredDuringExecution 。

    topologySpreadConstraints 可能并不完全适用你的场景,maxSkew 为 1 在正常情况下可以满足你的要求,但如果某一节点宕机则会调度 2 个 Pod 到某一节点,可能导致 hostPath 内有状态数据异常。
    farmer01
        6
    farmer01  
    OP
       2021-05-28 18:44:20 +08:00
    @anubu 我用的是 1.20.2 版本的,然后在 1.14.x 版本上是正常的,会自动调度到不同 node.
    Helm 里面我也看了,确认了有这些:
    affinity:
    nodeAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    nodeSelectorTerms:
    - matchExpressions:
    - key: es-accobot-hkpf
    operator: In
    values:
    - es-accobot-hkpf
    podAntiAffinity:
    requiredDuringSchedulingIgnoredDuringExecution:
    - labelSelector:
    matchExpressions:
    - key: app
    operator: In
    values:
    - elasticsearch
    topologyKey: kubernetes.io/hostname
    finian
        7
    finian  
       2021-05-28 19:02:22 +08:00
    @anubu `podAntiffinity` 在正常情况下也可能会调度 2 个 Pod 到某一节点,它只是尽量满足约束条件,不是强制的。你说的某个节点宕机的情况下,在 `whenUnsatisfiable: DoNotSchedule` 设置下,不会出现 2 个 Pod 被调度到一个节点的情况(因为这时最大的 skew 为 2,不满足 maxSkew: 1 的约束),但是这时系统会停止调度(只部署了 2 个 Pod 在不同的节点,另外一个节点因为宕机无法调度)
    anubu
        8
    anubu  
       2021-05-28 19:29:08 +08:00
    @finian 感谢指正,应该是我理解错了,以为 maxSkew 约束条件计算不包含宕机节点。关于 podAntiffinity 是软性约束这点还不太确认,需要找些资料再学习一下。

    @farmer01 不太确认版本问题和 podAntiffinity 无法硬性约束的问题。可以按照 2 楼的建议,使用 topologySpreadConstraints 。
    swulling
        9
    swulling  
       2021-05-28 21:00:21 +08:00 via iPhone
    @finian 可以设置 hard 还是 soft 约束。

    hard 用 requiredDuringSchedulingIgnoredDuringExecution
    finian
        10
    finian  
       2021-05-28 21:42:42 +08:00
    @swulling 你说得对。我错看成 preferredDuringSchedulingIgnoredDuringExecution 了。因为我们之前的场景是希望 Pod 均匀分布,且每个节点会多于一个,在 1.18 版本之前,只能使用 podAntiAffinity 的 preferredDuringSchedulingIgnoredDuringExecution,这时候是不能保证均匀分布的。后来 1.18 版本后才改成使用 topologySpreadConstraints
    Illusionary
        11
    Illusionary  
       2021-05-29 00:10:36 +08:00
    DaemonSet
    wellsc
        12
    wellsc  
       2021-05-29 00:12:39 +08:00 via iPhone
    statefulSet 真的靠谱吗,目前还不敢尝试
    lixiang2017
        13
    lixiang2017  
       2021-05-29 03:35:36 +08:00 via Android
    用的 DaemonSet 从来没出现过这种情况。
    plko345
        14
    plko345  
       2021-05-29 08:35:46 +08:00 via Android
    @finian podAntiAffinity 有个 requiredDuringSchedulingIgnoredDuringExecution
    finian
        15
    finian  
       2021-05-30 17:44:26 +08:00
    @plko345 requiredDuringSchedulingIgnoredDuringExecution 不能满足一个节点部署多个 Pod 的需求(均匀分布且每个节点多于一个 Pod )
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1054 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 23:15 · PVG 07:15 · LAX 15:15 · JFK 18:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.