全部產品
Search
文件中心

Container Service for Kubernetes:搶佔式執行個體節點池最佳實務

更新時間:Jun 19, 2024

搶佔式執行個體是一種按需使用的執行個體,相對於隨用隨付執行個體價格有一定的折扣。搶佔式執行個體節點池是由搶佔式執行個體、隨用隨付執行個體按照一定比例組合而成的節點池,使用搶佔式執行個體節點池,可以節省一定的費用。本文介紹搶佔式執行個體節點池的概念、適用情境,配置搶佔式執行個體組合,配置搶佔式執行個體和存量執行個體的比例,查看搶佔式執行個體到期狀態,以及搶佔式執行個體到期的優雅處理方式等內容。

背景資訊

搶佔式執行個體採用隨用隨付的計費方式,即先使用後付費。費用根據市場價格和計費時間長度進行計算。更多資訊,請參見搶佔式執行個體

搶佔式執行個體節點池介紹

搶佔式執行個體(Spot Instance)節點池是由搶佔式執行個體、隨用隨付執行個體按照一定比例組合而成的節點池。

搶佔式執行個體是一種特殊隨用隨付執行個體,價格隨著庫存等因素動態波動,價格成本較低,相比按量執行個體節點最多可以節省90%成本。搶佔式執行個體的市場價格會隨供需變化而浮動,您需要在建立搶佔式執行個體時指定出價模式,當指定執行個體規格的即時市場價格低於出價且庫存充足時,就能成功建立搶佔式執行個體。

搶佔式執行個體建立成功後,操作與隨用隨付執行個體相同,您也可以將搶佔式執行個體和其他雲產品組合使用,例如雲端硬碟、公網IP地址等。搶佔式執行個體預設有1小時的保護期。超過保護期後,每5分鐘檢測一次執行個體規格的即時市場價格和庫存,如果某一時刻的市場價格高於出價或執行個體規格庫存不足,搶佔式執行個體會被釋放。

適用情境分析

  • 搶佔式執行個體節點池

    搶佔式執行個體節點池由於使用搶佔式執行個體,節點可能在不確定時刻到期被回收,因此適合用於無狀態、容錯性較好的應用。其中包括批處理和機器學習培訓工作負載、巨量資料ETL(例如Apache Spark)、隊列處理應用和無狀態API應用等。

    部署在搶佔式執行個體節點池的工作負載需要容忍所需節點資源停用時段,對無法容忍的應用負載建議使用按量執行個體或者訂用帳戶執行個體的節點池。這類無法容忍的負載一般包含但不限於以下應用:
    • 叢集管理工具,例如監控和操作工具。
    • 需要有狀態工作負載的部署或應用程式,例如資料庫。
  • 開啟自動調整的搶佔式執行個體節點池

    如果工作負載不僅可部署在搶佔式執行個體節點池,還具有較明顯的業務高低峰視窗期,建議您使用開啟自動調整的搶佔式執行個體節點池。

    開啟自動調整後,叢集節點自動調整組件會檢查是否需要擴容搶佔式執行個體節點池來部署叢集中Pod,以及當節點達到縮容條件時進行自動縮容。開啟自動調整的搶佔式節點池在擴容時觸發擴容速度更快,對閑置資源的釋放更及時。在節點池內執行個體可彈出情況下,快速的彈出彌補了一部分搶佔式節點池被動回收的不足,及時釋放閑置資源加強了節省成本的優勢。

搶佔式執行個體組合的選擇和配置

在執行個體規格選擇上沒有“最優解”,建議您選擇最適合業務類型的,且在庫存、成本和效能間達到最佳平衡的方案。為了滿足不同業務,阿里雲ECS提供了大量的執行個體類型,如何在執行個體規格中選出您需要的組合方案,特別是在競價情境下選擇出對業務可能影響最小的執行個體組合,是用好搶佔式執行個體節點池的第一步。

您可以通過以下方式選擇和配置搶佔式執行個體組合:

  • 根據Container Service管理主控台推薦
    Container Service管理主控台提供了執行個體的選擇建議。在建立或編輯節點池時,控制台會根據所選地區給出當前時刻所在地區有庫存的執行個體規格,您可以通過所需資源對執行個體規格進行進一步篩選。在選出執行個體規格後,控制台會同時算出彈性強度和執行個體的價格區間,您可以參照彈性強度建議,添加執行個體規格和設定執行個體價格上限。關於如何建立或編輯節點池,請參見操作步驟搶佔式執行個體.png
  • 通過spot-instance-advisor命令列

    Container Service開源了命令列spot-instance-advisor,以便您通過命令列擷取搶佔式執行個體的歷史價格波動情況和當前價格資訊。spot-instance-advisor的原理是通過API擷取一個地區的執行個體規格與歷史價格曲線,通過統計分析的方式,計算排序最低核時的機型,並通過離散度的判斷計算執行個體價格的熵值,熵值越高表示機型的價格波動越頻繁。建議您選擇熵值低的機型。

    說明 下載spot-instance-advisor,請參見spot-instance-advisor
    spot-instance-advisor支援以下過濾參數:
    Usage of ./spot-instance-advisor:
      -accessKeyId string
            Your accessKeyId of cloud account
      -accessKeySecret string
            Your accessKeySecret of cloud account
      -cutoff int
            Discount of the spot instance prices (default 2)
      -family string
            The spot instance family you want (e.g. ecs.n1,ecs.n2)
      -limit int
            Limit of the spot instances (default 20)
      -maxcpu int
            Max cores of spot instances  (default 32)
      -maxmem int
            Max memory of spot instances (default 64)
      -mincpu int
            Min cores of spot instances (default 1)
      -minmem int
            Min memory of spot instances (default 2)
      -region string
            The region of spot instances (default "cn-hangzhou")
      -resolution int
            The window of price history analysis (default 7)
    執行以下命令,即可獲得當前地區內最適合的執行個體規格配置:
    ./spot-instance-advisor --accessKeyId=<id> --accessKeySecret=<secret> --region=<cn-zhangjiakou>
    說明 accessKeyIdaccessKeySecretregion為必填參數,請根據您的實際業務情境填寫。
    預期輸出:
    Initialize cache ready with 619 kinds of instanceTypes
    Filter 93 of 98 kinds of instanceTypes.
    Fetch 93 kinds of InstanceTypes prices successfully.
    Successfully compare 199 kinds of instanceTypes
          InstanceTypeId               ZoneId     Price(Core)        Discount           ratio
            ecs.c6.large     cn-zhangjiakou-c          0.0135             1.0             0.0
            ecs.c6.large     cn-zhangjiakou-a          0.0135             1.0             0.0
          ecs.c6.2xlarge     cn-zhangjiakou-a          0.0136             1.0             0.0
          ecs.c6.2xlarge     cn-zhangjiakou-c          0.0136             1.0             0.0
          ecs.c6.3xlarge     cn-zhangjiakou-a          0.0137             1.0             0.0
          ecs.c6.3xlarge     cn-zhangjiakou-c          0.0137             1.0             0.0
           ecs.c6.xlarge     cn-zhangjiakou-c          0.0138             1.0             0.0
           ecs.c6.xlarge     cn-zhangjiakou-a          0.0138             1.0             0.0
         ecs.hfc6.xlarge     cn-zhangjiakou-a          0.0158             1.0             0.0
          ecs.hfc6.large     cn-zhangjiakou-a          0.0160             1.0             0.0
          ecs.hfc6.large     cn-zhangjiakou-c          0.0160             1.0             0.0
          ecs.g6.3xlarge     cn-zhangjiakou-a          0.0175             1.0             0.0
          ecs.g6.3xlarge     cn-zhangjiakou-c          0.0175             1.0             0.0
            ecs.g6.large     cn-zhangjiakou-a          0.0175             1.0             0.0
           ecs.g6.xlarge     cn-zhangjiakou-a          0.0175             1.0             0.0
          ecs.g6.2xlarge     cn-zhangjiakou-a          0.0175             1.0             1.0
          ecs.g6.2xlarge     cn-zhangjiakou-c          0.0175             1.0             3.0
            ecs.g6.large     cn-zhangjiakou-c          0.0175             1.0             30.8
           ecs.g6.xlarge     cn-zhangjiakou-c          0.0175             1.0             9.7
          ecs.hfg6.large     cn-zhangjiakou-c          0.0195             1.0             0.2
    由以上輸出發現排名前幾位的價格、混沌係數(對應ratio)都相對比較平穩,而後面幾個執行個體的價格雖然也處在1折,但是混沌係數(對應ratio)相對而言會比較高,因此在配置執行個體規格時,可以優先考慮前麵價格較低且混沌係數較低的規格組合。

配置搶佔式執行個體和存量執行個體的比例

通過在節點池內配置搶佔式執行個體和存量執行個體的比例,在保證節點池內有穩定的存量執行個體的前提下,規劃搶佔式執行個體比例可降低成本。

重要

已建立Kubernetes叢集,且叢集版本大於1.9。如果您的叢集版本過低,請升級叢集。具體操作,請參見升級ACK叢集

  • 請確保您的叢集可添加足夠的節點數。如果您需要添加更多節點,請申請擴大配額,詳細操作方法,請參見配額與限制
  • 添加已有雲端服務器時,請確保您的專用網路中的ECS執行個體綁定一個Elastic IP Address(EIP),或者相應VPC已經配置了NAT Gateway。您需要確保相應節點能正常訪問公網,否則添加雲端服務器會失敗。
  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇節點管理 > 節點池

  3. 節點池頁面右上方,單擊建立節點池
  4. 建立節點池對話方塊中,選擇虛擬交換器為多個虛擬交換器,選擇付費類型搶佔式執行個體
    關於節點池的其他參數,請參見操作步驟
  5. 單擊顯示進階選項,在擴縮容策略選擇成本最佳化策略,並根據規劃設定按量執行個體所佔比例(%),開啟允許按量執行個體補償
    擴縮容策略.png
    參數描述
    擴縮容策略
    • 優先順序策略:根據您定義的虛擬交換器優先順序擴縮容。當優先順序較高的虛擬交換器所在可用性區域無法建立ECS執行個體時,自動使用下一優先順序的虛擬交換器建立ECS執行個體。
    • 成本最佳化策略:按vCPU單價從低到高嘗試建立,當伸縮配置設定了搶佔式計費方式的多執行個體規格時,優先建立對應搶佔式計費執行個體,當搶佔式計費執行個體規格由於庫存等原因都無法建立時,自動嘗試以隨用隨付的方式建立。當擴縮容策略為成本最佳化策略時,還可以配置以下參數:
      • 按量執行個體所佔比例:節點池執行個體中按量執行個體應占的比例,取值範圍為0~100。
      • 開啟搶佔式執行個體補償:開啟後,當收到搶佔式執行個體將被回收的系統訊息時(即搶佔式執行個體被回收前5分鐘左右),伸縮組將嘗試建立新的執行個體,替換掉將被回收的搶佔式執行個體。
      • 允許按量執行個體補償:開啟後,如果因價格、庫存等原因無法建立足夠的搶佔式執行個體,伸縮組會自動嘗試建立按量執行個體滿足ECS執行個體數量要求。
    • 均衡分布策略:在伸縮組指定的多可用性區域(即指定多個專用網路交換器)之間均勻分配ECS執行個體。如果由於庫存不足等原因可用性區域之間變得不平衡,您可以再進行均衡操作來平衡資源的可用性區域分布。
      說明 只有設定了多個專用網路交換器時均衡分布策略才會生效。
    說明

    單擊確認配置後:

    • 不支援修改擴縮容策略的選擇項。
    • 擴縮容策略選擇為成本最佳化策略,可以修改按量執行個體所佔比例(%)允許按量執行個體補償的配置。
  6. 單擊確認配置

配置完成後,在節點池頁面找到目標節點池,單擊操作列中的詳情,然後單擊基本資料頁簽。在節點配置地區,可查看按量執行個體所佔比例。

查看搶佔式執行個體到期狀態

為了防止Spot執行個體(即搶佔式執行個體)到期引發節點意外退出,阿里雲Container ServiceACK可通過ack-node-problem-detector組件擷取執行個體即將釋放的資訊並通知給您。

說明 需要提前建立Kubernetes叢集且安裝最新版本的ack-node-problem-detector組件。具體操作,請參見建立Kubernetes託管版叢集
  • 若需要建立叢集,請選中安裝node-problem-detector並建立事件中心
  • 若使用已有叢集,請確認ack-node-problem-detector組件為最新版本。具體操作,請參見管理組件

在阿里雲Container ServiceACK中,ECS執行個體作為節點支援著叢集以及叢集上啟動並執行服務。根據ECS執行個體建立時的策略,某些執行個體(例如搶佔式執行個體、訂用帳戶執行個體)存在到期自動釋放問題。若在執行個體自動釋放時未做Pod驅逐、節點排水、節點替換等前置處理,可能影響叢集服務運行情況,Master節點意外退出可能引發叢集層級的故障。為了防止搶佔式執行個體到期引發的節點意外退出問題,可通過ack-node-problem-detector組件的InstanceExpired狀態擷取執行個體即將釋放的資訊。

  1. 登入Container Service管理主控台,在左側導覽列選擇叢集

  2. 叢集列表頁面,單擊目的地組群名稱,然後在左側導覽列,選擇節點管理 > 節點

  3. 節點頁面,單擊目標節點的名稱或在目標節點右側操作列選擇更多 > 詳情
  4. 在節點詳情頁面查看InstanceExpired類型的狀態。
    狀態地區查看InstanceExpired類型的狀態。執行個體是否到期
    InstanceExpired的狀態說明如下所示:
    InstanceExpired的狀態說明
    TrueInstanceExpired的狀態為True內容InstanceToBeTerminated,表示搶佔式執行個體將到期,會被釋放。
    FalseInstanceExpired的狀態為False內容InstanceNotToBeTerminated,表示搶佔式執行個體還未到期,可持續使用。
    Unknown表示外掛程式運行錯誤,請提交工單解決。
    若InstanceExpired的狀態為True,可在事件地區看到以下的事件。執行個體到期event

InstanceExpired的狀態為True,表示搶佔式執行個體將到期釋放。若您需要繼續使用該節點上的服務,請將應用調度到其他節點上。具體操作,請參見調度應用至指定節點

搶佔式執行個體到期的優雅處理方式

搶佔式執行個體到期的優雅處理方式主要包括:監控與通知、節點預補償與策略、自訂處理行為。

  • 監控與通知
    為了讓節點池中搶佔式執行個體釋放訊息儘早通知到您,ACK叢集通過組件NPD監控搶佔式執行個體的預釋放訊息。
    • 沒有監控到該搶佔式執行個體的預釋放訊息時,該節點的狀態中InstanceExpired值為False搶佔式執行個體節點狀態.png
    • 搶佔式執行個體InstanceExpired值為True時,表示搶佔式執行個體即將到期,即將被釋放。ACK會通過叢集事件(Kubernetes Events)通知您搶佔式執行個體即將釋放的訊息。搶佔式執行個體釋放.png
  • 節點預補償與策略

    搶佔式執行個體的到期釋放是影響節點上業務負載穩定性的一個關鍵因素。Container ServiceACK已經從配置、開啟自動調整到監控通知各種維度提供了方法去快速響應搶佔式執行個體到期釋放事件。這些處理方式的處理時間點都在搶佔式執行個體到期回收之後,在回收到新執行個體補充這段時間叢集可用資源仍然會減少。為盡量縮短甚至消除這段時間影響,ACK利用節點預補償功能,在到期執行個體還未回收前就觸發彈出補償執行個體。

    開啟節點預補償後,ACK會自動監控節點執行個體是否即將被釋放。當ACK監控到節點執行個體即將被釋放時,會自動觸發彈出新節點的伸縮活動。這個為了補充即將被釋放執行個體而彈出的執行個體,稱為補償執行個體。補償執行個體成功運行後,會觸發到期搶佔式執行個體的縮容和釋放,縮容釋放策略包括cordon節點(將節點設定為不可調度)、排水節點、將節點移除等節點優雅下線處理,盡量讓到期搶佔式執行個體節點上的業務負載平穩遷移到叢集中其他節點上,避免業務受到執行個體到期的影響。

    說明 節點預補償的結果不會影響到期搶佔式執行個體的回收。無論是否開啟節點預補償,到期執行個體仍然會在預回收的5分鐘後被回收釋放掉。
    搶佔式執行個體節點預補償.png
  • 自訂處理行為

    在許多實際業務情境中,節點下線需要執行比一般優雅下線更多的步驟,例如即將下線的節點資訊需要從註冊的DNS中心移除。結合監控與通知,此類需求建議您監控節點狀態中的InstanceExpired或者監聽InstanceToBeTerminated事件。收到節點執行個體到期或將被釋放訊息後,即可把該節點作為即將下線處理,然後執行自訂的處理行為。關於監控搶佔式執行個體到期狀態的具體操作,請參見查看搶佔式執行個體到期狀態