大家!有谁知道我在哪里做错了吗?我想使用 Deployment 和 AntiNodeAffinity 模拟 DaemonSet 行为,将每个 pod 放置在不同的节点上。如果我使用
topologyKey
设置为每个节点上存在的标签 kubernetes.io/hostname
,它工作正常。我有1 master
和1 worker
,使用3个副本,最后一个将处于待定状态。
NAME READY STATUS RESTARTS AGE
nginx-anti-affinity-5dbbbb9b9d-7jxhq 1/1 Running 0 5m38s
nginx-anti-affinity-5dbbbb9b9d-jgjs9 1/1 Running 0 5m38s
nginx-anti-affinity-5dbbbb9b9d-xv6cx 0/1 Pending 0 5m38s
但是,如果我只想将 Pod 放置在工作节点上,我只在我的工作节点上分配了一个新标签
type=worker
。因此,它现在应该只运行 1 个副本,并使 2 个 pod 处于挂起状态。最后,它不起作用并在我的节点上运行所有 pod。当我将 topologyKey
更改为任何其他预定义标签(如 kubernetes.io/os
)时,它也会停止正常工作......
k get nodes --show-labels | grep type
minikube-m02 Ready <none> 24m v1.24.3 beta.kubernetes.io/arch=arm64,beta.kubernetes.io/os=linux,kubernetes.io/arch=arm64,kubernetes.io/hostname=minikube-m02,kubernetes.io/os=linux,type=worker
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
nginx-anti-affinity-8595847fd8-4zlv4 1/1 Running 0 68s 172.17.0.4 minikube <none> <none>
nginx-anti-affinity-8595847fd8-95nrb 1/1 Running 0 68s 172.17.0.3 minikube <none> <none>
nginx-anti-affinity-8595847fd8-q598k 1/1 Running 0 68s 172.17.0.2 minikube-m02
apiVersion: apps/v1
kind: Deployment
metadata:
labels:
id: nginx-anti-affinity
name: nginx-anti-affinity
spec:
replicas: 3
selector:
matchLabels:
id: nginx-anti-affinity
strategy: {}
template:
metadata:
labels:
id: nginx-anti-affinity
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: id
operator: In
values:
- nginx-anti-affinity
topologyKey: "type"
containers:
- image: nginx
name: nginx
resources: {}
status: {}
我正在尝试使用 Deployment 和 AntiNodeAffinity 来模拟 DaemonSet 行为,以将每个 pod 放置在不同的节点上。
我在k8s文档中找到了合适的答案。所有节点都应该被标记,否则,它会以意想不到的方式工作。
注意: Pod反亲和性要求节点的标签一致,换句话说,集群中的每个节点都必须有一个合适的标签匹配
topologyKey
。如果部分或所有节点缺少指定的topologyKey
标签,可能会导致意外行为。