在 Kubernetes 中,親和力(Affinity)和非親和力(Anti-Affinity)是用于控制 Pod 調度策略的機制,它們可以幫助優化資源利用率、提高應用性能和可用性。以下是親和力和非親和力的詳細解釋:
親和力(Affinity)
親和力允許用戶定義規則,指定 Pod 應該被調度到哪些節點上。親和力分為兩種類型:
節點親和力(Node Affinity)
定義:節點親和力允許用戶通過節點的標簽來指定 Pod 應該被調度到哪些節點上。
作用:可以提高資源利用率、優化性能。
Node親和力允許你指定Pod應該被調度到具有特定標簽的節點上。它分為兩種類型:
requiredDuringSchedulingIgnoredDuringExecution:必須滿足的規則,否則Pod不會被調度。
preferredDuringSchedulingIgnoredDuringExecution:盡力滿足的規則,但不是必須的。
示例:
affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: coloroperator: Invalues:- blue- green
這個例子表示 Pod 只會被調度到標簽為 color=blue 或 color=green 的節點上。
Pod 親和力(Pod Affinity)
定義:Pod 親和力允許用戶通過其他 Pod 的標簽來指定 Pod 應該被調度到哪些節點上。
作用:可以確保相關 Pod 被調度到同一節點或相近的節點上,從而減少網絡延遲。
Pod親和力允許你指定Pod應該與其他具有特定標簽的Pod共同部署在同一個節點上。它同樣分為兩種類型:
requiredDuringSchedulingIgnoredDuringExecution:必須滿足的規則。
preferredDuringSchedulingIgnoredDuringExecution:盡力滿足的規則。
示例:
affinity:podAffinity:requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- webtopologyKey: kubernetes.io/hostname
這個例子表示 Pod 只會被調度到已經運行了標簽為 app=web 的其他 Pod 的節點上。
詳細解釋
1.affinity
含義:定義 Pod 的親和力和非親和力策略。
作用:用于控制 Pod 的調度行為,確保 Pod 被調度到滿足特定條件的節點上。
2. podAffinity
含義:定義 Pod 的親和力策略。
作用:確保 Pod 與某些其他 Pod 調度到同一節點或相近的節點上。
3. requiredDuringSchedulingIgnoredDuringExecution
含義:表示這個親和力規則在調度期間是必須滿足的,但在執行期間可能會被忽略。
作用:確保在調度時,Pod 只會被調度到滿足條件的節點上。如果節點上的條件在運行時發生變化,這個規則可能會被忽略。
4. labelSelector
含義:定義標簽選擇器,用于選擇其他 Pod。
作用:通過標簽選擇器,指定哪些 Pod 是我們關心的。
5. matchExpressions
含義:定義匹配表達式,用于選擇滿足特定條件的 Pod。
作用:通過匹配表達式,指定哪些 Pod 是我們想要與當前 Pod 調度到同一節點上的。
6. key 和 operator
key:標簽的鍵。
operator:匹配操作符,可以是 In、NotIn、Exists、DoesNotExist 等。
values:標簽的值列表。
7. topologyKey
含義:定義拓撲域的鍵。
作用:指定在哪個拓撲域內應用親和力策略。常見的拓撲鍵包括:
kubernetes.io/hostname:表示節點的主機名。
failure-domain.beta.kubernetes.io/zone:表示可用區。
failure-domain.beta.kubernetes.io/region:表示區域。
非親和力(Anti-Affinity)
非親和力允許用戶定義規則,指定 Pod 不應該被調度到哪些節點上。非親和力也分為兩種類型:
節點非親和力(Node Anti-Affinity)
定義:節點非親和力允許用戶通過節點的標簽來指定 Pod 不應該被調度到哪些節點上。
作用:可以提高容錯性、確保資源隔離。
Node親和力允許你指定Pod應該被調度到具有特定標簽的節點上。它分為兩種類型:
requiredDuringSchedulingIgnoredDuringExecution:必須滿足的規則,否則Pod不會被調度。
preferredDuringSchedulingIgnoredDuringExecution:盡力滿足的規則,但不是必須的。
示例:
affinity:nodeAffinity:requiredDuringSchedulingIgnoredDuringExecution:nodeSelectorTerms:- matchExpressions:- key: coloroperator: NotInvalues:- yellow
這個例子表示 Pod 不會被調度到標簽為 color=yellow 的節點上。
Pod 非親和力(Pod Anti-Affinity)
定義:Pod 非親和力允許用戶通過其他 Pod 的標簽來指定 Pod 不應該被調度到哪些節點上。
作用:可以確保相關 Pod 不被調度到同一節點或相近的節點上,從而提高可用性。
Pod親和力允許你指定Pod應該與其他具有特定標簽的Pod共同部署在同一個節點上。它同樣分為兩種類型:
requiredDuringSchedulingIgnoredDuringExecution:必須滿足的規則。
preferredDuringSchedulingIgnoredDuringExecution:盡力滿足的規則。
示例:
affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution:- labelSelector:matchExpressions:- key: appoperator: Invalues:- dbtopologyKey: kubernetes.io/hostname
這個例子表示 Pod 不會被調度到已經運行了標簽為 app=db 的其他 Pod 的節點上。
詳細解釋
1.affinity
含義:定義 Pod 的親和力和非親和力策略。
作用:用于控制 Pod 的調度行為,確保 Pod 被調度到滿足特定條件的節點上,或者避免被調度到某些節點上。
2.podAntiAffinity
含義:定義 Pod 的非親和力策略。
作用:確保 Pod 不與某些其他 Pod 調度到同一節點或相近的節點上。
3.requiredDuringSchedulingIgnoredDuringExecution
含義:表示這個非親和力規則在調度期間是必須滿足的,但在執行期間可能會被忽略。
作用:確保在調度時,Pod 不會被調度到不符合條件的節點上。如果節點上的條件在運行時發生變化,這個規則可能會被忽略。
4.labelSelector
含義:定義標簽選擇器,用于選擇其他 Pod。
作用:通過標簽選擇器,指定哪些 Pod 是我們關心的。
5.matchExpressions
含義:定義匹配表達式,用于選擇滿足特定條件的 Pod。
作用:通過匹配表達式,指定哪些 Pod 是我們想要避免與當前 Pod 調度到同一節點上的。
6.key 和 operator
key:標簽的鍵。
operator:匹配操作符,可以是 In、NotIn、Exists、DoesNotExist 等。
values:標簽的值列表。
7.topologyKey
含義:定義拓撲域的鍵。
作用:指定在哪個拓撲域內應用非親和力策略。常見的拓撲鍵包括:
kubernetes.io/hostname:表示節點的主機名。
failure-domain.beta.kubernetes.io/zone:表示可用區。
failure-domain.beta.kubernetes.io/region:表示區域。
查看親和力設置
要查看Pod的親和力設置,可以使用kubectl describe pod 命令。這將顯示Pod的詳細信息,包括其親和力規則。