輕松快速地調(diào)整Kubernetes的CPU和內(nèi)存
在Kubernetes中分配和管理CPU和內(nèi)存資源可能很棘手,但也很容易。本文,我將向你展示什么是Kubernetes資源和限制以及如何管理它們。

本文的目標(biāo)是簡單–如何幫助你快速調(diào)整項(xiàng)目中的Kubernetes資源信息,主要通過三種方式:
1. 為容器和 Pod 分配CPU和內(nèi)存資源
2. Resources Quota: 限制namespace的資源消耗
3. Limit Ranges:配置默認(rèn)的CPU請求和限制
為容器和 Pod 分配CPU和內(nèi)存資源
下圖,解釋了Kubernetes資源的度量單位,資源狀態(tài)工作流以及如何使用資源限制。

CPU和內(nèi)存單位

Kubernetes 中的一個(gè) cpu 等于:
1 AWS vCPU
1 GCP Core
1 Azure vCore
1 Hyperthread 在帶有超線程的裸機(jī) Intel 處理器上
以下,Deployment使用了內(nèi)存資源和CPU資源的請求和限制
將CPU和內(nèi)存 請求 (request)和內(nèi)存 限制 (limit)分配給一個(gè)容器。
apiVersion: apps/v1kind: Deploymentmetadata:name: aks-applicationspec:replicas: 1selector:matchLabels:app: aks-applicationtemplate:metadata:labels:app: aks-applicationspec:containers:- name: aks-applicationimage: hubname/aks-application-image:1.0.0resources:requests:cpu: 100mmemory: 128Milimits:cpu: 250mmemory: 256Mi
更詳細(xì)的信息和代碼段:
將內(nèi)存資源分配給容器和Pod
將CPU資源分配給容器和Pod
Kubernetes最佳實(shí)踐資源要求和限制
應(yīng)用程序開發(fā)人員在Azure Kubernetes Service(AKS)中管理資源的最佳實(shí)踐
Resources Quota: 限制namespace的資源消耗
資源配額,通過 ResourceQuota 對(duì)象來定義,對(duì)每個(gè)namespace的資源消耗總量提供限制。它可以限制namespace中某種類型的對(duì)象的總數(shù)目上限,也可以限制命令空間中的 Pod 可以使用的計(jì)算資源的總上限。

資源配額的工作方式如下:
不同的團(tuán)隊(duì)可以在不同的namespace下工作,目前這是非約束性的,在未來的版本中可能會(huì)通過 ACL (Access Control List 訪問控制列表) 來實(shí)現(xiàn)強(qiáng)制性約束。
集群管理員可以為每個(gè)namespace創(chuàng)建一個(gè)或多個(gè) ResourceQuota 對(duì)象。
當(dāng)用戶在namespace下創(chuàng)建資源(如 Pod、Service 等)時(shí),Kubernetes 的配額系統(tǒng)會(huì) 跟蹤集群的資源使用情況,以確保使用的資源用量不超過 ResourceQuota 中定義的硬性資源限額。
如果資源創(chuàng)建或者更新請求違反了配額約束,那么該請求會(huì)報(bào)錯(cuò)(HTTP 403 FORBIDDEN), 并在消息中給出有可能違反的約束。
如果namespace下的計(jì)算資源 (如 cpu 和 memory)的配額被啟用,則用戶必須為 這些資源設(shè)定請求值(request)和約束值(limit),否則配額系統(tǒng)將拒絕 Pod 的創(chuàng)建。 提示: 可使用 LimitRanger 準(zhǔn)入控制器來為沒有設(shè)置計(jì)算資源需求的 Pod 設(shè)置默認(rèn)值。
以下,是對(duì)持久卷聲明和namespace資源的配額定義。
apiVersion: v1kind: ResourceQuotametadata:name: backend-storage-quotaspec:hard:persistentvolumeclaims: "2"requests.storage: "1Gi"--apiVersion: v1kind: ResourceQuotametadata:name: backend-namespace-quotaspec:hard:request.cpu: 400mrequest.memory: 9600Milimits.cpu: 1200mlimits.memory: 11600Mi
你可以使用該kubectl apply命令來設(shè)置namespace的配額限制。
kubectl apply -f resource-quota.yaml — namespace backend如何使用配額的詳細(xì)說明,請參考
https://kubernetes.io/docs/concepts/policy/resource-quotas/
Limit Ranges:配置默認(rèn)的CPU請求和限制
如果你的namespace有資源配額,那么默認(rèn)內(nèi)存限制是很有幫助的。

將 LimitRange 添加到namespace,不僅會(huì)限制cpu和內(nèi)存,還會(huì)為存儲(chǔ)請求大小強(qiáng)制設(shè)置最小值和最大值。存儲(chǔ)是通過 PersistentVolumeClaim 來發(fā)起請求的。執(zhí)行限制范圍控制的準(zhǔn)入控制器會(huì)拒絕任何高于或低于管理員所設(shè)閾值的 PVC。
apiVersion: v1kind: LimitRangemetadata:name: backend-limit-rangespec:limits:- default:memory: 110Micpu: 500mdefaultRequest:memory: 20Micpu: 100mtype: Container--apiVersion: v1kind: LimitRangemetadata:name: backend-storage-limitsspec:limits:- type: PersistentVolumeClaimmax:storage: 5Gimin:storage: 2Gi
更詳細(xì)的信息和代碼段。
為namespace配置默認(rèn)的 CPU 請求和限制
限制名稱空間的存儲(chǔ)使用量
Kubernetes中的 Limit Range
工具:管理Kubernetes的CPU和內(nèi)存
Popeye 會(huì)掃描集群中是否存在與配置,資源和網(wǎng)絡(luò)漏洞有關(guān)的問題,并生成有關(guān)所有問題的詳細(xì)報(bào)告。
Goldilocks 掃描Pod中的資源限制,并使用建議的資源創(chuàng)建報(bào)告。
Kube-advisor 來自Azure團(tuán)隊(duì)的工具,可掃描容器中缺少的資源并限制請求。
K9s+benchmark 提供了一個(gè)命令行界面(CLI),使你可以輕松地管理,監(jiān)視甚至對(duì) 你喜歡的終端軟件中的集群進(jìn)行基準(zhǔn)測試
你還可以將這些工具與 Datadog, Grafana + Prometeus,Azure Monitor結(jié)合使用,以改善資源并限制監(jiān)視。
總結(jié)
設(shè)置資源請求:獲取有關(guān)特定應(yīng)用程序/容器的CPU和內(nèi)存使用情況的信息。 設(shè)置資源限制:運(yùn)行負(fù)載測試以檢測高負(fù)載下容器的CPU和內(nèi)存。 監(jiān)視容器的CPU和內(nèi)存使用情況。 監(jiān)視持久卷使用情況。 檢查是否可以使用Limit Range應(yīng)用資源限制 使用配額(不建議在生產(chǎn)環(huán)境中應(yīng)用配額)
文章來源:K8s中文社區(qū)
譯者:王延飛
原文鏈接:http://mtw.so/5Vu4KW
關(guān)注「開源Linux」加星標(biāo),提升IT技能

