[英]How to ensure every kubernetes node running 2 or more pods?
我知道 DaemonSets 確保每個節點只運行一個 pod。 我知道 ReplicaSets 確保定義的 pod 副本數量正在運行,但不能確保每個節點都有一個 pod。
我的要求是每個節點都應該被一個 POD 占用,而且我應該能夠增加 Pod 副本數? 有什么辦法可以做到這一點?
如果我們可以使用不同的名稱部署應用程序 2 次,即第一次使用 Daemonsets,下一次使用 Replicasets? 但是有沒有更好的方法。 這樣部署就可以有一個單一名稱的清單文件。
僅供參考,他正試圖在 Google Cloud-GKE 中實現。
我的要求是每個節點都應該被一個 POD 占用,而且我應該能夠增加 Pod 副本數? 有什么辦法可以做到這一點?
不,目前 kube.netes 沒有提供一種機制可以讓你准確地實現你想要的。
仔細閱讀您的問題后,我將您的主要要求總結如下:
Pods
應該被安排在每個節點上(就像Daemonset
所做的那樣)。Pods
。 當然這樣的Pods
的數量會比 node 的數量大很多。 所以你需要能夠在每個節點上調度多個某一類型的Pod
。Pods
調度到其余節點,以便能夠處理相同的工作負載。Pods
應該重新調度到新恢復的節點上。 如果您需要在每個節點上擁有不止一個Pod
, Daemonset
絕對不是您要尋找的解決方案,因為它確保在每個節點上都運行某種類型的Pod
的一個副本。 幾個不同的Daemonsets
似乎也不是一個好的解決方案,因為在這種情況下Pods
將被單獨管理。
我還想參考@redzack 的回答。 綜合以上所有需求, podAntiAffinity
根本沒有解決這個問題。 假設您只有這 3 個節點。 如果您將replicas
數增加到 6,您將看到如下所示的內容:
NAME READY STATUS RESTARTS AGE IP NODE
web-server-1287567482-5d4dz 1/1 Running 0 7m 10.192.2.3 kube-node-1
web-server-1287567482-6f7v5 1/1 Running 0 7m 10.192.4.3 kube-node-3
web-server-1287567482-s330j 1/1 Running 0 7m 10.192.3.2 kube-node-2
web-server-1287567482-5ahfa 1/1 Pending 0 7m <none> <none>
web-server-1287567482-ah47s 1/1 Pending 0 7m <none> <none>
web-server-1287567482-ajgh7 1/1 Pending 0 7m <none> <none>
由於podAntiAffinity
,新的Pods
將沒有資格被調度到那些已經運行了此類Pod
的nodes
上。 即使您將podAntiAffinity
的類型從requiredDuringSchedulingIgnoredDuringExecution
更改為preferredDuringSchedulingIgnoredDuringExecution
,它也不會滿足您的要求,因為您最終可能會遇到以下任何情況:node1 上有 3 個 pod,node2 上有 2 個 pod,node3 上有 1 個 pod,甚至可能只有 2 個節點用過的。 所以在這種情況下,它不會比沒有任何關聯/反關聯規則的正常部署更好。
此外,它根本不會涵蓋上述要求列表中的第4點。 一旦丟失的節點被恢復,就不會重新安排那些已經在不同節點上運行的Pods
。 唯一可以保證當新節點出現/重新出現時,某種類型的Pod
被調度到該節點上的解決方案是Daemonset
。 但它不會涵蓋第2點和第 3點。 因此,您的用例沒有理想的解決方案。
如果有人有更好的想法如何無法實現,請隨時加入此線程並發布您自己的答案,但在我看來,目前這種解決方案根本不可用,至少標准 kube-scheduler 不可用。
如果在每個節點上運行的Pod
的單個副本不足以處理您的工作負載,我會說:只需使用具有所需副本數的標准Deployment
並依靠kube-scheduler來決定它將被調度到哪個節點,然后您可以非常確定,在大多數情況下它會正確地完成並平均分配您的工作量。 好吧,它不會在新的/恢復的節點上重新分配已經運行的Pods
,所以它並不完美,但我想說對於大多數情況它應該工作得很好。
首先,還可以配置 daemonset 並將其限制為不在所有節點上生成 pod。
是的,您可以通過部署 object 通過 pod affinity 將topologykey設置為"kube.netes.io/hostname"來實現在每個節點上生成的 pod。
使用上面的示例,您將具有以下行為:
我也在尋找這個特定的東西。 我們有一個 NodeJs 應用程序(因此是單線程的),我們想說“在每台主機上運行 5 個副本”,但 DaemonSet 只允許 1 個。
我仍在搜索,所以我會回來更新這個答案(除非 inte.net 風滾草抓住我),但我認為這樣做的方法是使用拓撲傳播約束。 https://kube.netes.io/docs/concepts/workloads/pods/pod-topology-spread-constraints/
它最終可能與運行多個 DaemonSets 沒有什么不同
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.