約束一個(gè) Pod可以限制其只能在特定的節(jié)點(diǎn)上運(yùn)行,或優(yōu)先在特定的節(jié)點(diǎn)上運(yùn)行。有幾種方法可以實(shí)現(xiàn)這一點(diǎn),推薦的方法都是用標(biāo)簽選擇算符來進(jìn)行選擇。通常這樣的約束不是必須的,因?yàn)檎{(diào)度器將自動(dòng)進(jìn)行合理的放置(比如,將 Pod 分散到節(jié)點(diǎn)上,而不是將 Pod 放置在可用資源不足的節(jié)點(diǎn)上等等)。但在某些情況下,可能需要進(jìn)一步控制 Pod 被部署到哪個(gè)節(jié)點(diǎn)。例如,確保 Pod 最終落在連接了 SSD 的機(jī)器上,或者將來自兩個(gè)不同的服務(wù)且有大量通信的 Pod 被放置在同一個(gè)可用區(qū)。
使用下列方法中的任何一種可以來選擇 Kubernetes 對(duì)特定 Pod 的調(diào)度:
- 與節(jié)點(diǎn)標(biāo)簽匹配的 nodeSelector;
- 親和性與反親和性;
- nodeName 字段;
- Pod 拓?fù)浞植技s束。
一、節(jié)點(diǎn)標(biāo)簽
與很多其他 Kubernetes 對(duì)象類似,節(jié)點(diǎn)也有標(biāo)簽。 可以手動(dòng)地添加標(biāo)簽; Kubernetes 也會(huì)為集群中所有節(jié)點(diǎn)添加一些標(biāo)準(zhǔn)的標(biāo)簽。這些標(biāo)簽的取值是取決于云提供商的,并且是無法在可靠性上給出承諾的。 例如,kubernetes.io/hostname 的取值在某些環(huán)境中可能與節(jié)點(diǎn)名稱相同, 而在其他環(huán)境中會(huì)取不同的值。
二、節(jié)點(diǎn)隔離/限制
通過為節(jié)點(diǎn)添加標(biāo)簽,可以準(zhǔn)備讓 Pod 調(diào)度到特定節(jié)點(diǎn)或節(jié)點(diǎn)組上。 可以使用這個(gè)功能來確保特定的 Pod 只能運(yùn)行在具有一定隔離性、安全性或監(jiān)管屬性的節(jié)點(diǎn)上。
如果使用標(biāo)簽來實(shí)現(xiàn)節(jié)點(diǎn)隔離,建議選擇節(jié)點(diǎn)上的 kubelet 無法修改的標(biāo)簽鍵。 這可以防止受感染的節(jié)點(diǎn)在自身上設(shè)置這些標(biāo)簽,進(jìn)而影響調(diào)度器將工作負(fù)載調(diào)度到受感染的節(jié)點(diǎn)。
NodeRestriction 準(zhǔn)入插件防止 kubelet 使用 node-restriction.kubernetes.io/ 前綴設(shè)置或修改標(biāo)簽。要使用該標(biāo)簽前綴進(jìn)行節(jié)點(diǎn)隔離:
1、確保在使用節(jié)點(diǎn)鑒權(quán)機(jī)制并且已經(jīng)啟用了 NodeRestriction 準(zhǔn)入插件。
2、將帶有 node-restriction.kubernetes.io/ 前綴的標(biāo)簽添加到 Node 對(duì)象, 然后在節(jié)點(diǎn)選擇算符中使用這些標(biāo)簽。 例如,example.com.node-restriction.kubernetes.io/fips=true 或 example.com.node-restriction.kubernetes.io/pci-dss=true。
三、nodeSelector
nodeSelector 是節(jié)點(diǎn)選擇約束的最簡(jiǎn)單推薦形式??梢詫?nodeSelector 字段添加到 Pod 的規(guī)約中設(shè)置希望目標(biāo)節(jié)點(diǎn)所具有的節(jié)點(diǎn)標(biāo)簽。 Kubernetes 只會(huì)將 Pod 調(diào)度到擁有所指定的每個(gè)標(biāo)簽的節(jié)點(diǎn)上。
四、親和性與反親和性
nodeSelector 提供了一種最簡(jiǎn)單的方法來將 Pod 約束到具有特定標(biāo)簽的節(jié)點(diǎn)上,親和性和反親和性擴(kuò)展了可以定義的約束類型,使用親和性與反親和性的一些好處有:
- 親和性、反親和性語言的表達(dá)能力更強(qiáng);nodeSelector 只能選擇擁有所有指定標(biāo)簽的節(jié)點(diǎn),而親和性、反親和性為提供對(duì)選擇邏輯的更強(qiáng)控制能力;
- 可以標(biāo)明某規(guī)則是“軟需求”或者“偏好”,這樣調(diào)度器在無法找到匹配節(jié)點(diǎn)時(shí)仍然調(diào)度該 Pod;
- 可以使用節(jié)點(diǎn)上(或其他拓?fù)溆蛑校┻\(yùn)行的其他 Pod 的標(biāo)簽來實(shí)施調(diào)度約束, 而不是只能使用節(jié)點(diǎn)本身的標(biāo)簽。這個(gè)能力讓能夠定義規(guī)則允許哪些 Pod 可以被放置在一起。
親和性功能由兩種類型的親和性組成:
- 節(jié)點(diǎn)親和性功能類似于 nodeSelector 字段,但它的表達(dá)能力更強(qiáng),并且允許指定軟規(guī)則;
- Pod 間親和性/反親和性允許根據(jù)其他 Pod 的標(biāo)簽來約束 Pod。
1、節(jié)點(diǎn)親和性
節(jié)點(diǎn)親和性概念上類似于 nodeSelector, 它使可以根據(jù)節(jié)點(diǎn)上的標(biāo)簽來約束 Pod 可以調(diào)度到哪些節(jié)點(diǎn)上。 節(jié)點(diǎn)親和性有兩種:
- requiredDuringSchedulingIgnoredDuringExecution: 調(diào)度器只有在規(guī)則被滿足的時(shí)候才能執(zhí)行調(diào)度。此功能類似于 nodeSelector, 但其語法表達(dá)能力更強(qiáng);
- preferredDuringSchedulingIgnoredDuringExecution: 調(diào)度器會(huì)嘗試尋找滿足對(duì)應(yīng)規(guī)則的節(jié)點(diǎn)。如果找不到匹配的節(jié)點(diǎn),調(diào)度器仍然會(huì)調(diào)度該 Pod。
在上述類型中,IgnoredDuringExecution 意味著如果節(jié)點(diǎn)標(biāo)簽在 Kubernetes 調(diào)度 Pod 后發(fā)生了變更,Pod 仍將繼續(xù)運(yùn)行。
可以使用 Pod 規(guī)約中的 .spec.affinity.nodeAffinity 字段來設(shè)置節(jié)點(diǎn)親和性。 例如,考慮下面的 Pod 規(guī)約:
apiVersion: v1 kind: Pod metadata: name: with-node-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: topology.kubernetes.io/zone operator: In values: - antarctica-east1 - antarctica-west1 preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: another-node-label-key operator: In values: - another-node-label-value containers: - name: with-node-affinity image: registry.k8s.io/pause:2.0
在這一示例中,所應(yīng)用的規(guī)則如下:
- 節(jié)點(diǎn)必須包含一個(gè)鍵名為 topology.kubernetes.io/zone 的標(biāo)簽, 并且該標(biāo)簽的取值必須為 antarctica-east1 或 antarctica-west1;
- 節(jié)點(diǎn)最好具有一個(gè)鍵名為 another-node-label-key 且取值為 another-node-label-value 的標(biāo)簽。
可以使用 operator 字段來為 Kubernetes 設(shè)置在解釋規(guī)則時(shí)要使用的邏輯操作符。 可以使用 In、NotIn、Exists、DoesNotExist、Gt 和 Lt 之一作為操作符。NotIn 和 DoesNotExist 可用來實(shí)現(xiàn)節(jié)點(diǎn)反親和性行為。 也可以使用節(jié)點(diǎn)污點(diǎn) 將 Pod 從特定節(jié)點(diǎn)上驅(qū)逐。
如果同時(shí)指定了 nodeSelector 和 nodeAffinity,兩者 必須都要滿足, 才能將 Pod 調(diào)度到候選節(jié)點(diǎn)上;如果在與 nodeAffinity 類型關(guān)聯(lián)的 nodeSelectorTerms 中指定多個(gè)條件, 只要其中一個(gè) nodeSelectorTerms 滿足(各個(gè)條件按邏輯或操作組合)的話,Pod 就可以被調(diào)度到節(jié)點(diǎn)上;如果在與 nodeSelectorTerms 中的條件相關(guān)聯(lián)的單個(gè) matchExpressions 字段中指定多個(gè)表達(dá)式, 則只有當(dāng)所有表達(dá)式都滿足(各表達(dá)式按邏輯與操作組合)時(shí),Pod 才能被調(diào)度到節(jié)點(diǎn)上。
2、節(jié)點(diǎn)親和性權(quán)重
可以為 preferredDuringSchedulingIgnoredDuringExecution 親和性類型的每個(gè)實(shí)例設(shè)置 weight 字段,其取值范圍是 1 到 100。 當(dāng)調(diào)度器找到能夠滿足 Pod 的其他調(diào)度請(qǐng)求的節(jié)點(diǎn)時(shí),調(diào)度器會(huì)遍歷節(jié)點(diǎn)滿足的所有的偏好性規(guī)則, 并將對(duì)應(yīng)表達(dá)式的 weight 值加和。
最終的加和值會(huì)添加到該節(jié)點(diǎn)的其他優(yōu)先級(jí)函數(shù)的評(píng)分之上。 在調(diào)度器為 Pod 作出調(diào)度決定時(shí),總分最高的節(jié)點(diǎn)的優(yōu)先級(jí)也最高。
例如,考慮下面的 Pod 規(guī)約:
apiVersion: v1 kind: Pod metadata: name: with-affinity-anti-affinity spec: affinity: nodeAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/os operator: In values: - linux preferredDuringSchedulingIgnoredDuringExecution: - weight: 1 preference: matchExpressions: - key: label-1 operator: In values: - key-1 - weight: 50 preference: matchExpressions: - key: label-2 operator: In values: - key-2 containers: - name: with-node-affinity image: registry.k8s.io/pause:2.0
如果存在兩個(gè)候選節(jié)點(diǎn),都滿足 preferredDuringSchedulingIgnoredDuringExecution 規(guī)則, 其中一個(gè)節(jié)點(diǎn)具有標(biāo)簽 label-1:key-1,另一個(gè)節(jié)點(diǎn)具有標(biāo)簽 label-2:key-2, 調(diào)度器會(huì)考察各個(gè)節(jié)點(diǎn)的 weight 取值,并將該權(quán)重值添加到節(jié)點(diǎn)的其他得分值之上,
如果希望 Kubernetes 能夠成功地調(diào)度此例中的 Pod,必須擁有打了 kubernetes.io/os=linux 標(biāo)簽的節(jié)點(diǎn)。
3、逐個(gè)調(diào)度方案中設(shè)置節(jié)點(diǎn)親和性
在配置多個(gè)調(diào)度方案時(shí), 可以將某個(gè)方案與節(jié)點(diǎn)親和性關(guān)聯(lián)起來,如果某個(gè)調(diào)度方案僅適用于某組特殊的節(jié)點(diǎn)時(shí), 這樣做是很有用的。 要實(shí)現(xiàn)這點(diǎn),可以在調(diào)度器配置中為 NodeAffinity 插件的 args 字段添加 addedAffinity。例如:
apiVersion: kubescheduler.config.k8s.io/v1beta3 kind: KubeSchedulerConfiguration profiles: - schedulerName: default-scheduler - schedulerName: foo-scheduler pluginConfig: - name: NodeAffinity args: addedAffinity: requiredDuringSchedulingIgnoredDuringExecution: nodeSelectorTerms: - matchExpressions: - key: scheduler-profile operator: In values: - foo
這里的 addedAffinity 除遵從 Pod 規(guī)約中設(shè)置的節(jié)點(diǎn)親和性之外, 還適用于將 .spec.schedulerName 設(shè)置為 foo-scheduler。 換言之,為了匹配 Pod,節(jié)點(diǎn)需要滿足 addedAffinity 和 Pod 的 .spec.NodeAffinity。
由于 addedAffinity 對(duì)最終用戶不可見,其行為可能對(duì)用戶而言是出乎意料的。 應(yīng)該使用與調(diào)度方案名稱有明確關(guān)聯(lián)的節(jié)點(diǎn)標(biāo)簽。
DaemonSet 控制器為 DaemonSet 創(chuàng)建 Pod, 但該控制器不理會(huì)調(diào)度方案。 DaemonSet 控制器創(chuàng)建 Pod 時(shí),默認(rèn)的 Kubernetes 調(diào)度器負(fù)責(zé)放置 Pod, 并遵從 DaemonSet 控制器中設(shè)置的 nodeAffinity 規(guī)則。
4、Pod 間親和性與反親和性
Pod 間親和性與反親和性使可以基于已經(jīng)在節(jié)點(diǎn)上運(yùn)行的 Pod 的標(biāo)簽來約束 Pod 可以調(diào)度到的節(jié)點(diǎn),而不是基于節(jié)點(diǎn)上的標(biāo)簽。
Pod 間親和性與反親和性的規(guī)則格式為“如果 X 上已經(jīng)運(yùn)行了一個(gè)或多個(gè)滿足規(guī)則 Y 的 Pod, 則這個(gè) Pod 應(yīng)該(或者在反親和性的情況下不應(yīng)該)運(yùn)行在 X 上”。 這里的 X 可以是節(jié)點(diǎn)、機(jī)架、云提供商可用區(qū)或地理區(qū)域或類似的拓?fù)溆颍?Y 則是 Kubernetes 嘗試滿足的規(guī)則。
通過標(biāo)簽選擇算符的形式來表達(dá)規(guī)則(Y),并可根據(jù)需要指定選關(guān)聯(lián)的名字空間列表。 Pod 在 Kubernetes 中是名字空間作用域的對(duì)象,因此 Pod 的標(biāo)簽也隱式地具有名字空間屬性。 針對(duì) Pod 標(biāo)簽的所有標(biāo)簽選擇算符都要指定名字空間,Kubernetes 會(huì)在指定的名字空間內(nèi)尋找標(biāo)簽。
會(huì)通過 topologyKey 來表達(dá)拓?fù)溆颍╔)的概念,其取值是系統(tǒng)用來標(biāo)示域的節(jié)點(diǎn)標(biāo)簽鍵。 相關(guān)示例可參見常用標(biāo)簽、注解和污點(diǎn)。
注意:
- Pod 間親和性和反親和性都需要相當(dāng)?shù)挠?jì)算量,因此會(huì)在大規(guī)模集群中顯著降低調(diào)度速度。 我們不建議在包含數(shù)百個(gè)節(jié)點(diǎn)的集群中使用這類設(shè)置;
- Pod 反親和性需要節(jié)點(diǎn)上存在一致性的標(biāo)簽。換言之, 集群中每個(gè)節(jié)點(diǎn)都必須擁有與topologyKey 匹配的標(biāo)簽。 如果某些或者所有節(jié)點(diǎn)上不存在所指定的 topologyKey 標(biāo)簽,調(diào)度行為可能與預(yù)期的不同。
與節(jié)點(diǎn)親和性類似,Pod 的親和性與反親和性也有兩種類型:
- requiredDuringSchedulingIgnoredDuringExecution
- preferredDuringSchedulingIgnoredDuringExecution
例如,可以使用 requiredDuringSchedulingIgnoredDuringExecution 親和性來告訴調(diào)度器, 將兩個(gè)服務(wù)的 Pod 放到同一個(gè)云提供商可用區(qū)內(nèi),因?yàn)樗鼈儽舜酥g通信非常頻繁。 類似地,可以使用 preferredDuringSchedulingIgnoredDuringExecution 反親和性來將同一服務(wù)的多個(gè) Pod 分布到多個(gè)云提供商可用區(qū)中。
要使用 Pod 間親和性,可以使用 Pod 規(guī)約中的 .affinity.podAffinity 字段。 對(duì)于 Pod 間反親和性,可以使用 Pod 規(guī)約中的 .affinity.podAntiAffinity 字段。
調(diào)度一組具有 Pod 間親和性的 Pod:
如果當(dāng)前正被調(diào)度的 Pod 在具有自我親和性的 Pod 序列中排在第一個(gè), 那么只要它滿足其他所有的親和性規(guī)則,它就可以被成功調(diào)度。 這是通過以下方式確定的:確保集群中沒有其他 Pod 與此 Pod 的名字空間和標(biāo)簽選擇算符匹配; 該 Pod 滿足其自身定義的條件,并且選定的節(jié)點(diǎn)滿足所指定的所有拓?fù)湟蟆?這確保即使所有的 Pod 都配置了 Pod 間親和性,也不會(huì)出現(xiàn)調(diào)度死鎖的情況。
Pod 親和性考慮下面的 Pod 規(guī)約:
apiVersion: v1 kind: Pod metadata: name: with-pod-affinity spec: affinity: podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: security operator: In values: - S1 topologyKey: topology.kubernetes.io/zone podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: security operator: In values: - S2 topologyKey: topology.kubernetes.io/zone containers: - name: with-pod-affinity image: registry.k8s.io/pause:2.0
本示例定義了一條 Pod 親和性規(guī)則和一條 Pod 反親和性規(guī)則。Pod 親和性規(guī)則配置為 requiredDuringSchedulingIgnoredDuringExecution,而 Pod 反親和性配置為 preferredDuringSchedulingIgnoredDuringExecution。
親和性規(guī)則規(guī)定,只有節(jié)點(diǎn)屬于特定的 區(qū)域 且該區(qū)域中的其他 Pod 已打上 security=S1 標(biāo)簽時(shí),調(diào)度器才可以將示例 Pod 調(diào)度到此節(jié)點(diǎn)上。 例如,如果我們有一個(gè)具有指定區(qū)域(稱之為 “Zone V”)的集群,此區(qū)域由帶有 topology.kubernetes.io/zone=V 標(biāo)簽的節(jié)點(diǎn)組成,那么只要 Zone V 內(nèi)已經(jīng)至少有一個(gè) Pod 打了 security=S1 標(biāo)簽, 調(diào)度器就可以將此 Pod 調(diào)度到 Zone V 內(nèi)的任何節(jié)點(diǎn)。相反,如果 Zone V 中沒有帶有 security=S1 標(biāo)簽的 Pod, 則調(diào)度器不會(huì)將示例 Pod 調(diào)度給該區(qū)域中的任何節(jié)點(diǎn)。
反親和性規(guī)則規(guī)定,如果節(jié)點(diǎn)屬于特定的 區(qū)域 且該區(qū)域中的其他 Pod 已打上 security=S2 標(biāo)簽,則調(diào)度器應(yīng)嘗試避免將 Pod 調(diào)度到此節(jié)點(diǎn)上。 例如,如果我們有一個(gè)具有指定區(qū)域(我們稱之為 “Zone R”)的集群,此區(qū)域由帶有 topology.kubernetes.io/zone=R 標(biāo)簽的節(jié)點(diǎn)組成,只要 Zone R 內(nèi)已經(jīng)至少有一個(gè) Pod 打了 security=S2 標(biāo)簽, 調(diào)度器應(yīng)避免將 Pod 分配給 Zone R 內(nèi)的任何節(jié)點(diǎn)。相反,如果 Zone R 中沒有帶有 security=S2 標(biāo)簽的 Pod, 則反親和性規(guī)則不會(huì)影響將 Pod 調(diào)度到 Zone R。
可以針對(duì) Pod 間親和性與反親和性為其 operator 字段使用 In、NotIn、Exists、 DoesNotExist 等值。
原則上,topologyKey 可以是任何合法的標(biāo)簽鍵。出于性能和安全原因,topologyKey 有一些限制:
- 對(duì)于 Pod 親和性而言,在 requiredDuringSchedulingIgnoredDuringExecution 和 preferredDuringSchedulingIgnoredDuringExecution 中,topologyKey 不允許為空;
- 對(duì)于 requiredDuringSchedulingIgnoredDuringExecution 要求的 Pod 反親和性, 準(zhǔn)入控制器 LimitPodHardAntiAffinityTopology 要求 topologyKey 只能是 kubernetes.io/hostname。如果希望使用其他定制拓?fù)溥壿嫞?可以更改準(zhǔn)入控制器或者禁用之。
除了 labelSelector 和 topologyKey,也可以指定 labelSelector 要匹配的名字空間列表,方法是在 labelSelector 和 topologyKey 所在層同一層次上設(shè)置 namespaces。 如果 namespaces 被忽略或者為空,則默認(rèn)為 Pod 親和性/反親和性的定義所在的名字空間。
5、名字空間選擇算符
用戶也可以使用 namespaceSelector 選擇匹配的名字空間,namespaceSelector 是對(duì)名字空間集合進(jìn)行標(biāo)簽查詢的機(jī)制。 親和性條件會(huì)應(yīng)用到 namespaceSelector 所選擇的名字空間和 namespaces 字段中所列舉的名字空間之上。 注意,空的 namespaceSelector({})會(huì)匹配所有名字空間,而 null 或者空的 namespaces 列表以及 null 值 namespaceSelector 意味著“當(dāng)前 Pod 的名字空間”。
6、更實(shí)際的用例
Pod 間親和性與反親和性在與更高級(jí)別的集合(例如 ReplicaSet、StatefulSet、 Deployment 等)一起使用時(shí),它們可能更加有用。 這些規(guī)則使得可以配置一組工作負(fù)載,使其位于所定義的同一拓?fù)渲校?例如優(yōu)先將兩個(gè)相關(guān)的 Pod 置于相同的節(jié)點(diǎn)上。
以一個(gè)三節(jié)點(diǎn)的集群為例。使用該集群運(yùn)行一個(gè)帶有內(nèi)存緩存(例如 Redis)的 Web 應(yīng)用程序。 在此例中,還假設(shè) Web 應(yīng)用程序和內(nèi)存緩存之間的延遲應(yīng)盡可能低。 可以使用 Pod 間的親和性和反親和性來盡可能地將該 Web 服務(wù)器與緩存并置。
在下面的 Redis 緩存 Deployment 示例中,副本上設(shè)置了標(biāo)簽 app=store。 podAntiAffinity 規(guī)則告訴調(diào)度器避免將多個(gè)帶有 app=store 標(biāo)簽的副本部署到同一節(jié)點(diǎn)上。 因此,每個(gè)獨(dú)立節(jié)點(diǎn)上會(huì)創(chuàng)建一個(gè)緩存實(shí)例。
apiVersion: apps/v1 kind: Deployment metadata: name: redis-cache spec: selector: matchLabels: app: store replicas: 3 template: metadata: labels: app: store spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - store topologyKey: "kubernetes.io/hostname" containers: - name: redis-server image: redis:3.2-alpine
下例的 Deployment 為 Web 服務(wù)器創(chuàng)建帶有標(biāo)簽 app=web-store 的副本。 Pod 親和性規(guī)則告訴調(diào)度器將每個(gè)副本放到存在標(biāo)簽為 app=store 的 Pod 的節(jié)點(diǎn)上。 Pod 反親和性規(guī)則告訴調(diào)度器決不要在單個(gè)節(jié)點(diǎn)上放置多個(gè) app=web-store 服務(wù)器。
apiVersion: apps/v1 kind: Deployment metadata: name: web-server spec: selector: matchLabels: app: web-store replicas: 3 template: metadata: labels: app: web-store spec: affinity: podAntiAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - web-store topologyKey: "kubernetes.io/hostname" podAffinity: requiredDuringSchedulingIgnoredDuringExecution: - labelSelector: matchExpressions: - key: app operator: In values: - store topologyKey: "kubernetes.io/hostname" containers: - name: web-app image: nginx:1.16-alpine
創(chuàng)建前面兩個(gè) Deployment 會(huì)產(chǎn)生如下的集群布局,每個(gè) Web 服務(wù)器與一個(gè)緩存實(shí)例并置, 并分別運(yùn)行在三個(gè)獨(dú)立的節(jié)點(diǎn)上。
總體效果是每個(gè)緩存實(shí)例都非??赡鼙辉谕粋€(gè)節(jié)點(diǎn)上運(yùn)行的某個(gè)客戶端訪問。 這種方法旨在最大限度地減少偏差(負(fù)載不平衡)和延遲.
五、nodeName
nodeName 是比親和性或者 nodeSelector 更為直接的形式。nodeName 是 Pod 規(guī)約中的一個(gè)字段。如果 nodeName 字段不為空,調(diào)度器會(huì)忽略該 Pod, 而指定節(jié)點(diǎn)上的 kubelet 會(huì)嘗試將 Pod 放到該節(jié)點(diǎn)上。 使用 nodeName 規(guī)則的優(yōu)先級(jí)會(huì)高于使用 nodeSelector 或親和性與非親和性的規(guī)則。
使用 nodeName 來選擇節(jié)點(diǎn)的方式有一些局限性:
- 如果所指代的節(jié)點(diǎn)不存在,則 Pod 無法運(yùn)行,而且在某些情況下可能會(huì)被自動(dòng)刪除;
- 如果所指代的節(jié)點(diǎn)無法提供用來運(yùn)行 Pod 所需的資源,Pod 會(huì)失敗, 而其失敗原因中會(huì)給出是否因?yàn)閮?nèi)存或 CPU 不足而造成無法運(yùn)行;
- 在云環(huán)境中的節(jié)點(diǎn)名稱并不總是可預(yù)測(cè)的,也不總是穩(wěn)定的。
nodeName 旨在供自定義調(diào)度器或需要繞過任何已配置調(diào)度器的高級(jí)場(chǎng)景使用。 如果已分配的 Node 負(fù)載過重,繞過調(diào)度器可能會(huì)導(dǎo)致 Pod 失敗。 可以使用節(jié)點(diǎn)親和性或 nodeselector 字段將 Pod 分配給特定 Node,而無需繞過調(diào)度器。
下面是一個(gè)使用 nodeName 字段的 Pod 規(guī)約示例:
apiVersion: v1 kind: Pod metadata: name: nginx spec: containers: - name: nginx image: nginx nodeName: kube-01
上面的 Pod 只能運(yùn)行在節(jié)點(diǎn) kube-01 之上。
六、Pod拓?fù)浞植技s束
可以使用 拓?fù)浞植技s束(Topology Spread Constraints) 來控制 Pod 在集群內(nèi)故障域之間的分布, 故障域的示例有區(qū)域(Region)、可用區(qū)(Zone)、節(jié)點(diǎn)和其他用戶自定義的拓?fù)溆颉?這樣做有助于提升性能、實(shí)現(xiàn)高可用或提升資源利用率。
七、操作符
下面是可以在上述 nodeAffinity 和 podAffinity 的 operator 字段中可以使用的所有邏輯運(yùn)算符。
以下操作符只能與 nodeAffinity 一起使用。
Gt 和 Lt 操作符不能與非整數(shù)值一起使用。 如果給定的值未解析為整數(shù),則該 Pod 將無法被調(diào)度。 另外,Gt 和 Lt 不適用于 podAffinity。