日韩国产精品99成人不卡在线无毒|狠狠躁夜夜爽一级二级精品|亚洲日日噜噜孕妇中文字幕|日韩久草中文三级片

新聞動(dòng)態(tài)

阿里云 K8S 集群節(jié)點(diǎn)伸縮原理

常見問題 發(fā)布者:cya 2019-12-10 08:54 訪問量:409

來自:云棲社區(qū),作者:shengdong

鏈接:https://yq.aliyun.com/articles/704224

阿里云K8S集群的一個(gè)重要特性,是集群的節(jié)點(diǎn)可以動(dòng)態(tài)的增加或減少。有了這個(gè)特性,集群才能在計(jì)算資源不足的情況下擴(kuò)容新的節(jié)點(diǎn),同時(shí)也可以在資源利用率降低的時(shí)候,釋放節(jié)點(diǎn)以節(jié)省費(fèi)用。

這篇文章,我們討論阿里云K8S集群擴(kuò)容與縮容的實(shí)現(xiàn)原理。理解實(shí)現(xiàn)原理,在遇到問題的時(shí)候,我們就可以高效地排查并定位原因。我們的討論基于當(dāng)前的1.12.6版本。

一、節(jié)點(diǎn)增加原理

阿里云K8S集群可以給集群增加節(jié)點(diǎn)的方式有,添加已有節(jié)點(diǎn),集群擴(kuò)容,和自動(dòng)伸縮。其中,添加已有節(jié)點(diǎn)又可分為手動(dòng)添加已有節(jié)點(diǎn)和自動(dòng)添加已有節(jié)點(diǎn)。節(jié)點(diǎn)的增加涉及到的組件有,節(jié)點(diǎn)準(zhǔn)備,彈性伸縮(ESS),管控,Cluster Autoscaler以及調(diào)度器。

手動(dòng)添加已有節(jié)點(diǎn)

節(jié)點(diǎn)準(zhǔn)備,其實(shí)就是把一個(gè)普通的ECS實(shí)例,安裝配置成為一個(gè)K8S集群節(jié)點(diǎn)的過程。這個(gè)過程僅靠一條命令就可以完成。這條命令使用curl下載attach_node.sh腳本,然后以openapi token為參數(shù),在ECS上運(yùn)行。

curl http:///public/pkg/run/attach//attach_node.sh | bash -s -- --openapi-token


這里token是一個(gè)對(duì)的key,而value是當(dāng)前集群的基本信息。阿里云K8S集群的管控,在接到手動(dòng)添加已有節(jié)點(diǎn)請(qǐng)求的時(shí)候,會(huì)生成這個(gè)對(duì),并把key作為token返回給用戶。

這個(gè)token(key)存在的價(jià)值,是其可以讓attach_node.sh腳本,以匿名身份在ECS上索引到集群的基本信息(value),而這些基本信息,對(duì)節(jié)點(diǎn)準(zhǔn)備至關(guān)重要。

總體上來說,節(jié)點(diǎn)準(zhǔn)備就做兩件事情,讀和寫。讀即數(shù)據(jù)收集,寫即節(jié)點(diǎn)配置。


這里的讀寫過程,絕大部分都很基礎(chǔ),大家可以通過閱讀腳本來了解細(xì)節(jié)。唯一需要特別說明的是,kubeadm join把節(jié)點(diǎn)注冊(cè)到Master的過程。此過程需要新加節(jié)點(diǎn)和集群Master之間建立互信。

一邊,新加節(jié)點(diǎn)從管控處獲取的bootstrap token(與openapi token不同,此token是value的一部分內(nèi)容),實(shí)際上是管控通過可信的途徑從集群Master上獲取的。新加節(jié)點(diǎn)使用這個(gè)bootstrap token連接Master,Master則可通過驗(yàn)證這個(gè)bootstrap token來建立對(duì)新加節(jié)點(diǎn)的信任。

另一邊,新加節(jié)點(diǎn)以匿名身份從Master kube-public命名空間中獲取集群cluster-info,cluster-info包括集群CA證書,和使用集群bootstrap token對(duì)這個(gè)CA做的簽名。新加節(jié)點(diǎn)使用從管控處獲取的bootstrap token,對(duì)CA生成b新的簽名,然后將此簽名與cluster-info內(nèi)簽名做對(duì)比,如果兩個(gè)簽名一致,則說明cluster-info和bootstrap token來自同一集群。新加節(jié)點(diǎn)因?yàn)樾湃喂芸兀越?duì)Master的信任。

自動(dòng)添加已有節(jié)點(diǎn)

自動(dòng)添加已有節(jié)點(diǎn),不需要人為拷貝黏貼腳本到ECS命令行來完成節(jié)點(diǎn)準(zhǔn)備的過程。管控使用了ECS userdata的特性,把類似以上節(jié)點(diǎn)準(zhǔn)備的腳本,寫入ECS userdata,然后重啟ECS并更換系統(tǒng)盤。當(dāng)ECS重啟之后,會(huì)自動(dòng)執(zhí)行Userdata里邊的腳本,來完成節(jié)點(diǎn)添加的過程。這部分內(nèi)容,大家其實(shí)可以通過查看節(jié)點(diǎn)userdata來確認(rèn)。

#!/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的參數(shù),與前一節(jié)的參數(shù)有很大的不同。其實(shí)這里的參數(shù),都是前一節(jié)value的內(nèi)容,即管控創(chuàng)建并維護(hù)的集群基本信息。自動(dòng)添加已有節(jié)點(diǎn)省略了通過key獲取value的過程。

集群擴(kuò)容

集群擴(kuò)容與以上添加已有節(jié)點(diǎn)不同,此功能針對(duì)需要新購(gòu)節(jié)點(diǎn)的情形。集群擴(kuò)容的實(shí)現(xiàn),在添加已有節(jié)點(diǎn)的基礎(chǔ)上,引入了彈性伸縮ESS組件。ESS組件負(fù)責(zé)從無到有的過程,而剩下的過程與添加已有節(jié)點(diǎn)類似,即依靠ECS userdata腳本來完成節(jié)點(diǎn)準(zhǔn)備。下圖是管控通過ESS從無到有創(chuàng)建ECS的過程。



自動(dòng)伸縮


前邊三種方式是需要人為干預(yù)的伸縮方式,而自動(dòng)伸縮的本質(zhì)不同,是它可以在業(yè)務(wù)需求量增加的時(shí)候,自動(dòng)創(chuàng)建ECS實(shí)例并加入集群。為了實(shí)現(xiàn)自動(dòng)化,這里引入了另外一個(gè)組件Cluster Autoscaler。集群自動(dòng)伸縮包括兩個(gè)獨(dú)立的過程。


其中第一個(gè)過程,主要用來配置節(jié)點(diǎn)的規(guī)格屬性,包括設(shè)置節(jié)點(diǎn)的用戶數(shù)據(jù)。這個(gè)用戶數(shù)據(jù)和手動(dòng)添加已有節(jié)點(diǎn)的腳本類似,不同的地方在于,其針對(duì)自動(dòng)伸縮這種場(chǎng)景,增加了一些專門的標(biāo)記。attach_node.sh腳本會(huì)根據(jù)這些標(biāo)記,來設(shè)置節(jié)點(diǎn)的屬性。

#!/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


而第二個(gè)過程,是實(shí)現(xiàn)自動(dòng)增加節(jié)點(diǎn)的關(guān)鍵。這里引入了一個(gè)新的組件Autoscaler,它以Pod的形式運(yùn)行在K8S集群中。理論上來說,我們可以把這個(gè)組件當(dāng)做一個(gè)控制器。因?yàn)樗淖饔门c控制器類似,基本上還是監(jiān)聽Pod狀態(tài),以便在Pod因?yàn)楣?jié)點(diǎn)資源不足而不能被調(diào)度的時(shí),去修改ESS的伸縮規(guī)則來增加新的節(jié)點(diǎn)。

這里有一個(gè)知識(shí)點(diǎn),集群調(diào)度器衡量資源是否充足的標(biāo)準(zhǔn),是“預(yù)訂率”,而不是“使用率”。這兩者的差別,類似酒店房?jī)r(jià)預(yù)訂率和實(shí)際入住率:完全有可能有人預(yù)訂了酒店,但是并沒有實(shí)際入住。在開啟自動(dòng)伸縮功能的時(shí)候,我們需要設(shè)置縮容閾值,就是“預(yù)訂率”的下線。之所以不需要設(shè)置擴(kuò)容閾值。是因?yàn)锳utoscaler擴(kuò)容集群,依靠的是Pod的調(diào)度狀態(tài):當(dāng)Pod因?yàn)楣?jié)點(diǎn)資源“預(yù)訂率”太高無法被調(diào)度的時(shí)候,Autoscaler就會(huì)擴(kuò)容集群。

二、節(jié)點(diǎn)減少原理

與增加節(jié)點(diǎn)不同,集群減少節(jié)點(diǎn)的操作只有一個(gè)移除節(jié)點(diǎn)的入口。但對(duì)于用不同方法加入的節(jié)點(diǎn),其各自移除方式略有不同。

首先,通過添加已有節(jié)點(diǎn)加入的節(jié)點(diǎn),需要三步去移除:管控通過ECS API清楚ECS userdata;管控通過K8S API從集群中刪除節(jié)點(diǎn);管控通過ECS InvokeCommand在ECS上執(zhí)行kubeadm reset命令清理節(jié)點(diǎn)。

其次,通過集群擴(kuò)容加入的節(jié)點(diǎn),則在上邊的基礎(chǔ)上,增加了斷開ESS和ECS關(guān)系的操作。此操作由管控調(diào)用ESS API完成。



最后,經(jīng)過Cluster Autoscaler動(dòng)態(tài)增加的節(jié)點(diǎn),則在集群CPU資源“預(yù)訂率”降低的時(shí)候,由Cluster Autoscaler自動(dòng)移除釋放。其觸發(fā)點(diǎn)是CPU“預(yù)訂率”,即上圖寫Metrics的原因。

總結(jié)

總體上來說,K8S集群節(jié)點(diǎn)的增加與減少,主要涉及四個(gè)組件,分別是Cluster Autoscaler,ESS,管控以及節(jié)點(diǎn)本身(準(zhǔn)備或清理)。根據(jù)場(chǎng)景不同,我們需要排查不同的組件。其中Cluster Autoscaler是一個(gè)普通的Pod,其日志的獲取和其他Pod無異;ESS彈性伸縮有其專門的控制臺(tái),我們可以在控制臺(tái)排查其伸縮配置、伸縮規(guī)則等相關(guān)子實(shí)例日志和狀態(tài);而管控的日志,可以通過查看日志功能來查看;最后,對(duì)于節(jié)點(diǎn)的準(zhǔn)備與清理,其實(shí)就是排查對(duì)應(yīng)的腳本的執(zhí)行過程。


關(guān)鍵字: 阿里云 集群節(jié)點(diǎn) 晨展科技

文章連接: http://www.hsjyfc.com.cn/cjwt/638.html

版權(quán)聲明:文章由 晨展科技 整理收集,來源于互聯(lián)網(wǎng)或者用戶投稿,如有侵權(quán),請(qǐng)聯(lián)系我們,我們會(huì)立即刪除。如轉(zhuǎn)載請(qǐng)保留