貝寶如何將Kubernetes擴充套件到超過4k個節點和200k個Pod?
在 PayPal,我們最近開始使用 Kubernetes 試水。我們的大部分工作負載都在 Apache Mesos 上執行,作為遷移的一部分,我們需要了解執行 Kubernetes 和 PayPal 特定控制平面的叢集的幾個效能方面。這些方面的主要內容是瞭解平臺的可擴充套件性以及通過調整叢集來確定改進的機會。
與 Apache Mesos 可以開箱即用地擴充套件至 10,000 個節點不同,擴充套件 Kubernetes 具有挑戰性。Kubernetes 的可擴充套件性不僅限於節點和 pod 的數量,還包括建立的資源數量、每個 pod 的容器數量、服務總數和 pod 部署吞吐量等幾個方面。這篇文章描述了我們在擴充套件時面臨的一些挑戰以及我們如何解決這些挑戰。
API 伺服器
當與 API 伺服器的多個連線返回 504 閘道器超時以及本地客戶端級別限制(指數退避)時,API 伺服器被證明是一個瓶頸。
通過max-mutating-requests-inflight和max-requests-inflight更新了管理API伺服器上速率限制的佇列大小。這兩個標誌在API伺服器上控制著1.20版本中作為測試版引入的優先順序和公平性功能如何在其佇列類別中劃分總佇列大小。例如,領導選舉的請求比pod請求更優先。在每個優先順序中,都有可配置的佇列的公平性。在未來,通過PriorityLevelConfiguration和FlowSchema API物件,還有進一步微調的空間。
控制器管理器
控制器管理器負責為本地資源提供控制器,如複製集、名稱空間等,其部署數量較多(由複製集管理)。控制器管理器與API伺服器同步其狀態的速度是有限的。多個旋鈕被用來調整這一行為。
- kube-api-qps —控制器管理器在給定秒內可以對 API 伺服器進行的查詢數。
- kube-api-burst —控制器管理器突發,這是kube-api-qps之上的額外併發呼叫。
- concurrent-deployment-syncs併發部署同步 — 同步呼叫中的併發呼叫物件,如部署、副本集等。
排程器
當作為一個獨立的元件進行測試時,排程器可以支援每秒高達1000個pod的高吞吐率。然而,在將排程器部署到一個實時叢集中時,我們注意到實際的吞吐量減少。一個緩慢的etcd例項導致排程器的繫結延遲增加,導致待處理佇列的大小增加到數千個pod的程度。我們的想法是在測試執行期間將這個數字保持在100以下,因為更多的計數會影響到pod的啟動延遲。我們也最終調整了領導者選舉引數,以適應短暫的網路分割槽或網路擁堵時的虛假重啟。
etcd
etcd是Kubernetes叢集中最關鍵的一個部分。這一點從etcd在整個叢集中以不同方式表現出來的大量問題可以看出。我們需要仔細調查,找出根本原因,並擴大etcd的規模,以處理我們的預期規模。
通過調查和分析,我們確定GCP將PD-SSD的磁碟吞吐量扼殺在每秒100MB左右,我們的磁碟大小為100G。GCP沒有提供增加吞吐量限制的方法--它只隨著磁碟的大小增加。
儘管etcd節點只需要<10G的空間,我們首先嚐試使用1TB的PD-SSD。然而,當所有4k節點同時加入Kubernetes控制平面時,即使是更大的磁碟也成為了一個瓶頸。我們決定使用本地SSD,它的吞吐量非常高,代價是在故障情況下資料丟失的機率略高,因為它不是持久的。
在轉移到本地SSD後,我們沒有看到最快的SSD的預期效能。一些基準測試是直接在磁碟上用FIO完成的,這些數字是預期的。然而,etcd基準測試顯示了一個不同的故事,即併發的所有成員寫入。
本地固態硬碟的表現更差!
經過深入調查,這歸因於ext4檔案系統的寫屏障快取提交。由於etcd使用寫前日誌,並在每次提交到raft日誌時呼叫fsync,所以禁用寫屏障是可以的。此外,我們在檔案系統級和用於DR應用程式級都有DB備份工作,。
在這個改變之後,使用本地SSD的數字提高了,與PD-SSD相當。這一改進的效果體現在etcd的WAL同步持續時間和後端提交延遲上,在15:55左右的時間點上,WAL同步持續時間和後端提交延遲減少了90%以上。
etcd中預設的MVCC資料庫大小為2GB。在觸發DB空間不足的警報後,這個大小被增加到最大8GB。由於這個資料庫的利用率約為60%,我們能夠擴充套件到20萬個無狀態莢。
通過上述所有的優化,叢集在我們的預期規模下更加穩定,然而,我們在API延遲的SLI方面遠遠落後。
etcd伺服器仍然會偶爾重啟,僅僅一次重啟就會破壞基準測試結果,特別是P99的數字。仔細觀察發現,在v1.20版的etcd YAML中存在一個失效探測的錯誤。為了解決這個問題,我們採用了一個變通辦法,即增加失敗閾值的數量。
在用盡所有途徑垂直擴充套件etcd後,主要是在資源方面(CPU、記憶體、磁碟),我們發現etcd的效能受到範圍查詢的影響。
當有很多範圍查詢時,etcd的表現並不好,對Raft日誌的寫入受到影響,從而減慢了叢集的延遲。
由於這些耗時的查詢,etcd的後端延遲受到了很大影響。
在事件資源上的etcd伺服器分片後,我們看到在pod高度競爭的情況下,叢集的穩定性有所提高。
在未來,還有進一步將etcd叢集分片到pods資源上的空間。配置API伺服器來聯絡相關的etcd以與分片的資源進行互動是很容易的。
結論
Kubernetes 是一個複雜的系統,必須深入瞭解控制平面才能知道如何擴充套件每個元件。我們通過這次練習學到了很多東西,並將繼續優化我們的叢集。
相關文章
- 如何擴充套件Kubernetes API?套件API
- activiti通過擴充套件點重寫節點行為套件
- Python擴充套件_淺拷貝和深拷貝Python套件
- Spotify:2021年將服務擴充套件到80多個新市場套件
- 如何擴充套件單個Prometheus實現近萬Kubernetes叢集監控?套件Prometheus
- 如何構建一個優雅擴充套件套件
- kotlin 擴充套件(擴充套件函式和擴充套件屬性)Kotlin套件函式
- PHP擴充套件開發就是一個自己的PHP擴充套件PHP套件
- 這個Dubbo註冊中心擴充套件,有點意思!套件
- Spring中11個最常用的擴充套件點,你知道幾個?Spring套件
- Kubernetes 節點彈性擴充套件實踐元件 Amazon Karpenter:部署 GPU 推理應用套件元件GPU
- DM8 DMDSC動態擴充套件節點套件
- etcd管理,證書配置,擴充套件,遷移恢復,帶證書擴充套件節點套件
- 如何使用訊息佇列、Spring Boot和Kubernetes擴充套件微服務佇列Spring Boot套件微服務
- 乾貨丨如何水平擴充套件和垂直擴充套件DolphinDB叢集?套件
- 如何開啟寶塔皮膚php擴充套件PHP套件
- 聊聊Spring擴充套件點BeanPostProcessor和BeanFactoryPostProcessorSpring套件Bean
- 兩個簡單的擴充套件方法:TrimPrefix和TrimSuffix套件
- WPF如何封裝一個可擴充套件的Window封裝套件
- 使用KEDA和Kafka在 Kubernetes 上自動擴充套件 - PiotrKafka套件
- 一個超級簡單的PHP超全域性變數管理擴充套件PHP變數套件
- SpringBoot擴充套件點EnvironmentPostProcessorSpring Boot套件
- 五個檢視擴充套件類 LL套件
- Kotlin的幾個擴充套件函式Kotlin套件函式
- gpexpand擴充gp例項和節點
- PHP擴充套件開發教程2 – 編寫第一個擴充套件 hello worldPHP套件
- 3 種擴充套件 Kubernetes 能力的方式套件
- kubernetes中將hostpath卷安裝到POD
- 怎麼樣“抄“一個PHP擴充套件PHP套件
- Linux下編寫一個PHP擴充套件LinuxPHP套件
- 給IConfiguration寫一個GetAppSetting擴充套件方法APP套件
- 巧用SpringBoot擴充套件點EnvironmentPostProcessorSpring Boot套件
- 如何無縫地將人工智慧擴充套件到分散式大資料人工智慧套件分散式大資料
- 使用aggregation API擴充套件你的kubernetes APIAPI套件
- 擴充套件節能器:Lights Out for Mac套件Mac
- k8s將deployment中的pod固定到指定節點K8S
- LongWriter: 基於LLM代理可以將輸出視窗大小擴充套件到10,000+個單詞套件
- Fortinet將SecurityFabric架構安全能力擴充套件到雲端架構套件