国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

k8s 資源預(yù)留

這篇具有很好參考價(jià)值的文章主要介紹了k8s 資源預(yù)留。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

KUBERNETES資源管理之–資源預(yù)留
Kubernetes 的節(jié)點(diǎn)可以按照 Capacity 調(diào)度。node節(jié)點(diǎn)本身除了運(yùn)行不少驅(qū)動(dòng) OS 和 Kubernetes 的系統(tǒng)守護(hù)進(jìn)程,默認(rèn)情況下 pod 能夠使用節(jié)點(diǎn)全部可用容量, 除非為這些系統(tǒng)守護(hù)進(jìn)程留出資源,否則它們將與 pod 爭(zhēng)奪資源并導(dǎo)致節(jié)點(diǎn)資源短缺問題。由于某些Pod沒有對(duì)內(nèi)存及CPU進(jìn)行限制,導(dǎo)致Pod在運(yùn)行過程中所需的內(nèi)存超過了節(jié)點(diǎn)本身的內(nèi)存(OOM),導(dǎo)致某些進(jìn)程被Linux系統(tǒng)的OOM killer機(jī)制殺掉,假如被殺掉的進(jìn)程是系統(tǒng)進(jìn)程或K8S組件,會(huì)導(dǎo)致比較嚴(yán)重的問題,例如導(dǎo)致節(jié)點(diǎn)崩潰,使得運(yùn)行在該節(jié)點(diǎn)上的所有Pod狀態(tài)出現(xiàn)異常。

為了解決上述問題,可以采取如下方法

  • 每個(gè)節(jié)點(diǎn)為系統(tǒng)守護(hù)進(jìn)程預(yù)留計(jì)算資源(CPU、內(nèi)存、磁盤空間)
  • Pod驅(qū)逐:節(jié)點(diǎn)資源到達(dá)一定使用量,開始驅(qū)逐 pod,減輕本節(jié)點(diǎn)的壓力
  • 每個(gè)Pod需指定所需資源,限制其可使用的資源上限。

一、資源問題概述

系統(tǒng)資源可分為兩類:可壓縮資源(CPU)和不可壓縮資源(memory、storage)??蓧嚎s資源比如CPU超配后,在系統(tǒng)滿負(fù)荷時(shí)會(huì)劃分時(shí)間片分時(shí)運(yùn)行進(jìn)程,系統(tǒng)整體會(huì)變慢(一般不會(huì)導(dǎo)致太大的問題)。但不可壓縮資源如Memory,當(dāng)系統(tǒng)內(nèi)存不足時(shí),就有可能觸發(fā)系統(tǒng) OOM;這時(shí)候根據(jù) oom score 來確定優(yōu)先殺死哪個(gè)進(jìn)程,而 oom_score_adj 又是影響 oom score 的重要參數(shù),其值越低,表示 oom 的優(yōu)先級(jí)越低。在worker節(jié)點(diǎn)中,進(jìn)程的 oom_score_adj 如下:
k8s 資源預(yù)留,k8s,k8s
所以,OOM 的優(yōu)先級(jí)如下:

BestEffort Pod > Burstable Pod > 其它進(jìn)程 > Guaranteed Pod > kubelet/docker 等 > sshd 等

二、資源預(yù)留

kubelet的啟動(dòng)配置中有一個(gè)Node Allocatable特性,來為系統(tǒng)守護(hù)進(jìn)程和k8s組件預(yù)留計(jì)算資源,使得即使節(jié)點(diǎn)滿負(fù)載運(yùn)行時(shí),也不至于出現(xiàn)pod去和系統(tǒng)守護(hù)進(jìn)程以及k8s組件爭(zhēng)搶資源,導(dǎo)致節(jié)點(diǎn)掛掉的情況。目前支持對(duì)CPU, memory, ephemeral-storage三種資源進(jìn)行預(yù)留。
k8s 資源預(yù)留,k8s,k8s
可分配的節(jié)點(diǎn)暴露為 API 中 v1.Node 對(duì)象的一部分,也是 CLI 中 kubectl describe node 的一部分。

kubelet 中,可以為兩類系統(tǒng)守護(hù)進(jìn)程預(yù)留資源。
k8s 資源預(yù)留,k8s,k8s
節(jié)點(diǎn)可供Pod使用資源總量的計(jì)算公式如下:

allocatable = NodeCapacity - [kube-reserved] - [system-reserved] - [eviction-threshold]

參考目前真實(shí)的物理環(huán)境,如下:

[root@node1 ~]# kubectl describe node node1
Capacity:
  cpu:                                        128
  ephemeral-storage:                          256378368Ki
  hugepages-1Gi:                              36Gi
  intel.com/intel_sriov_switchdev_xxv710_vf:  64
  memory:                                     527832708Ki
  pods:                                       110
Allocatable:
  cpu:                                        112
  ephemeral-storage:                          236278303558
  hugepages-1Gi:                              36Gi
  intel.com/intel_sriov_switchdev_xxv710_vf:  64
  memory:                                     448140932Ki
  pods:                                       110
  
這是我真實(shí)環(huán)境中的物理總量,cpu120C,內(nèi)存504G,容器使用存儲(chǔ)資源單獨(dú)在/var目錄下,未對(duì)存儲(chǔ)資源進(jìn)行限制,使用的默認(rèn)值。系統(tǒng)中還開啟了大頁內(nèi)存以及使用的sriov等資源(此處不做具體講解,只說cpu,內(nèi)存的限制使用)

三、kubelet常用配置參數(shù)

  • kube預(yù)留值
Kubelet 標(biāo)志: --kube-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]
Kubelet 標(biāo)志: --kube-reserved-cgroup=

#################
kube-reserved 用來給諸如 kubelet、容器運(yùn)行時(shí)、節(jié)點(diǎn)問題監(jiān)測(cè)器等 Kubernetes 系統(tǒng)守護(hù)進(jìn)程記述其資源預(yù)留值。 該配置并非用來給以 Pod 形式運(yùn)行的系統(tǒng)守護(hù)進(jìn)程預(yù)留資源。假如組件要是以static pod形式啟動(dòng)的,那并不在這個(gè)kube-reserved管理并限制的cgroup中,而是在kubepod這個(gè)cgroup中。除了 cpu、內(nèi)存 和 ephemeral-storage之外,pid 可用來指定為 kubernetes 系統(tǒng)守護(hù)進(jìn)程預(yù)留指定數(shù)量的進(jìn)程 ID。

kube-reserved-cgroup這個(gè)參數(shù)用來指定k8s系統(tǒng)組件所使用的cgroup。注意,從 Kubernetes 1.18 版本開始,默認(rèn)情況下,Kubernetes 已經(jīng)為每個(gè)組件自動(dòng)分配了一個(gè)保留的 cgroup。如果你的版本小于1.18,需要提前把指定的cgroup及其子系統(tǒng)需要預(yù)先創(chuàng)建好,kubelet并不會(huì)為你自動(dòng)創(chuàng)建好。
  • system預(yù)留值
Kubelet 標(biāo)志: --system-reserved=[cpu=100m][,][memory=100Mi][,][ephemeral-storage=1Gi][,][pid=1000]
Kubelet 標(biāo)志: --system-reserved-cgroup=

########################
system-reserved用于為系統(tǒng)守護(hù)進(jìn)程記述其資源預(yù)留值例如sshd等服務(wù)。system-reserved也應(yīng)該為kernel 預(yù)留內(nèi)存,因?yàn)槟壳発ernel使用的內(nèi)存并不記在 Kubernetes 的 Pod 上。同時(shí)還推薦為用戶登錄會(huì)話預(yù)留資源(systemd 體系中的user.slice)。除了cpu、內(nèi)存和ephemeral-storage之外,pid可用來指定為系統(tǒng)守護(hù)進(jìn)程預(yù)留指定數(shù)量的進(jìn)程 ID。

如果你的版本小于1.18,需要提前創(chuàng)建system cgroup,否則kubelet啟動(dòng)失敗。
  • 驅(qū)逐閾值
Kubelet 標(biāo)志:--eviction-hard=[memory.available<500Mi]

######################################
kubelet 的 --eviction-hard 標(biāo)志用于設(shè)置 Kubernetes 節(jié)點(diǎn)上的資源耗盡情況下的強(qiáng)制驅(qū)逐策略。它支持以下資源閾值:

1:memory.available:可用內(nèi)存的百分比。例如,--eviction-hard=memory.available<100Mi 表示當(dāng)可用內(nèi)存小于 100 MiB 時(shí)觸發(fā)驅(qū)逐。
2:nodefs.available:可用節(jié)點(diǎn)文件系統(tǒng)的百分比。例如,--eviction-hard=nodefs.available<10% 表示當(dāng)可用節(jié)點(diǎn)文件系統(tǒng)空間小于 10% 時(shí)觸發(fā)驅(qū)逐。
3:imagefs.available:可用容器鏡像文件系統(tǒng)的百分比。例如,--eviction-hard=imagefs.available<15% 表示當(dāng)可用容器鏡像文件系統(tǒng)空間小于 15% 時(shí)觸發(fā)驅(qū)逐。
可以使用 <、<=、>、>= 符號(hào)來設(shè)置不同的閾值條件。

############################
請(qǐng)注意,--eviction-hard 的設(shè)置可能因 Kubernetes 版本而有所不同。確保參考您所使用的具體版本的文檔來了解更多關(guān)于資源閾值以及其他相關(guān)設(shè)置和選項(xiàng)的詳細(xì)信息。
  • 顯示保留的cpu列表
Kubelet 標(biāo)志:--reserved-cpus=0-3

############################33
reserved-cpus旨在為操作系統(tǒng)守護(hù)程序和 kubernetes 系統(tǒng)守護(hù)程序保留一組明確指定編號(hào)的 CPU。

除了上述參數(shù)之外還有其他的一些參數(shù)可供參考

1:配置 cgroup 驅(qū)動(dòng) ,驅(qū)動(dòng)通過--cgroup-driver標(biāo)志配置。
   cgroupfs是默認(rèn)的驅(qū)動(dòng),在主機(jī)上直接操作 cgroup 文件系統(tǒng)以對(duì) cgroup 沙箱進(jìn)行管理。
   systemd是可選的驅(qū)動(dòng),使用 init 系統(tǒng)支持的資源的瞬時(shí)切片管理 cgroup 沙箱。
   
2:實(shí)施節(jié)點(diǎn)可分配約束 --enforce-node-allocatable=pods[,][system-reserved][,][kube-reserved]標(biāo)志配置,調(diào)度器將 'Allocatable' 視為 Pod 可用的 capacity(資源容量)。kubelet 默認(rèn)對(duì) Pod 執(zhí)行 'Allocatable' 約束。 無論何時(shí),如果所有 Pod 的總用量超過了 'Allocatable',驅(qū)逐 Pod 的措施將被執(zhí)行??赏ㄟ^設(shè)置 kubelet --enforce-node-allocatable 標(biāo)志值為 pods 控制這個(gè)措施。

四、cpu管理策略

默認(rèn)情況下,kubelet 使用 CFS 配額 來執(zhí)行 Pod 的 CPU 約束。 當(dāng)節(jié)點(diǎn)上運(yùn)行了很多 CPU 密集的 Pod 時(shí),工作負(fù)載可能會(huì)遷移到不同的 CPU 核, 這取決于調(diào)度時(shí) Pod 是否被扼制,以及哪些 CPU 核是可用的。 許多工作負(fù)載對(duì)這種遷移不敏感,因此無需任何干預(yù)即可正常工作。

然而,有些工作負(fù)載的性能明顯地受到 CPU 緩存親和性以及調(diào)度延遲的影響。 對(duì)此,kubelet 提供了可選的 CPU 管理策略,來確定節(jié)點(diǎn)上的一些分配偏好。

CPU 管理策略通過 kubelet 參數(shù) --cpu-manager-policy來指定,有以下兩種策略可供使用

  • none: 默認(rèn)策略,表示現(xiàn)有的調(diào)度行為。
none策略為默認(rèn)的CPU親和方案,不提供操作系統(tǒng)調(diào)度器默認(rèn)行為之外的親和性策略。 通過 CFS 配額來實(shí)現(xiàn) Guaranteed Pods 和 Burstable Pods 的 CPU 使用限制。
  • static: 允許為節(jié)點(diǎn)上具有某些資源特征的 Pod 賦予增強(qiáng)的 CPU 親和性和獨(dú)占性。
static策略針對(duì)具有整數(shù)型 CPU requests的 Guaranteed Pod ,它允許該P(yáng)od中的容器獨(dú)占物理機(jī)的CPU資源。這種獨(dú)占性是使用cpuset cgroup控制器來實(shí)現(xiàn)的。

####################
注意: CPU管理器不支持運(yùn)行時(shí)下線和上線 CPUs。如果節(jié)點(diǎn)上的在線CPUs集合發(fā)生變化,則必須驅(qū)逐節(jié)點(diǎn)上的Pod,并通過刪除kubelet根目錄中的狀態(tài)文件cpu_manager_state來手動(dòng)重置CPU管理器。

#########################
此策略管理一個(gè)CPU共享池,該共享池最初包含節(jié)點(diǎn)上所有的CPU資源??瑟?dú)占性CPU資源數(shù)量等于節(jié)點(diǎn)的CPU總量減去通過kubelet --kube-reserved和--system-reserved參數(shù)中預(yù)留的CPU資源。從1.17版本開始,可以通過 kubelet --reserved-cpus參數(shù)顯式地指定CPU預(yù)留列表。由--reserved-cpus指定的顯式CPU列表優(yōu)先于由 --kube-reserved和--system-reserved指定的CPU預(yù)留。通過這些參數(shù)預(yù)留的CPU是以'整數(shù)'方式,按物理核心 ID升序從初始共享池獲取的。 共享池是BestEffort和Burstable Pod運(yùn)行的CPU集合。 Guaranteed Pod 中的容器,如果聲明了'非整數(shù)值'的CPU requests,也將運(yùn)行在共享池的CPU上。只有Guaranteed Pod中,指定了整數(shù)型CPU requests 的容器,才會(huì)被分配獨(dú)占CPU資源。

########################################
spec:
  containers:
  - name: nginx
    image: nginx
    
該P(yáng)od屬于BestEffort QoS類型,因?yàn)槠湮粗付╮equests或limits值。所以該容器運(yùn)行在共享CPU池中。

###################################
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
該P(yáng)od屬于Burstable QoS類型,因?yàn)槠滟Y源requests不等于limits,且未指定cpu數(shù)量。所以該容器運(yùn)行在共享CPU池中。

###################################
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
      requests:
        memory: "100Mi"
        cpu: "1"
該P(yáng)od屬于Burstable QoS類型,因?yàn)槠滟Y源requests 不等于limits。所以該容器運(yùn)行在共享 CPU池中。

#######################################
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
      requests:
        memory: "200Mi"
        cpu: "2"
該P(yáng)od屬于Guaranteed QoS類型,因?yàn)槠鋜equests值與limits相等。同時(shí)容器對(duì)CPU資源的限制值是一個(gè)大于或等于1的整數(shù)值。所以該nginx容器被賦予2個(gè)獨(dú)占CPU。

#################################
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "1.5"
      requests:
        memory: "200Mi"
        cpu: "1.5"
該P(yáng)od屬于Guaranteed QoS類型,因?yàn)槠鋜equests值與limits相等。但是容器對(duì)CPU資源的限制值是一個(gè)小數(shù)。所以該容器運(yùn)行在共享CPU池中。

#####################################
spec:
  containers:
  - name: nginx
    image: nginx
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
        
該P(yáng)od屬于Guaranteed QoS類型,因其指定了limits值,同時(shí)當(dāng)未顯式指定時(shí),requests值被設(shè)置為與limits值相等。同時(shí)容器對(duì)CPU資源的限制值是一個(gè)大于或等于1的整數(shù)值。所以該 nginx容器被賦予2個(gè)獨(dú)占CPU。

CPU 管理器定期通過 CRI 寫入資源更新,以保證內(nèi)存中 CPU 分配與 cgroupfs 一致。 同步頻率通過新增的 Kubelet 配置參數(shù) --cpu-manager-reconcile-period 來設(shè)置。 如果不指定,默認(rèn)與 --node-status-update-frequency 的周期相同。

更改 CPU 管理器策略

CPU 管理器策略只能在 kubelet 生成新 Pod 時(shí)應(yīng)用,所以簡(jiǎn)單地從 “none” 更改為 “static” 將不會(huì)對(duì)現(xiàn)有的 Pod 起作用。更改節(jié)點(diǎn)上的 CPU 管理器策略步驟如下:

1:刪除舊的CPU管理器狀態(tài)文件。文件的路徑默認(rèn)為/var/lib/kubelet/cpu_manager_state。這將清除CPUManager維護(hù)的狀態(tài),以便新策略設(shè)置的 cpu-sets 不會(huì)與之沖突。
2:修改kubelet的啟動(dòng)參數(shù)
3:重啟kubelet

五、NUMA 感知的內(nèi)存管理器

Kubernetes 內(nèi)存管理器(Memory Manager)為 Guaranteed QoS 類 的 Pods 提供可保證的內(nèi)存(或者內(nèi)存大頁)分配能力。內(nèi)存管理器使用提示生成協(xié)議來為 Pod 生成最合適的 NUMA 親和性配置。 內(nèi)存管理器將這類親和性提示輸入給中央管理器(即 Topology Manager)。 基于所給的提示和 Topology Manager(拓?fù)涔芾砥鳎┑牟呗栽O(shè)置,Pod 或者會(huì)被某節(jié)點(diǎn)接受,或者被該節(jié)點(diǎn)拒絕。此外,內(nèi)存管理器還確保 Pod 所請(qǐng)求的內(nèi)存是從盡量少的 NUMA 節(jié)點(diǎn)分配而來。

使用內(nèi)存管理器的前提條件

  • CPU 管理器應(yīng)該被啟用,并且在節(jié)點(diǎn)(Node)上要配置合適的 CPU 管理器策略。
  • 拓?fù)涔芾砥饕粏⒂茫⑶乙诠?jié)點(diǎn)上配置合適的拓?fù)涔芾砥鞑呗浴?/li>

我的環(huán)境是1.23.6。默認(rèn)開啟MemoryManager

內(nèi)存管理策略

內(nèi)存管理器支持兩種策略。通過 kubelet 參數(shù) --memory-manager-policy 來選擇哪種策略,如下:

  • none(默認(rèn))
默認(rèn)的策略,并且不會(huì)以任何方式影響內(nèi)存分配。None策略返回默認(rèn)的拓?fù)涮崾拘畔?
  • static
對(duì)Guaranteed Pod而言,Static內(nèi)存管理器策略會(huì)返回拓?fù)涮崾拘畔?,該信息與內(nèi)存分配有保障的NUMA節(jié)點(diǎn)集合有關(guān),并且內(nèi)存管理器還通過更新內(nèi)部的'節(jié)點(diǎn)映射'對(duì)象來完成內(nèi)存預(yù)留。

對(duì)BestEffort或Burstable Pod而言,因?yàn)椴淮嬖趯?duì)有保障的內(nèi)存資源的請(qǐng)求,Static內(nèi)存管理器策略會(huì)返回默認(rèn)的拓?fù)涮崾?,并且不?huì)通過內(nèi)部的'節(jié)點(diǎn)映射對(duì)象'來預(yù)留內(nèi)存。

內(nèi)存管理策略配置

前面提到的參數(shù)包括 --kube-reserved、--system-reserved--eviction-threshold。 這些參數(shù)值的綜合計(jì)作預(yù)留內(nèi)存的總量。為內(nèi)存管理器而新增加的 --reserved-memory 參數(shù)可以將總的預(yù)留內(nèi)存進(jìn)行劃分, 并完成跨 NUMA 節(jié)點(diǎn)的預(yù)留操作。

標(biāo)志設(shè)置的值是一個(gè)按 NUMA 節(jié)點(diǎn)的不同內(nèi)存類型所給的內(nèi)存預(yù)留的值的列表,用逗號(hào)分開。內(nèi)存管理器不會(huì)使用這些預(yù)留的內(nèi)存來為容器負(fù)載分配內(nèi)存。
配置方式如下:
--reserved-memory N:memory-type1=value1,memory-type2=value2,...
1:N(整數(shù))- NUMA 節(jié)點(diǎn)索引,例如,0,1,2,3,4
2:memory-type(字符串)- 代表內(nèi)存類型:
   memory 表示常規(guī)內(nèi)存
   hugepages-2Mi或hugepages-1Gi 表示內(nèi)存大頁
3:value(字符串) 表示預(yù)留內(nèi)存的量,例如 1Gi

######################
舉例如下:
--reserved-memory 0:memory=1Gi,hugepages-1Gi=2Gi 在numa0上預(yù)留了1G的普通內(nèi)存和2G的內(nèi)存大頁

如果有多個(gè)numa,可以寫成如下配置
--reserved-memory 0:memory=1Gi --reserved-memory 1:memory=2Gi

#########################
在設(shè)置--reserved-memory時(shí),必須遵守如下公式
sum(reserved-memory(i)) = kube-reserved + system-reserved + eviction-threshold
也就是reserved-memory的值等于kube預(yù)留、系統(tǒng)預(yù)留以及閾值條件(默認(rèn)的硬性驅(qū)逐閾值是 100MiB)的總和

#########################
當(dāng)系統(tǒng)中有以下設(shè)置時(shí)
--kube-reserved=cpu=4,memory=16Gi 
--system-reserved=cpu=12,memory=16Gi 
--eviction-hard=memory.available<8Gi  ##如果此值沒有設(shè)置,則reserved-memory需要加上默認(rèn)的100Mi
--memory-manager-policy=Static

那么reserved-memory的值就是kube-reserved + system-reserved + eviction-hard
正確設(shè)置為--reserved-memory 0:memory=20Gi --reserved-memory 1:memory=20Gi

k8s中,內(nèi)存管理器文件位于/var/lib/kubelet/memory_manager_state中

六、實(shí)踐

上面講述了需要的知識(shí)點(diǎn),接下來我們按照實(shí)際的物理環(huán)境來進(jìn)行配置文章來源地址http://www.zghlxwxcb.cn/news/detail-735155.html

  • 檢查節(jié)點(diǎn)的cpu拓?fù)?/strong>
lscpu查看系統(tǒng)中cpu數(shù)量
[root@node1 ~]# lscpu 
架構(gòu):           x86_64
CPU 運(yùn)行模式:   32-bit, 64-bit
字節(jié)序:         Little Endian
CPU:             128
在線 CPU 列表:  0-127      ###總共有128C,并開啟了超線程
每個(gè)核的線程數(shù): 2
每個(gè)座的核數(shù):   32
座:             2
NUMA 節(jié)點(diǎn):      8
廠商 ID:        HygonGenuine
BIOS Vendor ID:  Chengdu Hygon
CPU 系列:       24
型號(hào):           0
型號(hào)名稱:       Hygon C86 7285 32-core Processor
BIOS Model name: Hygon C86 7285 32-core Processor
步進(jìn):           2
CPU MHz:        2461.008
CPU 最大 MHz:   2000.0000
CPU 最小 MHz:   1200.0000
BogoMIPS:       4000.07
虛擬化:         AMD-V
L1d 緩存:       32K
L1i 緩存:       64K
L2 緩存:        512K
L3 緩存:        8192K
NUMA 節(jié)點(diǎn)0 CPU: 0-7,64-71
NUMA 節(jié)點(diǎn)1 CPU: 8-15,72-79
NUMA 節(jié)點(diǎn)2 CPU: 16-23,80-87
NUMA 節(jié)點(diǎn)3 CPU: 24-31,88-95
NUMA 節(jié)點(diǎn)4 CPU: 32-39,96-103
NUMA 節(jié)點(diǎn)5 CPU: 40-47,104-111
NUMA 節(jié)點(diǎn)6 CPU: 48-55,112-119
NUMA 節(jié)點(diǎn)7 CPU: 56-63,120-127


###################
查看numa架構(gòu)
[root@node1 ~]# numactl -H
available: 8 nodes (0-7)
node 0 cpus: 0 1 2 3 4 5 6 7 64 65 66 67 68 69 70 71
node 0 size: 63973 MB
node 0 free: 1335 MB
node 1 cpus: 8 9 10 11 12 13 14 15 72 73 74 75 76 77 78 79
node 1 size: 64441 MB
node 1 free: 54748 MB
node 2 cpus: 16 17 18 19 20 21 22 23 80 81 82 83 84 85 86 87
node 2 size: 64507 MB
node 2 free: 50674 MB
node 3 cpus: 24 25 26 27 28 29 30 31 88 89 90 91 92 93 94 95
node 3 size: 64507 MB
node 3 free: 9211 MB
node 4 cpus: 32 33 34 35 36 37 38 39 96 97 98 99 100 101 102 103
node 4 size: 64507 MB
node 4 free: 28655 MB
node 5 cpus: 40 41 42 43 44 45 46 47 104 105 106 107 108 109 110 111
node 5 size: 64507 MB
node 5 free: 26002 MB
node 6 cpus: 48 49 50 51 52 53 54 55 112 113 114 115 116 117 118 119
node 6 size: 64507 MB
node 6 free: 4099 MB
node 7 cpus: 56 57 58 59 60 61 62 63 120 121 122 123 124 125 126 127
node 7 size: 64507 MB
node 7 free: 53190 MB
node distances:
node   0   1   2   3   4   5   6   7 
  0:  10  16  16  16  28  28  22  28 
  1:  16  10  16  16  28  28  28  22 
  2:  16  16  10  16  22  28  28  28 
  3:  16  16  16  10  28  22  28  28 
  4:  28  28  22  28  10  16  16  16 
  5:  28  28  28  22  16  10  16  16 
  6:  22  28  28  28  16  16  10  16 
  7:  28  22  28  28  16  16  16  10 
[root@node1 ~]# 

  • 設(shè)置預(yù)留資源
配置方式有兩種,可以修改/var/lib/kubelet/config.yaml文件進(jìn)行修改,不過不建議采用
此處我們采用另外一種方式,修改kubelet啟動(dòng)服務(wù)文件,如下:
1:進(jìn)入kebelet服務(wù)配置目錄,有默認(rèn)的10-kubeadm.conf配置文件
[root@node1 ~]# cd /etc/systemd/system/kubelet.service.d/
[root@node1 kubelet.service.d]# ll
總用量 8
-rw-r--r-- 1 root root 1003 9月  10 14:33 10-kubeadm.conf

2:編輯新文件11-kubelet.conf,添加如下內(nèi)容
[Service]
Environment="KUBELET_ECS_ARGS=--kube-reserved=cpu=4,memory=16Gi --system-reserved=cpu=12,memory=16Gi --eviction-hard=memory.available<8Gi,nodefs.available<10% --cpu-manager-policy=static --reserved-cpus=0-3,64-67,32-35,96-99 --memory-manager-policy=Static --reserved-memory 0:memory=20Gi --reserved-memory 4:memory=20Gi"

#####################
我們環(huán)境中為kube組件預(yù)留了4個(gè)cpu和16G內(nèi)存,為系統(tǒng)進(jìn)程預(yù)留12個(gè)cpu和16G內(nèi)存的資源,閾值條件是當(dāng)時(shí)系統(tǒng)內(nèi)存少于8G時(shí),執(zhí)行pod疏散任務(wù)。

預(yù)留的cpu列表是0-3,64-67,32-35,96-99   ##共16個(gè)cpu,根據(jù)上面的numa架構(gòu),位于numa0和numa4上,也別需要注意一點(diǎn),預(yù)留cpu時(shí),物理核一定要和其超線程對(duì)應(yīng),例如cpu0的超線程是64

reserved-memory的值是16G + 16G + 8G = 40G ###因?yàn)轭A(yù)留的cpu位于兩個(gè)numa上,所以reserved-memory的numa也要與之對(duì)應(yīng),否則共享池中的pod在訪問內(nèi)存時(shí),會(huì)出現(xiàn)跨numa的問題,影響性能
  • 重啟kubelet
1:首先要?jiǎng)h除系統(tǒng)的/var/lib/kubelet/cpu_manager_state和/var/lib/kubelet/memory_manager_state,避免與舊的策略產(chǎn)生沖突
2:加載服務(wù) systemctl daemon-reload
3:重啟kubelet服務(wù) systemctl restart kubelet 
新的策略文件會(huì)重新生成
  • 啟動(dòng)pod查看資源使用
1:編輯pod 啟動(dòng)yaml,如下;
apiVersion: v1
kind: Pod
metadata:
  name: nginx
spec:
  containers:
  - name: nginx
    image: docker.io/library/nginx:latest
    imagePullPolicy: IfNotPresent
    resources:
      limits:
        memory: "200Mi"
        cpu: "2"
      requests:
        memory: "200Mi"
        cpu: "2"
        
2:啟動(dòng)pod,如下:
[root@node1 ~]# kubectl apply -f  pod.yaml 
pod/nginx created
[root@node1 ~]# vim pod.yaml 
[root@node1 ~]# 
[root@node1 ~]# 
[root@node1 ~]# kubectl get po -o wide 
NAME    READY   STATUS    RESTARTS   AGE   IP             NODE    NOMINATED NODE   READINESS GATES
nginx   1/1     Running   0          55s   172.10.30.91   node3   <none>           <none>

3:以上得知pod位于node3節(jié)點(diǎn),查看該節(jié)點(diǎn)的cpu管理策略文件
[root@node3 ~]# cat /var/lib/kubelet/cpu_manager_state 
{"policyName":"static","defaultCpuSet":"0-3,21-23,32-67,85-87,96-127","entries":{"28e92e4f-958d-4f9d-8aae-e2f8557dee9d":{"nginx":"20,84"},"66ce7446-8e92-49d7-8c49-06c9ccf46e6a":{"loam-b":"13-14,77-78"},"9f223236-e84e-4169-8139-e103062d54ee":{"llb":"15-16,79-80"},"c25c6025-cfda-4c87-9413-0627187848c0":{"ipds":"7,19,24-31,71,83,88-95"},"c396c532-70d1-41b0-9993-30b2bd36d7b3":{"necc":"4,8-10,68,72-74"},"c4020329-6fc9-41a3-94c8-1d47a08e48e5":{"eems":"5,69"},"d82d23c7-b3a5-43cf-ba77-df4a2de5b225":{"alms":"6,70"},"e14ad8c9-a58c-4cad-a309-b0be2047c7cb":{"loam-a":"17-18,81-82"},"e4a6664a-d38e-4bcb-a5bd-65027645da14":{"llb":"11-12,75-76"}},"checksum":1874914806}

以上可以看到nginx使用的cpu是20,84,結(jié)合上面的cpu的拓?fù)?,位于numa2上。


4:查看node3節(jié)點(diǎn)的內(nèi)存管理文件
[root@node3 ~]# cat /var/lib/kubelet/memory_manager_state  | jq .
      "nginx": [
        {
          "numaAffinity": [
            0            ####nginx使用的內(nèi)存位于numa0上,和cpu不在一個(gè)numa上,如果這個(gè)是性能型pod,會(huì)影響業(yè)務(wù)的使用
          ],
          "type": "memory",
          "size": 2147483648
        }
      ]

############################################
如果要解決pod使用cpu和內(nèi)存numa不一致問題,有以下方法
1:關(guān)閉服務(wù)器numa功能,使節(jié)點(diǎn)只有一個(gè)numa0
2:在kubelet中添加配置參數(shù) --topology-manager-policy=single-numa-node 
3:重新加載服務(wù)配置,重啟kubelet。

到了這里,關(guān)于k8s 資源預(yù)留的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • k8s資源調(diào)度

    默認(rèn)的情況下,一個(gè)pod在哪個(gè)node節(jié)點(diǎn)上運(yùn)行,是由scheduler組件采取對(duì)應(yīng)的算法計(jì)算出來的,這個(gè)過程是不受人工控制的,在實(shí)際的使用過程中,這不能夠滿足客觀的場(chǎng)景,針對(duì)這樣的情況,k8s 提供了四大類調(diào)度方式: 自動(dòng)調(diào)度: 運(yùn)行在哪個(gè)node節(jié)點(diǎn)上完全由scheduler 經(jīng)過一些里

    2024年02月08日
    瀏覽(18)
  • k8s資源介紹

    k8s資源介紹

    Kubernetes系統(tǒng)用于管理分布式節(jié)點(diǎn)集群中的微服務(wù)或容器化應(yīng)用程序,并且其提供了零停機(jī)時(shí)間部署、自動(dòng)回滾、縮放和容器的自愈(其中包括自動(dòng)配置、自動(dòng)重啟、自動(dòng)復(fù)制的高彈性基礎(chǔ)設(shè)施,以及容器的自動(dòng)縮放等)等功能。 Kubernetes系統(tǒng)最重要的設(shè)計(jì)因素之一是能夠橫向

    2024年01月20日
    瀏覽(32)
  • k8s進(jìn)階3——資源配額、資源限制

    k8s進(jìn)階3——資源配額、資源限制

    為什么會(huì)有資源配額管理? 可以提高集群穩(wěn)定性,確保指定的資源對(duì)象在任何時(shí)候都不會(huì)超量占用系統(tǒng)物理資源,避免業(yè)務(wù)進(jìn)程在設(shè)計(jì)或?qū)崿F(xiàn)上的缺陷導(dǎo)致整個(gè)系統(tǒng)運(yùn)行紊亂甚至意外宕機(jī)。 資源配額管理維度: 容器級(jí)別,定義每個(gè)Pod上資源配額相關(guān)的參數(shù),比如CPU/Memory、

    2024年02月10日
    瀏覽(26)
  • yum部署kubernetes(k8s)集群、k8s常用資源管理

    目錄 一、環(huán)境搭建 1、準(zhǔn)備環(huán)境 1)計(jì)算機(jī)說明,建議系統(tǒng)版本7.4或者7.6 2)修改所有主機(jī)的計(jì)算機(jī)名設(shè)置host文件 ?2、安裝master節(jié)點(diǎn) 1)安裝etcd配置etcd 2)安裝k8s-master節(jié)點(diǎn) 3)配置apiserver 4)配置controller和scheduler 5)啟動(dòng)k8s服務(wù) 3、安裝k8s-master上的node 1)安裝node 2)配置kube

    2024年02月13日
    瀏覽(35)
  • k8s的資源類型

    Kubernetes(通常稱為K8s)是一種用于自動(dòng)化部署、擴(kuò)展和管理容器化應(yīng)用程序的開源平臺(tái)。它提供了一個(gè)強(qiáng)大的容器編排和管理系統(tǒng),可以簡(jiǎn)化容器化應(yīng)用程序的部署、伸縮和運(yùn)維。 在Kubernetes中,容器是最基本的部署單元,而容器化應(yīng)用程序由一個(gè)或多個(gè)容器組成。Kubernete

    2024年02月05日
    瀏覽(32)
  • k8s資源配額限制

    為什么會(huì)有資源配額管理? 資源配額管理維度解釋? 資源配額參數(shù)有什么? 計(jì)算CPU CPU的Requests和Limits是通過CPU數(shù)(cpus)來度量的。 CPU的資源值是絕對(duì)值,而不是相對(duì)值,比如0.1CPU在單核或多核機(jī)器上是一樣的,都嚴(yán)格等于0.1 CPU core。 計(jì)算Memory 內(nèi)存的Requests和Limits計(jì)量單位

    2024年02月13日
    瀏覽(25)
  • k8s資源對(duì)象(二)

    k8s資源對(duì)象(二)

    secret和configmap資源都是通過掛載的方式將對(duì)應(yīng)數(shù)據(jù)掛載到容器內(nèi)部環(huán)境中去使用,兩者的使用沒有太多的不同 ,configmap資源通常用于為pod提供配置文件;secret資源主要用于為pod提供證書、用戶名密碼等敏感數(shù)據(jù); Configmap將非機(jī)密性信息(如配置信息)和鏡像解耦, 實(shí)現(xiàn)方式為將

    2024年02月06日
    瀏覽(16)
  • k8s---配置資源管理

    k8s---配置資源管理

    目錄 內(nèi)容預(yù)知 secret資源配置 secert的幾種模式 pod如何來引用secret 陳述式創(chuàng)建secret 聲明式+base64編碼配置secret 將secret用vlumes的方式掛載到pod中 傳參的方式將環(huán)境變量導(dǎo)入pod 如何通過secret加密方式獲取倉庫密碼 configmap的資源配置 陳述式創(chuàng)建configmap資源配置 聲明式配置configma

    2024年01月21日
    瀏覽(65)
  • k8s創(chuàng)建資源對(duì)象過程

    k8s創(chuàng)建資源對(duì)象過程

    我們都知道,K8S中一切皆資源,在使用K8S時(shí),所有的pod或者controller都是通過yaml文件進(jìn)行創(chuàng)建的。 那么接下來,就和大家一起看一下K8S是如何創(chuàng)建資源的。 Deployment是一種常見的資源對(duì)象。在Kubernetes系統(tǒng)中創(chuàng)建資源對(duì)象有很多種方法。本節(jié)將對(duì)用kubectl create命令創(chuàng)建Deployment資

    2024年01月19日
    瀏覽(17)
  • k8s 資源管理方式

    k8s中資源管理方式可以劃分為下面的幾種:命令式對(duì)象管理、命令式對(duì)象配置、聲明式對(duì)象配置。 命令式對(duì)象管理 命令式對(duì)象管理:直接使用命令的方式來操作k8s資源, 這種方式操作簡(jiǎn)單,但是無法審計(jì)和追蹤。 命令式對(duì)象配置 通過命令和配置文件來操作k8s資源,這種方式

    2024年02月07日
    瀏覽(26)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包