一文讀懂基于 Kubernetes DRA 的 GPU 資源調(diào)度
Hello folks,我是 Luga,今天我們來(lái)聊一下云原生應(yīng)用場(chǎng)景 - 基于 Kubernetes DRA 進(jìn)行 GPU 設(shè)備資源高效調(diào)度。
在現(xiàn)代云原生架構(gòu)中,Kubernetes 已經(jīng)成為企業(yè)動(dòng)態(tài)資源調(diào)度的核心技術(shù)。隨著業(yè)務(wù)需求的復(fù)雜性和多樣性日益增加,如何高效地在 Kubernetes 集群中分配和調(diào)整資源,成為提升系統(tǒng)彈性和利用率的關(guān)鍵課題。
動(dòng)態(tài)資源調(diào)度通過(guò)智能化地分配 CPU、內(nèi)存、GPU 等關(guān)鍵資源,不僅能夠滿足不同負(fù)載的性能需求,還能降低資源浪費(fèi),提高基礎(chǔ)設(shè)施的投資回報(bào)率。本篇文章將圍繞 Kubernetes 動(dòng)態(tài)資源調(diào)度的核心原理、關(guān)鍵技術(shù)及最佳實(shí)踐展開(kāi),從調(diào)度框架、擴(kuò)展機(jī)制到實(shí)際應(yīng)用場(chǎng)景,全面解析如何在云原生環(huán)境中實(shí)現(xiàn)高效、靈活的資源管理,為讀者提供深刻的技術(shù)洞見(jiàn)和實(shí)操指導(dǎo)。
如何理解 Kubernetes 中動(dòng)態(tài)資源?
要理解 Kubernetes 中的“動(dòng)態(tài)資源”,需要區(qū)分傳統(tǒng)資源管理方式和 Kubernetes 的創(chuàng)新之處。傳統(tǒng)方式通常是靜態(tài)分配資源,而 Kubernetes 引入了多種機(jī)制來(lái)實(shí)現(xiàn)資源的動(dòng)態(tài)管理,從而更好地適應(yīng)不斷變化的應(yīng)用程序需求。
眾所周知,在傳統(tǒng)的虛擬化或裸金屬環(huán)境中,資源分配通常是靜態(tài)的。通常情況下,管理員預(yù)先為應(yīng)用程序分配固定的 CPU、內(nèi)存、存儲(chǔ)等資源,這些資源在應(yīng)用程序運(yùn)行期間保持不變。這種方式存在以下局限性:
- 資源浪費(fèi): 如果應(yīng)用程序的負(fù)載波動(dòng)較大,靜態(tài)分配的資源可能在低峰時(shí)閑置,造成浪費(fèi)。
- 彈性不足: 當(dāng)應(yīng)用程序需要更多資源時(shí),靜態(tài)分配無(wú)法快速響應(yīng),可能導(dǎo)致性能下降甚至服務(wù)中斷。
- 管理復(fù)雜: 對(duì)于大規(guī)模部署和復(fù)雜的應(yīng)用程序,靜態(tài)資源管理變得非常繁瑣。
為了解決上述痛點(diǎn)以及面對(duì)不斷新穎的業(yè)務(wù)需求場(chǎng)景,動(dòng)態(tài)資源的概念便應(yīng)運(yùn)而生。
其實(shí),圍繞著 Kubernetes 歷史發(fā)展,其已經(jīng)通過(guò)多種機(jī)制實(shí)現(xiàn)了資源的動(dòng)態(tài)管理,主要包括以下幾個(gè)方面:
(1) 資源請(qǐng)求和限制(Requests and Limits): 在 Pod 規(guī)范中,可以定義容器的資源請(qǐng)求(Requests)和限制(Limits)。Requests 指定容器運(yùn)行所需的最小資源量,Kubernetes 調(diào)度器會(huì)根據(jù) Requests 來(lái)選擇合適的節(jié)點(diǎn)。Limits 指定容器可以使用的最大資源量,防止容器過(guò)度使用資源影響其他應(yīng)用。雖然 Requests 和 Limits 是靜態(tài)配置的,但它們?yōu)楹罄m(xù)的動(dòng)態(tài)調(diào)整奠定了基礎(chǔ)。
(2) Horizontal Pod Autoscaler (HPA): HPA 可以根據(jù) CPU 利用率、內(nèi)存使用率或其他自定義指標(biāo)自動(dòng)調(diào)整 Pod 的副本數(shù)量。當(dāng)指標(biāo)超過(guò)預(yù)設(shè)的閾值時(shí),HPA 會(huì)自動(dòng)增加 Pod 副本,反之則減少。這實(shí)現(xiàn)了應(yīng)用程序的水平彈性伸縮,根據(jù)實(shí)際負(fù)載動(dòng)態(tài)調(diào)整資源使用。
(3) Vertical Pod Autoscaler (VPA): VPA 可以自動(dòng)調(diào)整 Pod 中容器的資源請(qǐng)求(Requests)和限制(Limits)。VPA 監(jiān)控容器的資源使用情況,并根據(jù)歷史數(shù)據(jù)和實(shí)時(shí)負(fù)載推薦合適的資源配置。VPA 可以自動(dòng)更新 Pod 的資源配置,或者提供建議供管理員手動(dòng)調(diào)整。這實(shí)現(xiàn)了應(yīng)用程序的垂直彈性伸縮,根據(jù)實(shí)際需求動(dòng)態(tài)調(diào)整單個(gè) Pod 的資源分配。
(4) 動(dòng)態(tài)卷分配(Dynamic Volume Provisioning): Kubernetes 允許根據(jù)需要?jiǎng)討B(tài)創(chuàng)建和分配持久卷。當(dāng) Pod 需要存儲(chǔ)時(shí),可以動(dòng)態(tài)地創(chuàng)建一個(gè)新的持久卷并將其掛載到 Pod 上。這避免了預(yù)先創(chuàng)建大量持久卷的麻煩,提高了存儲(chǔ)資源的利用率。
(5) 動(dòng)態(tài)資源分配(DRA - Dynamic Resource Allocation): 這是 Kubernetes 較新的一個(gè)特性,旨在解決除 CPU、內(nèi)存和存儲(chǔ)之外的其他類(lèi)型資源的動(dòng)態(tài)分配問(wèn)題,例如 GPU、FPGA 等硬件加速器。DRA 允許應(yīng)用程序以更精細(xì)的方式請(qǐng)求和使用這些特殊資源,并允許資源驅(qū)動(dòng)程序根據(jù)實(shí)時(shí)需求進(jìn)行分配和管理。DRA 將持久卷 API 的概念推廣到通用資源的管理,提供了更靈活、更高效的資源分配機(jī)制。
本文主要圍繞“動(dòng)態(tài)資源分配(DRA - Dynamic Resource Allocation)” 進(jìn)行展開(kāi)描述。在詳細(xì)解析 DRA 之前,我們先了解一下 Device Plugin 概念,那么,什么是 Device Plugin 呢?
Kubernetes 的 Device Plugin 機(jī)制(源于 KEP-3573)是一項(xiàng)早期就引入 Kubernetes 的重要功能,旨在擴(kuò)展 Kubernetes 的資源管理能力,使其能夠支持除 CPU 和內(nèi)存之外的各種硬件資源,例如圖形處理器(GPU)、數(shù)據(jù)處理單元(DPU)、現(xiàn)場(chǎng)可編程門(mén)陣列(FPGA)以及非統(tǒng)一內(nèi)存訪問(wèn)(NUMA)節(jié)點(diǎn)等。
Device Plugin 機(jī)制通過(guò)提供一個(gè)簡(jiǎn)單而強(qiáng)大的接口——Device Plugin Interface,實(shí)現(xiàn)了對(duì)這些硬件資源的抽象和管理。通過(guò)實(shí)現(xiàn)這個(gè)接口,第三方供應(yīng)商或用戶可以開(kāi)發(fā)自己的 Device Plugin,從而將特定的硬件資源集成到 Kubernetes 集群中。
從某種意義上而言,Device Plugin (設(shè)備插件)的引入極大擴(kuò)展了 Kubernetes 的能力,使其不僅局限于管理傳統(tǒng)的 CPU 和內(nèi)存資源,還能支持各種類(lèi)型的特殊硬件資源。這對(duì)于依賴(lài)硬件加速的任務(wù)(如 AI 模型訓(xùn)練、數(shù)據(jù)科學(xué)計(jì)算和高性能網(wǎng)絡(luò)處理)具有重要意義。通過(guò)設(shè)備插件,用戶可以更高效地利用集群中的硬件資源,同時(shí)通過(guò)標(biāo)準(zhǔn)化的接口降低管理和集成的復(fù)雜性。
需要注意的是,Kubernetes 在不同版本中對(duì)動(dòng)態(tài)資源分配的支持經(jīng)歷了多次迭代。從 Kubernetes v1.26 到 v1.31,DRA 的經(jīng)典實(shí)現(xiàn)以 Alpha 特性形式提供,但由于其局限性和不完善性,該實(shí)現(xiàn)已經(jīng)被廢棄。目前主流 Kubernetes 版本(從 v1.32 開(kāi)始)引入了更現(xiàn)代化的動(dòng)態(tài)資源分配方法,在設(shè)計(jì)上更加成熟和穩(wěn)定,并被廣泛應(yīng)用于生產(chǎn)環(huán)境?!?2 —
如何在 Kubernetes 中使用 GPU 資源 ?
眾所周知,長(zhǎng)期以來(lái),在云計(jì)算領(lǐng)域,人們普遍認(rèn)為計(jì)算資源主要以中央處理器(CPU)為中心,應(yīng)用程序的開(kāi)發(fā)和部署也大多圍繞 CPU 進(jìn)行。這種以 CPU 為中心的模式在過(guò)去很長(zhǎng)一段時(shí)間內(nèi)有效地支撐了各種業(yè)務(wù)需求。然而,隨著人工智能、大數(shù)據(jù)分析、高性能計(jì)算等技術(shù)的蓬勃發(fā)展,以及新興業(yè)務(wù)模式的不斷涌現(xiàn),越來(lái)越多的應(yīng)用場(chǎng)景對(duì)計(jì)算能力提出了前所未有的高要求,需要遠(yuǎn)超傳統(tǒng) CPU 的強(qiáng)大算力才能有效支撐業(yè)務(wù)的持續(xù)發(fā)展和創(chuàng)新。
在傳統(tǒng)的虛擬化或裸金屬服務(wù)器環(huán)境中部署和承載這些高算力需求的業(yè)務(wù),往往會(huì)導(dǎo)致顯著的資源浪費(fèi)。例如,為滿足峰值負(fù)載而配置的硬件資源,在業(yè)務(wù)低谷期會(huì)處于閑置狀態(tài),造成巨大的經(jīng)濟(jì)成本消耗。此外,傳統(tǒng)的部署方式在資源彈性伸縮和快速部署方面也存在諸多限制,難以滿足現(xiàn)代應(yīng)用快速變化的需求。
為了有效應(yīng)對(duì)這些挑戰(zhàn),實(shí)現(xiàn)降本增效的目標(biāo),越來(lái)越多的企業(yè)開(kāi)始積極擁抱云原生技術(shù),探索如何在云原生生態(tài)系統(tǒng)中實(shí)現(xiàn)資源的動(dòng)態(tài)承載。云原生技術(shù)以容器化、微服務(wù)和自動(dòng)化等為核心,能夠更好地管理和調(diào)度各種計(jì)算資源,包括 CPU、GPU、FPGA 等異構(gòu)計(jì)算資源,從而實(shí)現(xiàn)資源的按需分配、彈性伸縮和高效利用,最大程度地降低成本并提高運(yùn)營(yíng)效率。
然而,在 Kubernetes 中部署 GPU 節(jié)點(diǎn)池,即使是初始階段,也需要一些特定于供應(yīng)商的軟件組件,其中最關(guān)鍵的包括 Kubernetes 設(shè)備插件和 GPU 驅(qū)動(dòng)程序。安裝 GPU 驅(qū)動(dòng)程序是必不可少的,這是毋庸置疑的。然而,我們?yōu)槭裁催€需要安裝特定的設(shè)備插件呢?
原因在于 Kubernetes 平臺(tái)本身并不原生支持諸如 GPU 這類(lèi)特殊硬件資源。設(shè)備插件的關(guān)鍵作用就在于發(fā)現(xiàn)并向應(yīng)用程序暴露這些資源。其工作機(jī)制是:設(shè)備插件通過(guò)設(shè)備插件 API 接收可分配資源列表,并將其傳遞給 kubelet,從而對(duì)外呈現(xiàn)節(jié)點(diǎn)上的 GPU 數(shù)量。kubelet 負(fù)責(zé)持續(xù)跟蹤這些資源,并將節(jié)點(diǎn)上各種資源類(lèi)型的數(shù)量匯報(bào)給 API Server,以便 kube-scheduler 在進(jìn)行 Pod 調(diào)度決策時(shí)能夠充分利用這些信息。
然而,這種基于設(shè)備插件的方案存在一些固有的局限性:
- 資源選擇的精細(xì)程度有限: 只能通過(guò)一些節(jié)點(diǎn)屬性和標(biāo)簽來(lái)對(duì)節(jié)點(diǎn)上的資源類(lèi)型進(jìn)行相對(duì)粗略的選擇,無(wú)法進(jìn)行更精細(xì)的控制。
- 缺乏有效的調(diào)度反饋機(jī)制: 設(shè)備插件和 kube-scheduler 之間缺乏有效的反饋回路。這意味著,即使 kube-scheduler 為一個(gè)待調(diào)度的 Pod 找到了看似合適的節(jié)點(diǎn),設(shè)備插件也無(wú)法根據(jù)節(jié)點(diǎn)的就緒狀態(tài)等關(guān)鍵因素進(jìn)行進(jìn)一步的“校驗(yàn)”,這可能導(dǎo)致 Pod 被錯(cuò)誤地調(diào)度到尚未完全準(zhǔn)備好接收新資源的“未就緒”節(jié)點(diǎn)上。
為了有效克服上述局限性,Kubernetes 引入了動(dòng)態(tài)資源分配(DRA)機(jī)制。DRA 的核心目標(biāo)是確保應(yīng)用程序能夠在恰當(dāng)?shù)臅r(shí)機(jī)獲得所需數(shù)量的資源?!皠?dòng)態(tài)資源分配 API”將持久卷 API 的設(shè)計(jì)理念擴(kuò)展到通用資源的管理,例如 GPU 等。它支持基于實(shí)時(shí)需求和預(yù)設(shè)配置進(jìn)行動(dòng)態(tài)的資源調(diào)整,從而最大程度地減少人工干預(yù)的需求。
如何理解 DRA(Dynamic Resource Allocation) ?
DRA 即全稱(chēng)為(Dynamic Resource Allocation,動(dòng)態(tài)資源分配) 是 Kubernetes 提供的一項(xiàng)至關(guān)重要的機(jī)制,用于實(shí)現(xiàn) Pod 和 Pod 內(nèi)容器之間資源的高效請(qǐng)求、管理和共享。 DRA 的核心目標(biāo)是通過(guò)靈活且統(tǒng)一的方式管理復(fù)雜的異構(gòu)資源,使 Kubernetes 能夠適配現(xiàn)代云原生場(chǎng)景中日益多樣化的需求。在本質(zhì)上,DRA 是對(duì)通用資源持久卷(Generic Resource Persistent Volume,PV)API 的泛化,其設(shè)計(jì)理念在于提供更強(qiáng)的靈活性,特別是在涉及 GPU 等特殊硬件設(shè)備時(shí),DRA 的優(yōu)勢(shì)尤為明顯。
通常而言,DRA 核心特性與工作機(jī)制主要體現(xiàn)在如下幾點(diǎn),具體可參考:
(1) 對(duì)通用資源持久卷 API 的泛化
傳統(tǒng)的資源分配方式通常只涵蓋 CPU 和內(nèi)存等通用資源,而 DRA 的出現(xiàn)則使 Kubernetes 能夠支持更廣泛的資源類(lèi)型。這種泛化的實(shí)現(xiàn),使得 DRA 不僅限于硬件設(shè)備的管理,還能夠擴(kuò)展到其他復(fù)雜資源類(lèi)型,從而滿足不同場(chǎng)景下的動(dòng)態(tài)需求。例如,在深度學(xué)習(xí)場(chǎng)景中,用戶不僅可以請(qǐng)求 GPU 資源,還可以指定具體的顯存大小或計(jì)算核心數(shù),以便更精確地滿足任務(wù)需求。
(2) 第三方資源驅(qū)動(dòng)程序的關(guān)鍵作用
DRA 的高效運(yùn)行離不開(kāi)第三方資源驅(qū)動(dòng)程序的支持。這些驅(qū)動(dòng)程序主要負(fù)責(zé)以下任務(wù):
- 資源發(fā)現(xiàn):檢測(cè)和報(bào)告節(jié)點(diǎn)上的可用資源狀態(tài),例如 GPU 的數(shù)量、型號(hào)和當(dāng)前負(fù)載情況。
- 資源分配:根據(jù)用戶的具體需求分配資源,并將資源綁定到目標(biāo) Pod。
- 資源監(jiān)控:在資源生命周期內(nèi)持續(xù)跟蹤資源的使用狀態(tài),以確保任務(wù)的順利完成并避免資源沖突。
通過(guò)第三方驅(qū)動(dòng)程序,DRA 能夠?qū)崿F(xiàn)對(duì)資源的細(xì)粒度控制。例如,在 AI 模型訓(xùn)練任務(wù)中,用戶可以通過(guò)自定義驅(qū)動(dòng)程序參數(shù)指定 GPU 顯存分配的上限,以適應(yīng)特定模型對(duì)顯存的需求,從而最大化計(jì)算性能和資源利用率。
(2) 參數(shù)化與結(jié)構(gòu)化的資源管理
DRA 在 Kubernetes 1.30 中引入了一種基于結(jié)構(gòu)化參數(shù)的機(jī)制。這一機(jī)制允許用戶為不同類(lèi)型的資源定義靈活的需求和初始化參數(shù)。例如:
- GPU 配置:可以指定顯存大小、計(jì)算核心數(shù)、CUDA 支持版本等。
- FPGA 配置:可以定義板卡型號(hào)、邏輯單元使用量或頻率等。
- 網(wǎng)絡(luò)設(shè)備:支持指定帶寬、吞吐量或 RDMA 能力。
基于這種參數(shù)化設(shè)計(jì)為用戶提供了高度靈活的資源定制能力,同時(shí)也為復(fù)雜資源的動(dòng)態(tài)管理奠定了基礎(chǔ)。
作為 Kubernetes 動(dòng)態(tài)資源管理中的關(guān)鍵機(jī)制之一,動(dòng)態(tài)資源分配 (DRA) 目標(biāo)在于為特殊資源的高效利用提供統(tǒng)一、靈活的管理方式。DRA 通過(guò)將資源的請(qǐng)求、分配、調(diào)度和監(jiān)控模塊化和參數(shù)化,使 Kubernetes 能夠以標(biāo)準(zhǔn)化的方式支持各種異構(gòu)硬件資源,從而滿足現(xiàn)代云原生應(yīng)用對(duì)高性能計(jì)算和精細(xì)化資源管理的需求。
Reference :
- [1] https://kubernetes.io/docs/concepts/scheduling-eviction/dynamic-resource-allocation/
- [2] https://mp.weixin.qq.com/s/AqLNJoyDWxZDFEtGWEqpoA