簡體   English   中英

如何確保每個 kube.netes 節點運行 2 個或更多 pod?

[英]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 沒有提供一種機制可以讓你准確地實現你想要的。

仔細閱讀您的問題后,我將您的主要要求總結如下:

  1. Pods應該被安排在每個節點上(就像Daemonset所做的那樣)。
  2. 同時,您需要能夠在所有節點上調度所需數量的某種類型的Pods 當然這樣的Pods的數量會比 node 的數量大很多 所以你需要能夠在每個節點上調度多個某一類型的Pod
  3. 當其中一個節點暫時不可用時,應該將丟失的Pods調度到其余節點,以便能夠處理相同的工作負載。
  4. 當節點再次可用時,之前移動到其他節點的Pods應該重新調度到新恢復的節點上。

如果您需要在每個節點上擁有不止一個PodDaemonset絕對不是您要尋找的解決方案,因為它確保在每個節點上都運行某種類型的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將沒有資格被調度到那些已經運行了此類Podnodes上。 即使您將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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM