1. 
          

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

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

            常見(jiàn)問(wèn)題 發(fā)布者:cya 2019-12-10 08:54 訪(fǎng)問(wèn)量:259

            來(lái)自:云棲社區,作者:shengdong

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

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

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

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

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

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

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

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


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

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

            總體上來(lái)說(shuō),節點(diǎn)準備就做兩件事情,讀和寫(xiě)。讀即數據收集,寫(xiě)即節點(diǎn)配置。


            這里的讀寫(xiě)過(guò)程,絕大部分都很基礎,大家可以通過(guò)閱讀腳本來(lái)了解細節。唯一需要特別說(shuō)明的是,kubeadm join把節點(diǎn)注冊到Master的過(guò)程。此過(guò)程需要新加節點(diǎn)和集群Master之間建立互信。

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

            另一邊,新加節點(diǎn)以匿名身份從Master kube-public命名空間中獲取集群cluster-info,cluster-info包括集群CA證書(shū),和使用集群bootstrap token對這個(gè)CA做的簽名。新加節點(diǎn)使用從管控處獲取的bootstrap token,對CA生成b新的簽名,然后將此簽名與cluster-info內簽名做對比,如果兩個(gè)簽名一致,則說(shuō)明cluster-info和bootstrap token來(lái)自同一集群。新加節點(diǎn)因為信任管控,所以建立對Master的信任。

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

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

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

            集群擴容

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



            自動(dòng)伸縮


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


            其中第一個(gè)過(guò)程,主要用來(lái)配置節點(diǎn)的規格屬性,包括設置節點(diǎn)的用戶(hù)數據。這個(gè)用戶(hù)數據和手動(dòng)添加已有節點(diǎn)的腳本類(lèi)似,不同的地方在于,其針對自動(dòng)伸縮這種場(chǎng)景,增加了一些專(zhuān)門(mén)的標記。attach_node.sh腳本會(huì )根據這些標記,來(lái)設置節點(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è)過(guò)程,是實(shí)現自動(dòng)增加節點(diǎn)的關(guān)鍵。這里引入了一個(gè)新的組件Autoscaler,它以Pod的形式運行在K8S集群中。理論上來(lái)說(shuō),我們可以把這個(gè)組件當做一個(gè)控制器。因為它的作用與控制器類(lèi)似,基本上還是監聽(tīng)Pod狀態(tài),以便在Pod因為節點(diǎn)資源不足而不能被調度的時(shí),去修改ESS的伸縮規則來(lái)增加新的節點(diǎn)。

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

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

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

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

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



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

            總結

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


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

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

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

            双腿国产亚洲精品无码不卡|国产91精品无码麻豆|97久久久久久久极品|无码人妻少妇久久中文字幕
                1.