在 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 在主機級別互斥部署。