k8s中topologyKey的作用及說明
spec:
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: rcs-prod
operator: In
values:
- 'true'
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector: {}
topologyKey: rcs-prod
podAntiAffinity: {}topologyKey的作用
一、topologyKey的核心作用
topologyKey 通過 節(jié)點(diǎn)的標(biāo)簽(Label) 劃分邏輯上的“拓?fù)溆?rdquo;,用于實(shí)現(xiàn):
1.Pod 親和性(PodAffinity)
將 Pod 調(diào)度到與目標(biāo) Pod 相同的拓?fù)溆?/strong>(例如同一機(jī)架、可用區(qū)或自定義分組)。
2.Pod 反親和性(PodAntiAffinity)
阻止 Pod 調(diào)度到與目標(biāo) Pod 相同的拓?fù)溆?/strong>(例如避免單節(jié)點(diǎn)或單可用區(qū)部署)。
二、topologyKey的值來源
topologyKey 的值是 節(jié)點(diǎn)標(biāo)簽的鍵(Key),可以是:
Kubernetes 內(nèi)置標(biāo)簽
kubernetes.io/hostname(節(jié)點(diǎn)主機(jī)名,粒度最細(xì))topology.kubernetes.io/zone(可用區(qū),如 AWS 的us-east-1a)topology.kubernetes.io/region(地域,如us-east-1)
topologyKey 是 Pod 親和性/反親和性規(guī)則中用于定義"拓?fù)溆?quot;的節(jié)點(diǎn)標(biāo)簽鍵。它決定了如何將節(jié)點(diǎn)分組以實(shí)現(xiàn) Pod 的共置或隔離:
- 當(dāng)兩個(gè) Pod 在具有相同
topologyKey值的節(jié)點(diǎn)上時(shí),它們被視為在同一拓?fù)溆蛑?/li> - 對(duì)于 podAffinity,Kubernetes 會(huì)嘗試將 Pod 調(diào)度到與指定 Pod 在同一拓?fù)溆虻墓?jié)點(diǎn)上
- 對(duì)于 podAntiAffinity,Kubernetes 會(huì)確保 Pod 不會(huì)被調(diào)度到與指定 Pod 在同一拓?fù)溆虻墓?jié)點(diǎn)上
調(diào)度器如何工作
當(dāng)調(diào)度器決定pod調(diào)度到哪里時(shí),它首先檢查pod的podAffinity配置,找 出那些符合標(biāo)簽選擇器的pod, 接著查詢這些pod運(yùn)行在哪些節(jié)點(diǎn)上。
特別的是, 它會(huì)尋找標(biāo)簽?zāi)芷ヅ鋚odAffinity配置中topologyKey的節(jié)點(diǎn)。接著,它會(huì)優(yōu) 先選擇所有的標(biāo)簽匹配pod的值的節(jié)點(diǎn)。

配置詳細(xì)解釋
nodeAffinity 部分
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: rcs-prod
operator: In
values:
- 'true'- 含義:Pod 必須被調(diào)度到帶有標(biāo)簽
rcs-prod=true的節(jié)點(diǎn)上 requiredDuringSchedulingIgnoredDuringExecution表示這是硬性要求,調(diào)度時(shí)必須滿足
podAffinity 部分
podAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector: {}
topologyKey: rcs-prod含義:Pod 必須與集群中所有其他 Pod 部署在相同拓?fù)溆颍淳哂邢嗤?nbsp;rcs-prod 標(biāo)簽值的節(jié)點(diǎn)上)
labelSelector: {}匹配所有 Pod,因?yàn)闆]有指定具體標(biāo)簽topologyKey: rcs-prod表示使用節(jié)點(diǎn)的rcs-prod標(biāo)簽作為拓?fù)溆?/li>
podAntiAffinity 部分
podAntiAffinity: {}這是一個(gè)空配置,表示沒有 Pod 反親和性規(guī)則
綜合理解
這個(gè)配置的整體效果是:
- Pod 只能被調(diào)度到帶有
rcs-prod=true標(biāo)簽的節(jié)點(diǎn)上 - Pod 必須與所有其他 Pod 部署在相同拓?fù)溆颍此?Pod 都在具有相同
rcs-prod標(biāo)簽值的節(jié)點(diǎn)上)
注意:這里的 podAffinity 配置有些特殊,因?yàn)樗褂昧丝諛?biāo)簽選擇器匹配所有 Pod,這可能導(dǎo)致調(diào)度困難,除非集群中所有節(jié)點(diǎn)都有相同的 rcs-prod 標(biāo)簽值。
當(dāng)前的設(shè)置并不能避免相同的 Pod 調(diào)度到同一個(gè)節(jié)點(diǎn)上。以下是詳細(xì)分析:
為什么當(dāng)前配置不能防止相同 Pod 調(diào)度到同一節(jié)點(diǎn)?
1.缺少 podAntiAffinity 規(guī)則
- 您當(dāng)前的
podAntiAffinity: {}是空的,沒有定義任何反親和性規(guī)則。 - 要阻止相同 Pod 調(diào)度到同一節(jié)點(diǎn),必須明確配置反親和性。
2.podAffinity 的作用是共置(co-location),而非隔離
- 當(dāng)前的
podAffinity只是強(qiáng)制 Pod 必須調(diào)度到具有相同rcs-prod標(biāo)簽值的節(jié)點(diǎn),但不會(huì)阻止相同 Pod 部署到同一節(jié)點(diǎn)。
3.topologyKey 在 podAffinity 中的用途
- 它僅定義“拓?fù)溆?rdquo;(如節(jié)點(diǎn)、機(jī)架、區(qū)域等),而不是 Pod 之間的排斥規(guī)則。
- 當(dāng)前的
topologyKey: rcs-prod僅確保 Pod 調(diào)度到具有相同rcs-prod標(biāo)簽值的節(jié)點(diǎn),但不會(huì)限制同一節(jié)點(diǎn)上的副本數(shù)量。
如何修改配置以避免相同 Pod 調(diào)度到同一節(jié)點(diǎn)?
如果希望 相同的 Pod 不被調(diào)度到同一個(gè)節(jié)點(diǎn)(例如避免單點(diǎn)故障),需要配置 podAntiAffinity,例如:
方案 1:硬性反親和性(不允許同一節(jié)點(diǎn)調(diào)度)
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution: # 硬性要求
- labelSelector:
matchLabels:
app: your-pod-label # 替換為您的 Pod 標(biāo)簽
topologyKey: kubernetes.io/hostname # 以節(jié)點(diǎn)主機(jī)名為拓?fù)溆?/pre>方案 2:軟性反親和性(盡量不調(diào)度到同一節(jié)點(diǎn))
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution: # 軟性偏好
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: your-pod-label
topologyKey: kubernetes.io/hostname關(guān)鍵點(diǎn)說明
1.topologyKey 的選擇
- 如果使用
kubernetes.io/hostname,則反親和性針對(duì)單個(gè)節(jié)點(diǎn)(最嚴(yán)格)。 - 如果使用其他標(biāo)簽(如
zone),則反親和性會(huì)作用于更廣的拓?fù)溆颍ㄈ缯麄€(gè)可用區(qū))。
2.labelSelector 必須匹配 Pod 標(biāo)簽
- 您需要確保
matchLabels中的標(biāo)簽與您的 Pod 模板中定義的標(biāo)簽一致,例如:
metadata:
labels:
app: your-pod-label # 需與反親和性規(guī)則匹配3.nodeAffinity 和 podAntiAffinity 可以共存
- 您的原有
nodeAffinity可以保留,只需補(bǔ)充podAntiAffinity即可。
最終建議配置
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: rcs-prod
operator: In
values:
- "true"
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: your-pod-label # 替換為您的實(shí)際 Pod 標(biāo)簽
topologyKey: kubernetes.io/hostname # 確保不調(diào)度到同一節(jié)點(diǎn)這樣既能滿足節(jié)點(diǎn)親和性要求,又能避免相同 Pod 調(diào)度到同一節(jié)點(diǎn)。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
解決k8s namespace 一直處于 Terminating 狀態(tài)的問題
這篇文章主要介紹了k8s namespace 一直處于 Terminating 狀態(tài)的解決方法,以下的 tool 為 Terminating 狀態(tài)的 namespace,下面相關(guān)的一些操作記得將 tool 修改成自己的 namespace 名稱,需要的朋友可以參考下2022-10-10
Kubernetes調(diào)度機(jī)制與策略實(shí)驗(yàn)詳解
本文通過實(shí)際操作,詳細(xì)介紹了Kubernetes調(diào)度機(jī)制的核心原理和常用調(diào)度策略的配置方法,包括節(jié)點(diǎn)選擇、親和性與反親和性、污點(diǎn)與容忍等,實(shí)驗(yàn)環(huán)境為Kubernetes集群,并通過一系列步驟驗(yàn)證了這些調(diào)度策略的實(shí)際應(yīng)用2025-12-12
Kubernetes從私有鏡像倉庫拉取容器鏡像時(shí)的身份驗(yàn)證方式
Kubernetes從私有鏡像倉庫拉取容器鏡像時(shí),需要使用私有倉庫的憑證進(jìn)行身份驗(yàn)證,這些憑證可以存儲(chǔ)在`private-registry-auth`這個(gè)Secret中,然后在Pod或ServiceAccount中指定使用該Secret,這樣可以確保Pod在拉取鏡像時(shí)能夠正確進(jìn)行身份驗(yàn)證2026-01-01
k8s Job 執(zhí)行一次性以及批處理任務(wù)使用場(chǎng)景案例
這篇文章主要為大家介紹了k8s Job 執(zhí)行一次性以及批處理任務(wù)使用場(chǎng)景案例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-04-04
Kubernetes應(yīng)用配置管理創(chuàng)建使用詳解
這篇文章主要為大家介紹了Kubernetes應(yīng)用配置管理創(chuàng)建使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-11-11
ES業(yè)務(wù)數(shù)據(jù)遷移遇到的精度問題BUG
這篇文章主要為大家介紹了ES業(yè)務(wù)數(shù)據(jù)遷移遇到的BUG精度問題,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06

