不卡av在线播放_欧美成人AU在线看_亚洲一区二区 视频_五月天亚洲无码伊人

Article / 文章中心

一篇帶給你K8s集群穩(wěn)定性提升手段

發(fā)布時(shí)間:2022-03-22 點(diǎn)擊數(shù):606
Kubernetes 中的 Request(請求) 字段用于管理容器對 CPU 和內(nèi)存資源預(yù)留的機(jī)制,保證容器至少可以達(dá)到的資源量,該部分資源不能被其他容器搶占。

編輯搜圖

提升資源利用率

一、 資源浪費(fèi)場景

1、資源預(yù)留普遍存在 50% 以上的浪費(fèi)

Kubernetes 中的 Request(請求) 字段用于管理容器對 CPU 和內(nèi)存資源預(yù)留的機(jī)制,保證容器至少可以達(dá)到的資源量,該部分資源不能被其他容器搶占,具體可查看(https://kubernetes.io/docs/concepts/configuration/manage-resources-containers/)。當(dāng) Request 設(shè)置過小,無法保證業(yè)務(wù)的資源量,當(dāng)業(yè)務(wù)的負(fù)載變高時(shí)無力承載,因此用戶通常習(xí)慣將 Request 設(shè)置得很高,以保證服務(wù)的可靠性。

但實(shí)際上,業(yè)務(wù)在大多數(shù)時(shí)段時(shí)負(fù)載不會很高。以 CPU 為例,下圖是某個(gè)實(shí)際業(yè)務(wù)場景下容器的資源預(yù)留(Request)和實(shí)際使用量(CPU_Usage)關(guān)系圖:資源預(yù)留遠(yuǎn)大于實(shí)際使用量,兩者之間差值所對應(yīng)的資源不能被其他負(fù)載使用,因此 Request 設(shè)置過大勢必會造成較大的資源浪費(fèi)。

編輯搜圖

如何解決這樣的問題?現(xiàn)階段需要用戶自己根據(jù)實(shí)際的負(fù)載情況設(shè)置更合理的 Request、以及限制業(yè)務(wù)對資源的無限請求,防止資源被某些業(yè)務(wù)過度占用。這里可以參考后文中的 Request Quota 和 Limit Ranges 的設(shè)置。

2、 業(yè)務(wù)資源波峰波谷現(xiàn)象普遍,通常波谷時(shí)間大于波峰時(shí)間,資源浪費(fèi)明顯

大多數(shù)業(yè)務(wù)存在波峰波谷,例如公交系統(tǒng)通常在白天負(fù)載增加,夜晚負(fù)載減少;游戲業(yè)務(wù)通常在周五晚上開始出現(xiàn)波峰,在周日晚開始出現(xiàn)波谷。

如下圖所示:同一業(yè)務(wù)在不同的時(shí)間段對資源的請求量不同,如果用戶設(shè)置的是固定的 Request,業(yè)務(wù)在負(fù)載較低時(shí)利用率很低。

編輯搜圖

這時(shí)可以通過動(dòng)態(tài)調(diào)整副本數(shù),以高資源利用率承載業(yè)務(wù)的波峰波谷,可以參考k8s原生提供的HPA 。

3、不同類型的業(yè)務(wù),導(dǎo)致資源利用率有較大差異

在線業(yè)務(wù)通常白天負(fù)載較高,對時(shí)延要求較高,必須優(yōu)先調(diào)度和運(yùn)行;而離線的計(jì)算型業(yè)務(wù)通常對運(yùn)行時(shí)段和時(shí)延要求相對較低,理論上可以在在線業(yè)務(wù)波谷時(shí)運(yùn)行。此外,有些業(yè)務(wù)屬于計(jì)算密集型,對 CPU 資源消耗較多,而有些業(yè)務(wù)屬于內(nèi)存密集型,對內(nèi)存消耗較多。

編輯搜圖

如上圖所示,通過在離線混部可以動(dòng)態(tài)調(diào)度離線業(yè)務(wù)和在線業(yè)務(wù),讓不同類型業(yè)務(wù)在不同的時(shí)間段運(yùn)行以提升資源利用率。對于計(jì)算密集型業(yè)務(wù)和內(nèi)存密集型業(yè)務(wù),可以使用親和性調(diào)度,為業(yè)務(wù)分配更合適的節(jié)點(diǎn),以及通過taints/tolerations 策略隔離某些node給特定的業(yè)務(wù)場景使用,有效提升資源利用率。

二、 提升資源利用率的方法

主要從兩方面著手:一是利用原生的 Kubernetes 能力手動(dòng)進(jìn)行資源的劃分和限制;二是結(jié)合業(yè)務(wù)特性的自動(dòng)化方案。這里暫時(shí)介紹利用k8s原生能力進(jìn)行資源的劃分和限制。

1、 如何資源劃分和限制

設(shè)想,你是個(gè)集群管理員,現(xiàn)在有4個(gè)業(yè)務(wù)部門使用同一個(gè)集群,你的責(zé)任是保證業(yè)務(wù)穩(wěn)定性的前提下,讓業(yè)務(wù)真正做到資源的按需使用。為了有效提升集群整體的資源利用率,這時(shí)就需要限制各業(yè)務(wù)使用資源的上限,以及通過一些默認(rèn)值防止業(yè)務(wù)過量使用。

理想情況下,業(yè)務(wù)應(yīng)該根據(jù)實(shí)際情況,設(shè)置合理的 Request 和 Limit。(Request 用于對資源的占位,表示容器至少可以獲得的資源;Limit 用于對資源的限制,表示容器至多可以獲得的資源。)這樣更利于容器的健康運(yùn)行、資源的充分使用。但實(shí)際上用戶經(jīng)常忘記設(shè)置容器對資源的 Request 和 Limit。此外,對于共享使用一個(gè)集群的團(tuán)隊(duì)/項(xiàng)目來說,他們通常都將自己容器的 Request 和 Limit 設(shè)置得很高以保證自己服務(wù)的穩(wěn)定性。

為了更細(xì)粒度的劃分和管理資源,可以設(shè)置命名空間級別的 Resource Quota 以及 Limit Ranges。

2、 使用 Resource Quota 劃分資源

如果你管理的某個(gè)集群有4個(gè)業(yè)務(wù),為了實(shí)現(xiàn)業(yè)務(wù)間的隔離和資源的限制,你可以使用命名空間和 Resource Quota。

Resource Quota 用于設(shè)置命名空間資源的使用配額,命名空間是 Kubernetes 集群里面的一個(gè)隔離分區(qū),一個(gè)集群里面通常包含多個(gè)命名空間,例如 Kubernetes 用戶通常會將不同的業(yè)務(wù)放在不同的命名空間里,你可以為不同的命名空間設(shè)置不同的 Resource Quota,以限制一個(gè)命名空間對集群整體資源的使用量,達(dá)到預(yù)分配和限制的效果。Resource Quota 主要作用于如下方面,具體可查看(https://kubernetes.io/docs/concepts/policy/resource-quotas/)。

  • 計(jì)算資源:所有容器對 CPU 和 內(nèi)存的 Request 以及 Limit 的總和。

  • 存儲資源:所有 PVC 的存儲資源請求總和。

  • 對象數(shù)量:PVC/Service/Configmap/Deployment等資源對象數(shù)量的總和。

Resource Quota 使用場景

  • 給不同的項(xiàng)目/團(tuán)隊(duì)/業(yè)務(wù)分配不同的命名空間,通過設(shè)置每個(gè)命名空間資源的 Resource Quota 以達(dá)到資源分配的目的。

  • 設(shè)置一個(gè)命名空間的資源使用數(shù)量的上限以提高集群的穩(wěn)定性,防止一個(gè)命名空間對資源的過度侵占和消耗。

這里提供一個(gè)腳本,來為集群各命名空間設(shè)置初始的Resource Quota。

「說明」:該腳本借助kubectl-view-allocations 插件獲取集群各個(gè)命名空間當(dāng)前所有pod所設(shè)置的request和limit總和,然后在此基礎(chǔ)之上上浮30%用于設(shè)置命名空間的request和limit Resource Quota。

后續(xù)可通過集群具體情況,調(diào)整對應(yīng)配置。

使用說明:

復(fù)制
wget https://my-repo-1255440668.cos.ap-chengdu.myqcloud.com/ops/ResourceQuota-install.tar.gztar -xvf ResourceQuota-install.tar.gzcd ResourceQuota-install && bash install.sh1.2.3.

執(zhí)行完之后,會在當(dāng)前目錄生成一個(gè)resourceQuota目錄和limitrange目錄,里面包含各個(gè)命名空間的ResourceQuota.yaml文件,便于后續(xù)根據(jù)集群實(shí)際情況,進(jìn)行對應(yīng)調(diào)整,調(diào)整之后再根據(jù)需要進(jìn)行apply。

編輯搜圖

【注意】:如果命名空間request和limit總和超過了所設(shè)置的resourceQuota,那么將無法新建pod,而且設(shè)置了resourceQuota后,pod必須配置“l(fā)imits.cpu,limits.memory,requests.cpu,requests.memory”,否則也無法正常部署,查看event會提示如下報(bào)錯(cuò):

編輯搜圖

同時(shí)可通過監(jiān)控查看該ns的的資源使用情況是否合理,調(diào)整原有各pod的request和limit,以及根據(jù)情況調(diào)整所設(shè)置的resourceQuota。

CI配置reques和limit的方式如下:

yaml渲染配置如下(其中resources字段):

【推薦配置】:

java服務(wù):request和limit配置同樣的值。

golang/python服務(wù):request和limit配置為1:2。

復(fù)制
#推薦配置:#java服務(wù):request和limit配置同樣的值#golang/python服務(wù):request和limit配置為1:2resources:  cpu: 500/1000m
  memory: 500/1000Mi1.2.3.4.5.6.

3、 使用 Limit Ranges 限制資源

用戶經(jīng)常忘記設(shè)置資源的 Request 和 Limit,或者將值設(shè)置得很大怎么辦?作為管理員,如果可以為不同的業(yè)務(wù)設(shè)置不同資源使用默認(rèn)值以及范圍,可以有效減少業(yè)務(wù)創(chuàng)建時(shí)的工作量同時(shí),限制業(yè)務(wù)對資源的過度侵占。

與 Resource Quota 對命名空間整體的資源限制不同,Limit Ranges 適用于一個(gè)命名空間下的單個(gè)容器。可以防止用戶在命名空間內(nèi)創(chuàng)建對資源申請過小或過大容器,防止用戶忘記設(shè)置容器的 Request 和 Limit。Limit Ranges 主要作用于如下方面,具體可查看(https://kubernetes.io/zh/docs/concepts/policy/resource-quotas/)。

  1. 計(jì)算資源:對所有容器設(shè)置 CPU 和內(nèi)存使用量的范圍。

  2. 存儲資源:對所有 PVC 能申請的存儲空間的范圍。

  3. 比例設(shè)置:控制一種資源 Request 和 Limit 之間比例。

  4. 默認(rèn)值:對所有容器設(shè)置默認(rèn)的 Request/Limit,如果容器未指定自己的內(nèi)存請求和限制,將為它指定默認(rèn)的內(nèi)存請求和限制。

Limit Ranges 使用場景

設(shè)置資源使用默認(rèn)值,以防用戶遺忘,也可以避免 QoS 驅(qū)逐重要的 Pod。

不同的業(yè)務(wù)通常運(yùn)行在不同的命名空間里,不同的業(yè)務(wù)通常資源使用情況不同,為不同的命名空間設(shè)置不同的 Request/Limit 可以提升資源利用率。

限制容器對資源使用的上下限,保證容器正常運(yùn)行的情況下,限制其請求過多資源。

4、調(diào)度策略

Kubernetes 調(diào)度機(jī)制是 Kubernetes 原生提供的一種高效優(yōu)雅的資源分配機(jī)制,它的核心功能是為每個(gè) Pod 找到最適合它的節(jié)點(diǎn),通過合理利用 Kubernetes 提供的調(diào)度能力,根據(jù)業(yè)務(wù)特性配置合理的調(diào)度策略,也能有效提高集群中的資源利用率。

4.1 節(jié)點(diǎn)親和性

說明

倘若你的某個(gè)業(yè)務(wù)是 CPU 密集型,不小心被 Kubernetes 的調(diào)度器調(diào)度到內(nèi)存密集型的節(jié)點(diǎn)上,導(dǎo)致內(nèi)存密集型的 CPU 被占滿,但內(nèi)存幾乎沒怎么用,會造成較大的資源浪費(fèi)。如果你能為節(jié)點(diǎn)設(shè)置一個(gè)標(biāo)記,表明這是一個(gè) CPU 密集型的節(jié)點(diǎn),然后在創(chuàng)建業(yè)務(wù)負(fù)載時(shí)也設(shè)置一個(gè)標(biāo)記,表明這個(gè)負(fù)載是一個(gè) CPU 密集型的負(fù)載,Kubernetes 的調(diào)度器會將這個(gè)負(fù)載調(diào)度到 CPU 密集型的節(jié)點(diǎn)上,這種尋找最合適的節(jié)點(diǎn)的方式,將有效提升資源利用率。

創(chuàng)建 Pod 時(shí),可以設(shè)置節(jié)點(diǎn)親和性,即指定 Pod 想要調(diào)度到哪些節(jié)點(diǎn)上(這些節(jié)點(diǎn)是通過 K8s Label)來指定的。

節(jié)點(diǎn)親和性使用場景

節(jié)點(diǎn)親和性非常適合在一個(gè)集群中有不同資源需求的工作負(fù)載同時(shí)運(yùn)行的場景。比如說,k8s集群節(jié)點(diǎn)有 CPU 密集型的機(jī)器,也有內(nèi)存密集型的機(jī)器。如果某些業(yè)務(wù)對 CPU 的需求遠(yuǎn)大于內(nèi)存,此時(shí)使用普通的 節(jié)點(diǎn) 機(jī)器,勢必會對內(nèi)存造成較大浪費(fèi)。此時(shí)可以在集群里添加一批 CPU 密集型的 節(jié)點(diǎn),并且把這些對 CPU 有較高需求的 Pod 調(diào)度到這些 節(jié)點(diǎn)上,這樣可以提升 節(jié)點(diǎn) 資源的整體利用率。同理,還可以在集群中管理異構(gòu)節(jié)點(diǎn)(比如 GPU 機(jī)器),在需要 GPU 資源的工作負(fù)載中指定需要GPU資源的量,調(diào)度機(jī)制則會幫助你尋找合適的節(jié)點(diǎn)去運(yùn)行這些工作負(fù)載。

4.2 Taints和Tolerations(污點(diǎn)和容忍)

說明

我們說到的的NodeAffinity節(jié)點(diǎn)親和性,是在pod上定義的一種屬性,使得Pod能夠被調(diào)度到某些node上運(yùn)行。Taint剛好相反,它讓Node拒絕Pod的運(yùn)行。

Taint需要與Toleration配合使用,讓pod避開那些不合適的node。在node上設(shè)置一個(gè)或多個(gè)Taint后,除非pod明確聲明能夠容忍這些“污點(diǎn)”,否則無法在這些node上運(yùn)行。Toleration是pod的屬性,讓pod能夠(注意,只是能夠,而非必須)運(yùn)行在標(biāo)注了Taint的node上。

創(chuàng)建 Pod 時(shí),可以通過設(shè)置Taints和Tolerations,來讓某些node只允許某些特定的pod。

Taints和Tolerations場景

節(jié)點(diǎn)獨(dú)占

如果想要拿出一部分節(jié)點(diǎn),專門給特定的應(yīng)用使用,則可以為節(jié)點(diǎn)添加這樣的Taint:

復(fù)制
kubectl taint nodes nodename dedicated=groupName:NoSchedule1.

然后給這些應(yīng)用的pod加入相應(yīng)的toleration,則帶有合適toleration的pod就會被允許同使用其他節(jié)點(diǎn) 一樣使用有taint的節(jié)點(diǎn)。然后再將這些node打上指定的標(biāo)簽,再通過nodeSelector或者親和性調(diào)度的方式,要求這些pod必須運(yùn)行在指定標(biāo)簽的節(jié)點(diǎn)上。

具有特殊硬件設(shè)備的節(jié)點(diǎn)

在集群里,可能有一小部分節(jié)點(diǎn)安裝了特殊的硬件設(shè)備,比如GPU芯片。用戶自然會希望把不需要占用這類硬件的pod排除在外。以確保對這類硬件有需求的pod能夠順利調(diào)度到這些節(jié)點(diǎn)上。可以使用下面的命令為節(jié)點(diǎn)設(shè)置taint:

復(fù)制
kubectl taint nodes nodename special=true:NoSchedulekubectl taint nodes nodename special=true:PreferNoSchedule1.2.

然后在pod中利用對應(yīng)的toleration來保障特定的pod能夠使用特定的硬件。然后同樣的,我們也可以使用標(biāo)簽或者其他的一些特征來判斷這些pod,將其調(diào)度到這些特定硬件的服務(wù)器上。

應(yīng)對節(jié)點(diǎn)故障

在節(jié)點(diǎn)故障時(shí),可以通過TaintBasedEvictions功能自動(dòng)將節(jié)點(diǎn)設(shè)置Taint,然后將pod驅(qū)逐。但是在一些場景下,比如說網(wǎng)絡(luò)故障造成的master與node失聯(lián),而這個(gè)node上運(yùn)行了很多本地狀態(tài)的應(yīng)用即使網(wǎng)絡(luò)故障,也仍然希望能夠持續(xù)在該節(jié)點(diǎn)上運(yùn)行,期望網(wǎng)絡(luò)能夠快速恢復(fù),從而避免從這個(gè)node上被驅(qū)逐。Pod的Toleration可以這樣定義:

復(fù)制
tolerations:- key: "node.alpha.kubernetes.io/unreachable"
  operator: "Exists"
  effect: "NoExecute"
  tolerationSeconds: 60001.2.3.4.5.

K8s集群穩(wěn)定性提升手段,有很多,提升資源利用率只是某一種,后續(xù)還會繼續(xù)輸出其他手段的應(yīng)用。