我有一个本地 Kubernetes 集群,最近它需要物理重启所有工作节点(运行三个工作节点)。当 Pod 恢复时,我注意到所有 Pod 都安排在一个物理工作节点上,而不是均匀分布在三个工作节点上。我假设其他两个工作节点在重启后需要更长时间才能恢复在线,而 Kubernetes 只是将我们所有的应用程序安排在唯一启动的工作节点上。
部署 yaml 中是否有办法指定所有部署副本最终应分布在所有工作节点上?IE 是否阻止 Kubernetes 在单个工作节点上启动所有 pod?
答案1
有这样一种东西叫豆荚间抗亲和性就是这样的。
来自 k8s 文档:
Pod 间亲和性和反亲和性允许您根据节点上已运行的 Pod 上的标签(而不是节点上的标签)来限制您的 Pod 有资格被调度到哪些节点。规则的形式为“如果 X 已运行一个或多个符合规则 Y 的 Pod,则此 Pod 应该(或者,在反亲和性的情况下,不应该)在 X 中运行”。
例子:
apiVersion: apps/v1
kind: Deployment
metadata:
name: web-server
spec:
selector:
matchLabels:
app: web-store
replicas: 3
template:
metadata:
labels:
app: web-store
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- web-store
topologyKey: "kubernetes.io/hostname"
containers:
- name: web-app
image: nginx:1.16-alpine
它将确保同一部署中的任何两个 Pod 都不会被调度到同一个节点上。如果没有更多节点可用于调度 Pod,Pod 将停留在待办的状态(不会被安排)。