当前位置: 首页 > 知识库问答 >
问题:

docker - k8s 如何设置「尽量反亲和性」?

晏永康
2023-10-26

k8s 的反亲和性非常的愚蠢

affinity:  podAntiAffinity:    requiredDuringSchedulingIgnoredDuringExecution: #设置调度策略。      - labelSelector:          matchExpressions:            - key: app              operator: In              values:                - imdb-match-api        topologyKey: kubernetes.io/hostname

是强制反亲和的

比如我有 10个 node,需要部署 12个一样的pod

我希望这 8个节点各部署一个 pod,另外 2 个节点各部署两个 pod

但是 k8s 设置了反亲和性,就最多只能部署 10 个 pod 了,另外两个 pod 就永远是 pending 状态了

我只是希望尽量部署在不同机器上,避免一台机器挂了,导致这些 pod 被一锅端,但不强求一个 node 只能部署一个 pod

我该怎么做呢?

共有3个答案

慕兴平
2023-10-26

你需要的可能是 topologySpreadConstraints

  topologySpreadConstraints:       - maxSkew: 1         topologyKey: kubernetes.io/hostname         whenUnsatisfiable: DoNotSchedule         labelSelector:           matchLabels:             app: foo         matchLabelKeys:           - pod-template-hash
颛孙和颂
2023-10-26

Kubernetes 的默认调度策略是尽可能满足 pod 的资源需求,同时尽量均匀分配 pod 到多个节点上。

所以没必要设置反亲和性。

左丘兴生
2023-10-26

这个问题涉及到了 Kubernetes 中反亲和性(Anti-Affinity)的工作方式。在你提供的 YAML 配置中,你使用了 podAntiAffinity 来设置反亲和性,这表示如果一个节点上已经有一个指定的 pod 运行,那么该节点将不再被选择来运行具有相同标签的其他 pod。

在你的情况中,你已经设定了一个反亲和规则,即相同的 app=imdb-match-api 的 pod 不会运行在同一个节点上。然而,Kubernetes 的反亲和性是强制的,即一旦一个节点被分配了一个 pod,它就不能再被分配另一个具有相同标签的 pod,除非原来的 pod 被删除或移动到其他节点。

要达到你所希望的效果,即尽量将 pods 分配到不同的节点上,但并不严格要求每个节点只分配一个 pod,你可以尝试使用 soft 版的反亲和规则,即 podAffinitypodAffinity 允许你设置一些相对灵活的亲和性规则,比如 "尽量部署在不同机器上",而不是强制性的 "必须部署在不同机器上"。

然而需要注意的是,podAffinity 并不能解决所有问题。例如,它不能防止所有的 pod 同时挂掉的情况(这被称为"一锅端"问题)。为了解决这个问题,你还需要考虑其他的容错策略,比如使用 podDisruptionBudgets 来为你的 pods 设置一些容错预算。

以下是一个使用 podAffinity 的例子:

affinity:  podAffinity:    requiredDuringSchedulingIgnoredDuringExecution:      - labelSelector:          matchExpressions:            - key: app              operator: In              values:                - imdb-match-api        topologyKey: kubernetes.io/hostname

这个配置表示尽量将具有 app=imdb-match-api 标签的 pod 分配到不同的节点上。如果无法满足这个条件,Kubernetes 仍然会尽量找到一个合适的节点来部署 pod。

 类似资料:
  • 反亲和组是针对反亲和组中虚拟机的简单调度策略。 反亲和组是针对反亲和组中虚拟机的简单调度策略,根据反亲和组中的策略将属于反亲和组中新创建的虚拟机分布在不同宿主机上,从而实现业务的高可用。一般用于某个系统中要求系统中的各个节点部署在不同宿主机上的场景。 入口:在云管平台左侧菜单项中单击 “主机/主机/反亲和组” 菜单项,进入反亲和组页面。 创建反亲和组 该功能用于创建反亲和组。 说明 用户在管理后台

  • 问题内容: 我想使用Dockerizing MongoDB并将数据存储在本地卷中。 但是..失败了… 它具有mongo:latest图像 我想将单声道数据存储在〜/ data中。所以- 但是…行不通… docker ps-没有守护进程mongo 尝试运行“ mongo”-失败 码头工人检查蒙哥 如果我不设置数据量,mongo image就可以工作! 但是,当设置数据量时,它不是…谁可以帮助我? 问

  • Docker Desktop for Mac/Windows 开启 Kubernetes 中文 | English 说明: 需安装 Docker Desktop 的 Mac 或者 Windows 版本,如果没有请下载下载 Docker CE最新版本 当前 master 分支已经在 Docker for Mac/Windows 4.1.0 (包含 Docker CE 20.10.8 和 Kubern

  • 问题内容: 是否有一种编程方法来为Linux操作系统的c / c ++设置进程的CPU关联性? 问题答案: 您需要使用。 例如,仅在CPU 0和2上运行: (第一个参数表示当前进程,如果要控制其他进程,则提供PID)。 另请参阅。

  • 我试图在构建过程中设置docker容器中的环境变量,但没有成功。使用运行命令时设置它们有效,但我需要在构建过程中设置它们。 Dockerfile文件 我用来构建的命令 运行 我正在检查可用的环境变量,通过使用 结果是 TEST_ENV不在场

  • 我正试图用Windows10中的netbeans远程访问我的树莓,但有一个像这张图片的报告。我收到以下错误,我不明白。我看到一些X11显示变量需要设置,但是我应该给它什么值,怎么给?我曾经试过和XMING在一起,但还是一样。