您好,登錄后才能下訂單哦!
這篇文章給大家介紹K8s的集群伸縮原理是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
阿里云 K8s 集群的一個重要特性,是集群的節點可以動態的增加或減少。有了這個特性,集群才能在計算資源不足的情況下擴容新的節點,同時也可以在資源利用率降低的時候,釋放節點以節省費用。
我們將討論阿里云 K8s 集群擴容與縮容的實現原理。理解實現原理,在遇到問題的時候,我們就可以高效地排查并定位原因。
阿里云 K8s 集群可以給集群增加節點的方式有,添加已有節點,集群擴容,和自動伸縮。其中,添加已有節點又可分為手動添加已有節點和自動添加已有節點。節點的增加涉及到的組件有,節點準備,彈性伸縮(ESS),管控,Cluster Autoscaler 以及調度器。
節點準備,其實就是把一個普通的 ECS 實例,安裝配置成為一個 K8s 集群節點的過程。這個過程僅靠一條命令就可以完成。這條命令使用 curl 下載 attach_node.sh 腳本,然后以 openapi token 為參數,在 ECS 上運行。
curl http:///public/pkg/run/attach//attach_node.sh | bash -s -- --openapi-token
這里 token 是一個對的 key,而 value 是當前集群的基本信息。阿里云 K8s 集群的管控,在接到手動添加已有節點請求的時候,會生成這個對,并把 key 作為 token 返回給用戶。
這個 token(key)存在的價值,是其可以讓 attach_node.sh 腳本,以匿名身份在 ECS 上索引到集群的基本信息(value),而這些基本信息,對節點準備至關重要。
總體上來說,節點準備就做兩件事情,讀和寫。讀即數據收集,寫即節點配置。
這里的讀寫過程,絕大部分都很基礎,大家可以通過閱讀腳本來了解細節。唯一需要特別說明的是,kubeadm join 把節點注冊到 Master 的過程。此過程需要新加節點和集群 Master 之間建立互信。
一邊,新加節點從管控處獲取的 bootstrap token(與 openapi token 不同,此 token 是 value 的一部分內容),實際上是管控通過可信的途徑從集群 Master 上獲取的。新加節點使用這個 bootstrap token 連接 Master,Master 則可通過驗證這個 bootstrap token 來建立對新加節點的信任。
另一邊,新加節點以匿名身份從 Master kube-public 命名空間中獲取集群 cluster-info,cluster-info 包括集群 CA 證書,和使用集群 bootstrap token 對這個 CA 做的簽名。新加節點使用從管控處獲取的 bootstrap token,對 CA 生成新的簽名,然后將此簽名與 cluster-info 內簽名做對比,如果兩個簽名一致,則說明 cluster-info 和 bootstrap token 來自同一集群。新加節點因為信任管控,所以建立對 Master 的信任。
自動添加已有節點,不需要人為拷貝黏貼腳本到 ECS 命令行來完成節點準備的過程。管控使用了 ECS userdata 的特性,把類似以上節點準備的腳本,寫入 ECS userdata,然后重啟 ECS 并更換系統盤。當 ECS 重啟之后,會自動執行 Userdata 里邊的腳本,來完成節點添加的過程。這部分內容,大家其實可以通過查看節點 userdata 來確認。
!/bin/bash mkdir -p /var/log/acs curl http:///public/pkg/run/attach/1.12.6-aliyun.1/attach_node.sh | bash -s -- --docker-version --token --endpoint --cluster-dns > /var/log/acs/init.log
這里我們看到,attach_node.sh 的參數,與前一節的參數有很大的不同。其實這里的參數,都是前一節 value 的內容,即管控創建并維護的集群基本信息。自動添加已有節點省略了通過 key 獲取 value 的過程。
集群擴容與以上添加已有節點不同,此功能針對需要新購節點的情形。集群擴容的實現,在添加已有節點的基礎上,引入了彈性伸縮 ESS 組件。ESS 組件負責從無到有的過程,而剩下的過程與添加已有節點類似,即依靠 ECS userdata 腳本來完成節點準備。下圖是管控通過 ESS 從無到有創建 ECS 的過程。
前邊三種方式是需要人為干預的伸縮方式,而自動伸縮的本質不同,是它可以在業務需求量增加的時候,自動創建 ECS 實例并加入集群。為了實現自動化,這里引入了另外一個組件 Cluster Autoscaler。集群自動伸縮包括兩個獨立的過程。
其中第一個過程,主要用來配置節點的規格屬性,包括設置節點的用戶數據。這個用戶數據和手動添加已有節點的腳本類似,不同的地方在于,其針對自動伸縮這種場景,增加了一些專門的標記。attach_node.sh 腳本會根據這些標記,來設置節點的屬性。
!/bin/sh curl http:///public/pkg/run/attach/1.12.6-aliyun.1/attach_node.sh | bash -s -- --openapi-token --ess true --labels k8s.io/cluster-autoscaler=true,workload_type=cpu,k8s.aliyun.com=true
而第二個過程,是實現自動增加節點的關鍵。這里引入了一個新的組件 Autoscaler,它以 Pod 的形式運行在 K8s 集群中。理論上來說,我們可以把這個組件當做一個控制器。因為它的作用與控制器類似,基本上還是監聽 Pod 狀態,以便在 Pod 因為節點資源不足而不能被調度的時,去修改 ESS 的伸縮規則來增加新的節點。
這里有一個知識點,集群調度器衡量資源是否充足的標準,是“預訂率”,而不是“使用率”。這兩者的差別,類似酒店房價預訂率和實際入住率:完全有可能有人預訂了酒店,但是并沒有實際入住。在開啟自動伸縮功能的時候,我們需要設置縮容閾值,就是“預訂率”的下線。之所以不需要設置擴容閾值。是因為 Autoscaler 擴容集群,依靠的是 Pod 的調度狀態:當 Pod 因為節點資源“預訂率”太高無法被調度的時候,Autoscaler 就會擴容集群。
與增加節點不同,集群減少節點的操作只有一個移除節點的入口。但對于用不同方法加入的節點,其各自移除方式略有不同。
首先,通過添加已有節點加入的節點,需要三步去移除:管控通過 ECS API 清除 ECS userdata;管控通過 K8s API 從集群中刪除節點;管控通過 ECS InvokeCommand 在 ECS 上執行 kubeadm reset 命令清理節點。
其次,通過集群擴容加入的節點,則在上邊的基礎上,增加了斷開 ESS 和 ECS 關系的操作。此操作由管控調用 ESS API 完成。
最后,經過 Cluster Autoscaler 動態增加的節點,則在集群 CPU 資源“預訂率”降低的時候,由 Cluster Autoscaler 自動移除釋放。其觸發點是 CPU“預訂率”,即上圖寫 Metrics 的原因。
總體上來說,K8s 集群節點的增加與減少,主要涉及四個組件,分別是 Cluster Autoscaler,ESS,管控以及節點本身(準備或清理)。根據場景不同,我們需要排查不同的組件。其中 Cluster Autoscaler 是一個普通的 Pod,其日志的獲取和其他 Pod 無異;ESS 彈性伸縮有其專門的控制臺,我們可以在控制臺排查其伸縮配置、伸縮規則等相關子實例日志和狀態;而管控的日志,可以通過查看日志功能來查看;最后,對于節點的準備與清理,其實就是排查對應的腳本的執行過程。
以上講道理居多,但如果結合問題診斷實踐,一定會對大家的運維工作有所幫助。
關于K8s的集群伸縮原理是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。