kubernetes - 不允许同一应用程序的两个 Pod 在 Kubernetes 中的同一节点上
问题描述
我们现在的情况是 2 个相同类型的 Pod 可以在同一个节点上运行。有时在重启和重新调度期间,2 个 Pod 恰好在同一个节点上,而当重新调度这个节点本身时,我们所有的 Pod 都消失了一段时间,导致连接出现问题(我们只有 2 个负载均衡的 Pod)。
我认为修复它的最佳方法是不允许 2 个 pod 在同一个节点上运行,并为此使用跨 pod 反亲和性。
这是解决问题的正确方法吗?topologyKey
我试图理解它,但对它的语法有点困惑。有人可以解释/举例说明如何实现这一目标吗?
解决方案
是的,你是对的 Affinity 是你的朋友,是正确的解决方案。
Node Affinity :将帮助您的应用程序或微服务坚持特定类型的节点(在多节点架构中),如下所示我的应用程序ngnix-ms
始终坚持具有标签的节点role=admin
。
pod antiAffinity 规则:坚持节点标签(topologyKey)并确保节点组(用 topologyKey 标记)。
如果有一个节点已经有一个带有标签的 pod component=nginx
,K8s 将不允许启动一个 pod。
这是解释:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: role
operator: In
values:
- app-1
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: component
operator: In
values:
- nginx-ms
topologyKey: "kubernetes.io/1-hostname"
和
kubectl get node --show-labels
NAME STATUS ROLES AGE VERSION LABELS
xx-admin-1 Ready master 19d v1.13.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/1-hostname=xx-admin-1,node-role.kubernetes.io/master=,role=admin
xx-admin-2 Ready master 19d v1.13.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/1-hostname=xx-admin-2,node-role.kubernetes.io/master=,role=admin
xx-plat-1-1 Ready <none> 19d v1.13.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/2-hostname=xx-plat-1-1,role=admin
xx-plat-2-1 Ready <none> 19d v1.13.4 beta.kubernetes.io/arch=amd64,beta.kubernetes.io/os=linux,kubernetes.io/2-hostname=xx-plat-2-1,role=admin
topologyKey 的解释:把它想象成一个标签,现在你可以在同一个集群中有两个不同的拓扑。
示例:kubernetes.io/1-hostname
和kubernetes.io/2-hostname
现在,当你在做 podAntiAffinity 时,你设置了 `topologyKey:
kubernetes.io/1-hostname
topologyKey: kubernetes.io/2-hostname
那么您的规则在具有该 topologyKey 的所有节点中都有效,但您的规则在标记节点中无效。
因此,在我的示例中,pod 被安排在带有标签的节点内,kubernetes.io/1-hostname
并且隐含了 podAntiAffinity,但带有标签kubernetes.io/2-hostname
的节点没有 podAntiAffinity 规则!
推荐阅读
- python - 如何使用python选择excel中的特定列?
- http - 客户端关闭连接时,Go http.ResponseWriter.Write 不返回错误
- blockchain - 生成图形不可替代令牌
- java - 当我将关键字用作 selenium 自动化的关键字驱动框架的 sendkeys 时,SendKeys 方法不起作用
- javascript - 使用 javascript 设置背景图像,无需硬编码
- rclone - 如何使用 RCLONE 计算 Google Drive 文件夹大小(已用空间)?
- php - user_id 未采用提供的值
- reactjs - 错误“React.Children.only 期望接收单个 React 元素子项。” 使用 react-redux 和 Auth0
- asp.net - ASP.Net MVC 应用程序 Azure Active Directory 身份验证问题“我们无法登录,请稍后再试”
- java - 谁在 JAVA 中抛出 AssertionError?JVM 还是 API 开发人员/程序员?