在 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: 2selector:matchLabels:app: app-atemplate:metadata:labels:app: app-aspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- app-btopologyKey: kubernetes.io/hostnamecontainers:- name: nginximage: nginx:latestports:- containerPort: 80
Deployment B
apiVersion: apps/v1
kind: Deployment
metadata:name: deployment-b
spec:replicas: 2selector:matchLabels:app: app-btemplate:metadata:labels:app: app-bspec:affinity:podAntiAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- app-atopologyKey: kubernetes.io/hostnamecontainers:- name: nginximage: nginx:latestports:- 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 在主机级别互斥部署。