如何解决Kubernetes 反关联规则将部署 Pod 传播到至少 2 个节点
我在 k8s 部署中配置了以下反关联性规则:
spec:
...
selector:
matchLabels:
app: my-app
environment: qa
...
template:
Metadata:
labels:
app: my-app
environment: qa
version: v0
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: kubernetes.io/hostname
其中我说我不希望在我的 k8s 集群的节点上安排任何 Pod 副本,该节点中已经存在相同应用程序的 Pod。因此,例如,具有:
nodes(a,b,c) = 3
replicas(1,2,3) = 3
replica_1安排在node_a,replica_2安排在node_b和replica_3安排在 node_c
因此,我将每个 Pod 安排在不同的节点上。
但是,我想知道是否有一种方法可以指定:“我希望将我的 Pod 分布在至少 2 个节点中”以保证高可用性,而不会将所有 Pod 分布到其他节点,例如:
nodes(a,3) = 3
replica_1安排在node_a,replica_2安排在node_b和replica_3安排(再次)在node_a
所以,总而言之,我想要一个更软的约束,它允许我保证将 Deployment 的副本分布在至少 2 个节点上的高可用性,而不必为某个应用程序的每个 Pod 启动一个节点。
>谢谢!
解决方法
我想我找到了解决您问题的方法。看看这个示例 yaml 文件:
spec:
topologySpreadConstraints:
- maxSkew: 1
topologyKey: kubernetes.io/hostname
whenUnsatisfiable: DoNotSchedule
labelSelector:
matchLabels:
example: app
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-1
- worker-2
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 50
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-1
这种配置的想法: 我在这里使用 nodeAffinity 来指示 pod 可以放置在哪些节点上:
- key: kubernetes.io/hostname
和
values:
- worker-1
- worker-2
设置以下行很重要:
- maxSkew: 1
maxSkew 描述了 Pod 可能分布不均的程度。它必须大于零。
因此,节点之间分配的提要数量的差异将始终最大等于 1。
本节:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 50
preference:
matchExpressions:
- key: kubernetes.io/hostname
operator: In
values:
- worker-1
是可选的,但是它可以让您更好地调整免费节点上的提要分布。 Here 您可以找到以下差异的说明:requiredDuringSchedulingIgnoredDuringExecution
和 preferredDuringSchedulingIgnoredDuringExecution
:
因此,requiredDuringSchedulingIgnoredDuringExecution
的示例将是“仅在具有 Intel CPU 的节点上运行 pod”,示例 preferredDuringSchedulingIgnoredDuringExecution
将是“尝试在故障区域 XYZ 中运行这组 pod,但如果这是不可能的,然后允许一些在别处运行”。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。