輕鬆快速地調整Kubernetes的CPU和內存

在Kubernetes中分配和管理CPU和內存資源可能很棘手,但也很容易。本文,我將向你展現什麼是Kubernetes資源和限制以及如何管理它們。


本文的目標是簡單–如何幫助你快速調整項目中的Kubernetes資源信息,主要經過三種方式:
一、爲容器和 Pod 分配CPU和內存資源
二、Resources Quota: 限制namespace的資源消耗
三、Limit Ranges:配置默認的CPU請求和限制

爲容器和 Pod 分配CPU和內存資源

下圖,解釋了Kubernetes資源的度量單位,資源狀態工做流以及如何使用資源限制。

CPU和內存單位

Kubernetes 中的一個 cpu 等於:
一、1 AWS vCPU
二、1 GCP Core
三、1 Azure vCore
四、1 Hyperthread 在帶有超線程的裸機 Intel 處理器上
如下,Deployment使用了內存資源和CPU資源的請求和限制
將CPU和內存 請求 (request)和內存 限制 (limit)分配給一個容器。
咱們保障容器擁有它請求數量的內存,但不容許使用超過限制數量的CPU和內存 。
    
    
    
     
     
              
     
     
apiVersion: apps/v1kind: Deploymentmetadata:name: aks-application spec:replicas: 1selector:matchLabels:app: aks-applicationtemplate:metadata:labels:app: aks-applicationspec:containers:- name: aks-applicationimage: hubname/aks-application-image:1.0.0 resources:requests:cpu: 100m memory: 128Milimits:cpu: 250m memory: 256Mi
更詳細的信息和代碼段:
  • 將內存資源分配給容器和Pod
  • 將CPU資源分配給容器和Pod
  • Kubernetes最佳實踐資源要求和限制
  • 應用程序開發人員在Azure Kubernetes Service(AKS)中管理資源的最佳實踐

Resources Quota: 限制namespace的資源消耗

資源配額,經過 ResourceQuota 對象來定義,對每一個namespace的資源消耗總量提供限制。它能夠限制namespace中某種類型的對象的總數目上限,也能夠限制命令空間中的 Pod 可使用的計算資源的總上限。

資源配額的工做方式以下:
一、不一樣的團隊能夠在不一樣的namespace下工做,目前這是非約束性的,在將來的版本中可能會經過 ACL (Access Control List 訪問控制列表) 來實現強制性約束。
二、集羣管理員能夠爲每一個namespace建立一個或多個 ResourceQuota 對象。
三、當用戶在namespace下建立資源(如 Pod、Service 等)時,Kubernetes 的配額系統會 跟蹤集羣的資源使用狀況,以確保使用的資源用量不超過 ResourceQuota 中定義的硬性資源限額。
四、若是資源建立或者更新請求違反了配額約束,那麼該請求會報錯(HTTP 403 FORBIDDEN), 並在消息中給出有可能違反的約束。
五、若是namespace下的計算資源 (如 cpu 和 memory)的配額被啓用,則用戶必須爲 這些資源設定請求值(request)和約束值(limit),不然配額系統將拒絕 Pod 的建立。提示: 可以使用 LimitRanger 准入控制器來爲沒有設置計算資源需求的 Pod 設置默認值。

如下,是對持久卷聲明和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命令來設置namespace的配額限制。
    
    
    
     
     
              
     
     
kubectl apply -f resource-quota.yaml — namespace backend
如何使用配額的詳細說明,請參考
  • https://kubernetes.io/docs/concepts/policy/resource-quotas/

Limit Ranges:配置默認的CPU請求和限制

若是你的namespace有資源配額,那麼默認內存限制是頗有幫助的。


將 LimitRange 添加到namespace,不只會限制cpu和內存,還會爲存儲請求大小強制設置最小值和最大值。存儲是經過 PersistentVolumeClaim 來發起請求的。執行限制範圍控制的准入控制器會拒絕任何高於或低於管理員所設閾值的 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
更詳細的信息和代碼段。
  • 爲namespace配置默認的 CPU 請求和限制
  • 限制名稱空間的存儲使用量
  • Kubernetes中的 Limit Range

工具:管理Kubernetes的CPU和內存

  • Popeye 會掃描集羣中是否存在與配置,資源和網絡漏洞有關的問題,並生成有關全部問題的詳細報告。
  • Goldilocks 掃描Pod中的資源限制,並使用建議的資源建立報告。
  • Kube-advisor 來自Azure團隊的工具,可掃描容器中缺乏的資源並限制請求。
  • K9s+benchmark 提供了一個命令行界面(CLI),使你能夠輕鬆地管理,監視甚至對 你喜歡的終端軟件中的集羣進行基準測試
你還能夠將這些工具與 Datadog, Grafana + Prometeus,Azure Monitor結合使用,以改善資源並限制監視。

總結

  1. 設置資源請求:獲取有關特定應用程序/容器的CPU和內存使用狀況的信息。
  2. 設置資源限制:運行負載測試以檢測高負載下容器的CPU和內存。
  3. 監視容器的CPU和內存使用狀況。
  4. 監視持久卷使用狀況。
  5. 檢查是否可使用Limit Range應用資源限制
  6. 使用配額(不建議在生產環境中應用配額)
文中更詳細代碼片斷,參考連接:
https://www.kubernetes.org.cn/8858.html

END

Kubernetes CKA實戰培訓班推薦


本文分享自微信公衆號 - K8S中文社區(k8schina)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。html

相關文章
相關標籤/搜索