新聞中心
為系統(tǒng)守護(hù)進(jìn)程預(yù)留計(jì)算資源
Kubernetes 的節(jié)點(diǎn)可以按照 ?Capacity ?調(diào)度。默認(rèn)情況下 pod 能夠使用節(jié)點(diǎn)全部可用容量。 這是個(gè)問(wèn)題,因?yàn)楣?jié)點(diǎn)自己通常運(yùn)行了不少驅(qū)動(dòng) OS 和 Kubernetes 的系統(tǒng)守護(hù)進(jìn)程。 除非為這些系統(tǒng)守護(hù)進(jìn)程留出資源,否則它們將與 pod 爭(zhēng)奪資源并導(dǎo)致節(jié)點(diǎn)資源短缺問(wèn)題。

?kubelet ?公開了一個(gè)名為 'Node Allocatable' 的特性,有助于為系統(tǒng)守護(hù)進(jìn)程預(yù)留計(jì)算資源。 Kubernetes 推薦集群管理員按照每個(gè)節(jié)點(diǎn)上的工作負(fù)載密度配置 “Node Allocatable”。
在開始之前
你必須擁有一個(gè) Kubernetes 的集群,同時(shí)你的 Kubernetes 集群必須帶有 kubectl 命令行工具。 建議在至少有兩個(gè)節(jié)點(diǎn)的集群上運(yùn)行本教程,且這些節(jié)點(diǎn)不作為控制平面主機(jī)。 如果你還沒(méi)有集群,你可以通過(guò) Minikube 構(gòu)建一個(gè)你自己的集群,或者你可以使用下面任意一個(gè) Kubernetes 工具構(gòu)建:
- Katacoda
- 玩轉(zhuǎn) Kubernetes
您的 Kubernetes 服務(wù)器的版本必須為 1.8 或更高版本。 要檢查版本,請(qǐng)輸入 ?kubectl version?。
你的 kubernetes 服務(wù)器版本必須至少是 1.17 版本,才能使用 kubelet 命令行選項(xiàng) ?--reserved-cpus? 設(shè)置 顯式預(yù)留 CPU 列表。
節(jié)點(diǎn)可分配
Kubernetes 節(jié)點(diǎn)上的 'Allocatable' 被定義為 pod 可用計(jì)算資源量。 調(diào)度器不會(huì)超額申請(qǐng) 'Allocatable'。 目前支持 'CPU'、'memory' 和 'ephemeral-storage' 這幾個(gè)參數(shù)。
可分配的節(jié)點(diǎn)暴露為 API 中 ?v1.Node? 對(duì)象的一部分,也是 CLI 中 ?kubectl describe node? 的一部分。
在 ?kubelet ?中,可以為兩類系統(tǒng)守護(hù)進(jìn)程預(yù)留資源。
啟用 QoS 和 Pod 級(jí)別的 cgroups
為了恰當(dāng)?shù)脑诠?jié)點(diǎn)范圍實(shí)施節(jié)點(diǎn)可分配約束,你必須通過(guò) ?--cgroups-per-qos? 標(biāo)志啟用新的 cgroup 層次結(jié)構(gòu)。這個(gè)標(biāo)志是默認(rèn)啟用的。 啟用后,?kubelet ?將在其管理的 cgroup 層次結(jié)構(gòu)中創(chuàng)建所有終端用戶的 Pod。
配置 cgroup 驅(qū)動(dòng)
?kubelet ?支持在主機(jī)上使用 cgroup 驅(qū)動(dòng)操作 cgroup 層次結(jié)構(gòu)。 驅(qū)動(dòng)通過(guò) ?--cgroup-driver? 標(biāo)志配置。
支持的參數(shù)值如下:
- ?
cgroupfs?是默認(rèn)的驅(qū)動(dòng),在主機(jī)上直接操作 cgroup 文件系統(tǒng)以對(duì) cgroup 沙箱進(jìn)行管理。 - ?
systemd?是可選的驅(qū)動(dòng),使用 init 系統(tǒng)支持的資源的瞬時(shí)切片管理 cgroup 沙箱。
取決于相關(guān)容器運(yùn)行時(shí)的配置,操作員可能需要選擇一個(gè)特定的 cgroup 驅(qū)動(dòng) 來(lái)保證系統(tǒng)正常運(yùn)行。 例如,如果操作員使用 ?containerd ?運(yùn)行時(shí)提供的 ?systemd ?cgroup 驅(qū)動(dòng)時(shí), 必須配置 ?kubelet ?使用 ?systemd ?cgroup 驅(qū)動(dòng)。
Kube 預(yù)留值
- Kubelet 標(biāo)志: ?
--kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]? - Kubelet 標(biāo)志: ?
--kube-reserved-cgroup=?
?kube-reserved? 用來(lái)給諸如 ?kubelet?、容器運(yùn)行時(shí)、節(jié)點(diǎn)問(wèn)題監(jiān)測(cè)器等 kubernetes 系統(tǒng)守護(hù)進(jìn)程記述其資源預(yù)留值。 該配置并非用來(lái)給以 Pod 形式運(yùn)行的系統(tǒng)守護(hù)進(jìn)程保留資源。?kube-reserved? 通常是節(jié)點(diǎn)上 ?pod? 密度 的函數(shù)。
除了 ?cpu?,內(nèi)存 和 ?ephemeral-storage? 之外,?pid ?可用來(lái)指定為 kubernetes 系統(tǒng)守護(hù)進(jìn)程預(yù)留指定數(shù)量的進(jìn)程 ID。
要選擇性地對(duì) kubernetes 系統(tǒng)守護(hù)進(jìn)程上執(zhí)行 ?kube-reserved? 保護(hù),需要把 kubelet 的 ?--kube-reserved-cgroup? 標(biāo)志的值設(shè)置為 kube 守護(hù)進(jìn)程的父控制組。
推薦將 kubernetes 系統(tǒng)守護(hù)進(jìn)程放置于頂級(jí)控制組之下(例如 systemd 機(jī)器上的 ?runtime.slice?)。 理想情況下每個(gè)系統(tǒng)守護(hù)進(jìn)程都應(yīng)該在其自己的子控制組中運(yùn)行。 請(qǐng)參考 這個(gè)設(shè)計(jì)方案, 進(jìn)一步了解關(guān)于推薦控制組層次結(jié)構(gòu)的細(xì)節(jié)。
請(qǐng)注意,如果 ?--kube-reserved-cgroup? 不存在,Kubelet 將 不會(huì) 創(chuàng)建它。 如果指定了一個(gè)無(wú)效的 cgroup,Kubelet 將會(huì)失敗。
系統(tǒng)預(yù)留值
- Kubelet 標(biāo)志: ?
--system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]? - Kubelet 標(biāo)志: ?
--system-reserved-cgroup=?
?system-reserved? 用于為諸如 ?sshd?、?udev ?等系統(tǒng)守護(hù)進(jìn)程記述其資源預(yù)留值。 ?system-reserved? 也應(yīng)該為 ?kernel ?預(yù)留 內(nèi)存,因?yàn)槟壳?nbsp;?kernel ?使用的內(nèi)存并不記在 Kubernetes 的 Pod 上。 同時(shí)還推薦為用戶登錄會(huì)話預(yù)留資源(systemd 體系中的 ?user.slice?)。
除了 ?cpu?,內(nèi)存 和 ?ephemeral-storage? 之外,?pid ?可用來(lái)指定為 kubernetes 系統(tǒng)守護(hù)進(jìn)程預(yù)留指定數(shù)量的進(jìn)程 ID。
要想為系統(tǒng)守護(hù)進(jìn)程上可選地實(shí)施 ?system-reserved? 約束,請(qǐng)指定 kubelet 的 ?--system-reserved-cgroup? 標(biāo)志值為 OS 系統(tǒng)守護(hù)進(jìn)程的父級(jí)控制組。
推薦將 OS 系統(tǒng)守護(hù)進(jìn)程放在一個(gè)頂級(jí)控制組之下(例如 systemd 機(jī)器上的 ?system.slice?)。
請(qǐng)注意,如果 ?--system-reserved-cgroup? 不存在,?kubelet ?不會(huì) 創(chuàng)建它。 如果指定了無(wú)效的 cgroup,?kubelet ?將會(huì)失敗。
顯式保留的 CPU 列表
FEATURE STATE: Kubernetes v1.17 [stable]
Kubelet 標(biāo)志:?--reserved-cpus=0-3 ?
?reserved-cpus? 旨在為操作系統(tǒng)守護(hù)程序和 kubernetes 系統(tǒng)守護(hù)程序保留一組明確指定編號(hào)的 CPU。?reserved-cpus? 適用于不打算針對(duì) cpuset 資源為操作系統(tǒng)守護(hù)程序和 kubernetes 系統(tǒng)守護(hù)程序定義獨(dú)立的頂級(jí) cgroups 的系統(tǒng)。 如果 Kubelet 沒(méi)有 指定參數(shù) ?--system-reserved-cgroup? 和 ?--kube-reserved-cgroup?, 則 ?reserved-cpus? 的設(shè)置將優(yōu)先于 ?--kube-reserved? 和 ?--system-reserved? 選項(xiàng)。
此選項(xiàng)是專門為電信/NFV 用例設(shè)計(jì)的,在這些用例中不受控制的中斷或計(jì)時(shí)器可能會(huì) 影響其工作負(fù)載性能。 你可以使用此選項(xiàng)為系統(tǒng)或 kubernetes 守護(hù)程序以及中斷或計(jì)時(shí)器顯式定義 cpuset, 這樣系統(tǒng)上的其余 CPU 可以專門用于工作負(fù)載,因不受控制的中斷或計(jì)時(shí)器的影響得以 降低。 要將系統(tǒng)守護(hù)程序、kubernetes 守護(hù)程序和中斷或計(jì)時(shí)器移動(dòng)到此選項(xiàng)定義的顯式 cpuset 上,應(yīng)使用 Kubernetes 之外的其他機(jī)制。 例如:在 Centos 系統(tǒng)中,可以使用 tuned 工具集來(lái)執(zhí)行此操作。
驅(qū)逐閾值
Kubelet 標(biāo)志:?--eviction-hard=[memory.available<500Mi] ?
節(jié)點(diǎn)級(jí)別的內(nèi)存壓力將導(dǎo)致系統(tǒng)內(nèi)存不足,這將影響到整個(gè)節(jié)點(diǎn)及其上運(yùn)行的所有 Pod。 節(jié)點(diǎn)可以暫時(shí)離線直到內(nèi)存已經(jīng)回收為止。 為了防止(或減少可能性)系統(tǒng)內(nèi)存不足,kubelet 提供了 資源不足管理。 驅(qū)逐操作只支持 ?memory ?和 ?ephemeral-storage?。 通過(guò) ?--eviction-hard? 標(biāo)志預(yù)留一些內(nèi)存后,當(dāng)節(jié)點(diǎn)上的可用內(nèi)存降至保留值以下時(shí), ?kubelet ?將嘗試驅(qū)逐 Pod。 如果節(jié)點(diǎn)上不存在系統(tǒng)守護(hù)進(jìn)程,Pod 將不能使用超過(guò) ?capacity-eviction-hard? 所 指定的資源量。因此,為驅(qū)逐而預(yù)留的資源對(duì) Pod 是不可用的。
實(shí)施節(jié)點(diǎn)可分配約束
Kubelet 標(biāo)志:?--enforce-node-allocatable=pods[,][system-reserved][,][kube-reserved] ?
調(diào)度器將 'Allocatable' 視為 Pod 可用的 ?capacity?(資源容量)。
?kubelet ?默認(rèn)對(duì) Pod 執(zhí)行 'Allocatable' 約束。 無(wú)論何時(shí),如果所有 Pod 的總用量超過(guò)了 'Allocatable',驅(qū)逐 Pod 的措施將被執(zhí)行。 有關(guān)驅(qū)逐策略的更多細(xì)節(jié)可以在 節(jié)點(diǎn)壓力驅(qū)逐頁(yè)找到。 可通過(guò)設(shè)置 kubelet ?--enforce-node-allocatable? 標(biāo)志值為 ?pods ?控制這個(gè)措施。
可選地,通過(guò)在同一標(biāo)志中同時(shí)指定 ?kube-reserved? 和 ?system-reserved? 值, 可以使 ?kubelet ?強(qiáng)制實(shí)施 ?kube-reserved? 和 ?system-reserved? 約束。 請(qǐng)注意,要想執(zhí)行 ?kube-reserved? 或者 ?system-reserved? 約束, 需要對(duì)應(yīng)設(shè)置 ?--kube-reserved-cgroup? 或者 ?--system-reserved-cgroup?。
一般原則
系統(tǒng)守護(hù)進(jìn)程一般會(huì)被按照類似 Guaranteed pods 一樣對(duì)待。 系統(tǒng)守護(hù)進(jìn)程可以在與其對(duì)應(yīng)的控制組中出現(xiàn)突發(fā)資源用量,這一行為要作為 kubernetes 部署的一部分進(jìn)行管理。 例如,?kubelet ?應(yīng)該有它自己的控制組并和容器運(yùn)行時(shí)共享 ?kube-reserved? 資源。 不過(guò),如果執(zhí)行了 ?kube-reserved? 約束,則 kubelet 不可出現(xiàn)突發(fā)負(fù)載并用光 節(jié)點(diǎn)的所有可用資源。
在執(zhí)行 ?system-reserved? 預(yù)留策略時(shí)請(qǐng)加倍小心,因?yàn)樗赡軐?dǎo)致節(jié)點(diǎn)上的 關(guān)鍵系統(tǒng)服務(wù)出現(xiàn) CPU 資源短缺、因?yàn)閮?nèi)存不足而被終止或者無(wú)法在節(jié)點(diǎn)上創(chuàng)建進(jìn)程。 建議只有當(dāng)用戶詳盡地描述了他們的節(jié)點(diǎn)以得出精確的估計(jì)值, 并且對(duì)該組中進(jìn)程因內(nèi)存不足而被殺死時(shí),有足夠的信心將其恢復(fù)時(shí), 才可以強(qiáng)制執(zhí)行 ?system-reserved? 策略。
- 作為起步,可以先針對(duì) ?
pods?上執(zhí)行 'Allocatable' 約束。 - 一旦用于追蹤系統(tǒng)守護(hù)進(jìn)程的監(jiān)控和告警的機(jī)制到位,可嘗試基于用量估計(jì)的 方式執(zhí)行 ?
kube-reserved? 策略。 - 隨著時(shí)間推進(jìn),在絕對(duì)必要的時(shí)候可以執(zhí)行 ?
system-reserved? 策略。
隨著時(shí)間推進(jìn)和越來(lái)越多特性被加入,kube 系統(tǒng)守護(hù)進(jìn)程對(duì)資源的需求可能也會(huì)增加。 以后 kubernetes 項(xiàng)目將嘗試減少對(duì)節(jié)點(diǎn)系統(tǒng)守護(hù)進(jìn)程的利用,但目前這件事的優(yōu)先級(jí) 并不是最高。 所以,將來(lái)的發(fā)布版本中 ?Allocatable ?容量是有可能降低的。
示例場(chǎng)景
這是一個(gè)用于說(shuō)明節(jié)點(diǎn)可分配(Node Allocatable)計(jì)算方式的示例:
- 節(jié)點(diǎn)擁有 32Gi memeory,16 CPU 和 100Gi Storage 資源
- ?
--kube-reserved? 被設(shè)置為 cpu=1,memory=2Gi,ephemeral-storage=1Gi - ?
--system-reserved? 被設(shè)置為 cpu=500m,memory=1Gi,ephemeral-storage=1Gi - ?
--eviction-hard? 被設(shè)置為 memory.available<500Mi,nodefs.available<10%
在這個(gè)場(chǎng)景下,'Allocatable' 將會(huì)是 14.5 CPUs、28.5Gi 內(nèi)存以及 88Gi 本地存儲(chǔ)。 調(diào)度器保證這個(gè)節(jié)點(diǎn)上的所有 Pod 的內(nèi)存 ?requests ?總量不超過(guò) 28.5Gi, 存儲(chǔ)不超過(guò) '88Gi'。 當(dāng) Pod 的內(nèi)存使用總量超過(guò) 28.5Gi 或者磁盤使用總量超過(guò) 88Gi 時(shí), kubelet 將會(huì)驅(qū)逐它們。 如果節(jié)點(diǎn)上的所有進(jìn)程都盡可能多地使用 CPU,則 Pod 加起來(lái)不能使用超過(guò) 14.5 CPUs 的資源。
當(dāng)沒(méi)有執(zhí)行 ?kube-reserved? 或 ?system-reserved? 策略且系統(tǒng)守護(hù)進(jìn)程 使用量超過(guò)其預(yù)留時(shí),如果節(jié)點(diǎn)內(nèi)存用量高于 31.5Gi 或 ?storage ?大于 90Gi, kubelet 將會(huì)驅(qū)逐 Pod。
網(wǎng)頁(yè)標(biāo)題:創(chuàng)新互聯(lián)kubernetes教程:Kubernetes為系統(tǒng)守護(hù)進(jìn)程預(yù)留計(jì)算資源
URL鏈接:http://fisionsoft.com.cn/article/djejigs.html


咨詢
建站咨詢
