在 Kubernetes 中,要实现两个 Deployment 的 Pod 在主机级别互斥部署,可以使用 podAntiAffinity
配置。通过设置 podAntiAffinity
,可以确保两个 Deployment 的 Pod 不会被调度到同一节点上。
实现步骤
定义 Deployment:
为每个 Deployment 定义 podAntiAffinity
,指定它们不能与另一个 Deployment 的 Pod 部署在同一个节点上。
设置标签选择器:
使用 labelSelector
来匹配另一个 Deployment 的 Pod 标签。
设置拓扑键:
使用 topologyKey
设置为 kubernetes.io/hostname
,表示基于节点的互斥。
案例
假设有两个 Deployment,分别是 deployment-A
和 deployment-B
,它们的 Pod 标签分别为 app: app-a
和 app: app-b
。
Deployment A
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-a
spec:
replicas: 2
selector:
matchLabels:
app: app-a
template:
metadata:
labels:
app: app-a
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- app-b
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
Deployment B
apiVersion: apps/v1
kind: Deployment
metadata:
name: deployment-b
spec:
replicas: 2
selector:
matchLabels:
app: app-b
template:
metadata:
labels:
app: app-b
spec:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchExpressions:
- key: app
operator: In
values:
- app-a
topologyKey: kubernetes.io/hostname
containers:
- name: nginx
image: nginx:latest
ports:
- containerPort: 80
说明
-
podAntiAffinity
:定义 Pod 之间的互斥关系。 -
requiredDuringSchedulingIgnoredDuringExecution
:硬性规则,必须满足,否则 Pod 不会被调度。 -
labelSelector
:匹配另一个 Deployment 的 Pod 标签。 -
topologyKey
:设置为kubernetes.io/hostname
,表示基于节点的互斥。
验证
部署完成后,可以使用以下命令查看 Pod 的调度情况:
kubectl get pods -o wide
这将显示每个 Pod 所在的节点,确保两个 Deployment 的 Pod 不在同一节点上。但此种部署方式需要保证节点不少于应用数,否则会出现pod无法调度的情况,比如集群只有1个节点,Deployment A成功调度到唯一节点上,那么Deployment A就无法成功调度;
通过以上配置,可以实现两个 Deployment 的 Pod 在主机级别互斥部署。