使用node_selector
,我们可以将特定的部署副本调度到某个节点池。但是如何确保每个节点中至少有一个Pod正在运行(例如,节点池的大小大于1)
我需要这样做,以确保我的Pod分散在整个节点池中,这样,如果特定节点遇到问题(例如与集群断开连接),我的应用程序仍将运行。
答案 0 :(得分:3)
使用nodeSelector
,您可以将Pod直接绑定到节点,但是它没有提供任何在节点上分布部署Pod的方法。
要在各个节点上分布Pod,可以使用Pod anti-affinity。
例如:
apiVersion: apps/v1
kind: Deployment
metadata:
name: my-app
spec:
selector:
matchLabels:
app: my-app
replicas: 3
template:
metadata:
labels:
app: my-app
spec:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- my-app
topologyKey: "kubernetes.io/hostname"
containers:
- name: my-app
image: my-app:1.0.0
这会安排Pod的位置,以便在可能的情况下,部署中的两个Pod都不会位于同一节点上。
例如,如果在部署中有5个节点和3个副本,则应将每个Pod安排到一个不同的节点。如果您有5个节点和6个副本,则应该将前5个Pod分别调度到一个不同的节点,将第6个Pod调度到一个已经具有Pod的节点(因为没有其他可能性)。
在Kubernetes documentation中查看更多示例。
答案 1 :(得分:0)
Kubernetes具有专用的资源类型,称为daemonset。这将确保您的pod在每个节点上运行
kind: DaemonSet
metadata:
name: ssd-monitor
spec:
selector:
matchLabels:
app: ssd-monitor
template:
metadata:
labels:
app: ssd-monitor
spec:
containers:
- name: main
image: luksa/ssd-monitor
您可以看到在2个节点上运行的2个容器
[root@master ~]# kubectl get po -o wide
NAME READY STATUS RESTARTS AGE IP NODE NOMINATED NODE READINESS GATES
ssd-monitor-24qd7 1/1 Running 0 2m17s 10.36.0.7 node2.k8s <none> <none>
ssd-monitor-w7nxr 1/1 Running 0 2m17s 10.44.0.12 node1.k8s <none> <none>