利用Kubernetes名稱空間來管理記憶體和CPU資源(二)
女主宣言
眾所周知,Kubernetes是允許指定CPU和RAM的請求和限制的,這一特性對於單獨的pod的資源消耗管理非常有用。在本系列文章中,我們將向大家展示叢集資源的高效管理的三種策略。
但是,如果你是Kubernetes叢集管理員,你可能還希望控制叢集中資源的全域性性消耗,並/或配置所有容器的預設資源需求。
值得高興的是,Kubernetes支援名稱空間級別的叢集資源管理。正如你可能已經知道的,Kubernetes的名稱空間提供了名稱和資源配額的範圍,這允許在多個使用者、專案和團隊之間有效地劃分叢集資源。在Kubernetes中,你可以定義預設資源請求和限制、資源約束(最小和最大資源請求和限制),以及在給定名稱空間中執行的所有容器的資源配額。這些特性使得叢集中的應用程式能夠高效地利用資源,並在不同的團隊之間有效地分配資源。例如,使用名稱空間的資源約束允許你控制生產和開發工作負載如何使用資源,從而允許它們消耗有限的叢集資源的公平份額。這可以透過為生產和開發工作負載建立單獨的名稱空間來實現,併為它們分配不同的資源約束。
在系列文章中,我們將向你展示叢集資源的高效管理的三種策略:
設定預設的資源請求和容器的限制
定義最小和最大的資源約束
為名稱空間中的所有容器設定資源配額
這些策略將幫助你解決各種各樣的用例,利用Kubernetes名稱空間和資源管理的全部功能。
為名稱空間設定最小和最大資源約束
在這個例子中,我們將為名稱空間建立資源約束。這些約束本質上是容器可以在資源請求和限制中使用的最小和最大資源量。讓我們看看它是如何工作的!
與前面的例子一樣,首先建立名稱空間:
kubectl create namespace resource-constraints-demo namespace "resource-constraints-demo" created
接下來,我們將為這個名稱空間建立一個限制範圍:
apiVersion: v1
kind: LimitRange
metadata: name: resource-constraints-lr
spec: limits:
- max:
memory: 1Gi
cpu: 0.8
min:
memory: 500Mi
cpu: 0.3
type: Container
儲存 LimitRange 為 limit-range-2.yaml 並建立它:
kubectl create -f limit-range-2.yaml --namespace resource-constraints-demo
limitrange "resource-constraints-lr" created
在建立了限制範圍之後,讓我們看看我們的最小和最大資源約束是否應用於名稱空間:
kubectl get limitrange resource-constraints-lr --namespace resource-constraints-demo --output=yaml
響應如下:
spec:
limits:
- default:
cpu: 800m
memory: 1Gi
defaultRequest:
cpu: 800m
memory: 1Gi
max:
cpu: 800m
memory: 1Gi
min:
cpu: 300m
memory: 500Mi
type: Container
正如你所看到的,你的名稱空間的預設資源請求和限制被自動設定為在 LimitRange 內指定的最大資源約束。現在,當我們在 resource-constraints-demo 名稱空間中建立容器時,下面的規則將自動應用:
如果容器沒有指定它的資源請求和限制,則應用預設的資源請求和限制。
名稱空間中的所有容器都需要有大於或等於3億的資源請求,用於CPU和500 Mi記憶體。
名稱空間中的所有容器都需要資源限制小於或等於8億,用於CPU和1 Gi記憶體。
讓我們建立一個pod來說明如何將名稱空間資源約束應用到容器中:
apiVersion: v1
kind: Pod
metadata:
name: resource-constraints-pod
spec:
containers:
- name: resource-constraints-ctr
image: httpd:2.4
resources:
limits:
memory: "900Mi"
cpu: 0.7
requests:
memory: "600Mi"
cpu: 0.4
該規範請求600 Mi RAM和0.4 CPU,併為這個pod中的httpd容器設定900 Mi RAM和0.7 CPU的限制。這些資源需求滿足了名稱空間的最小和最大約束。
我們儲存為 default-resources-demo-pod-3.yaml 並在我們的名稱空間中建立pod:
kubectl create -f resource-constraints-pod.yaml --namespace resource-constraints-demo
pod "resource-constraints-pod" created
接下來,檢查分配給pod中的容器的資源:
kubectl get pod resource-constraints-pod --namespace resource-constraints-demo --output=yaml
你應該得到以下輸出:
containers:
- image: httpd:2.4
imagePullPolicy: IfNotPresent
name: resource-constraints-ctr
resources:
limits:
cpu: 700m
memory: 900Mi
requests:
cpu: 400m
memory: 600Mi
之所以成功建立pod,是因為容器的請求和限制在名稱空間的最小和最大約束範圍內。
現在,讓我們看看如果我們指定的請求和限制超出了為名稱空間定義的最小值和最大值,會發生什麼。讓我們用新的請求和限制來建立一個新的pod:
apiVersion: v1
kind: Pod
metadata:
name: resource-constraints-pod-2
spec:
containers:
- name: resource-constraints-ctr-2
image: httpd:2.4
resources:
limits:
memory: "1200Mi"
cpu: 1.2
requests:
memory: "200Mi"
cpu: 0.2
我們儲存為 resource-constraints-pod-2.yaml 並在我們的名稱空間中建立pod:
kubectl create -f resource-constraints-pod-2.yaml --namespace resource-constraints-demo
pod "resource-constraints-pod-2" created
由於資源請求低於最小 LimitRange 的值,並且資源限制超出了這個名稱空間的最大值,所以pod不會像預期的那樣被建立:
Error from server (Forbidden): error when creating "resource-constraints-pod-2.yaml": pods "resource-constraints-pod-2" is forbidden: [minimum memory usage per Container is 500Mi, but request is 200Mi., minimum cpu usage per Container is 300m, but request is 200m., maximum cpu usage per Container is 800m, but limit is 1200m., maximum memory usage per Container is 1Gi, but limit is 1200Mi.]
清理
在這個例子完成之後,讓我們清理一下。
刪除名稱空間:
kubectl delete namespace resource-constraints-demo namespace "resource-constraints-demo" deleted
總結
在本篇文章中,我們將向大家展示了為名稱空間設定最小和最大資源約束。後續系列文章將會繼續展示:為名稱空間中的所有容器設定資源配額。
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,透過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2221142/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用Kubernetes名稱空間來管理記憶體和CPU資源(一)記憶體
- C++ 動態記憶體分配與名稱空間C++記憶體
- Kubernetes 名稱空間入門
- 如何使用 Docker 來限制 CPU、記憶體和 IO等資源?Docker記憶體
- linux記憶體管理--使用者空間和核心空間Linux記憶體
- 名稱空間
- 使用p名稱空間和c名稱空間的XML快捷方式XML
- JAXB名稱空間及名稱空間字首處理
- HTML元件(HTMLCOMPONENTS)之二定義標記和名稱空間(轉)HTML元件
- PHP 名稱空間PHP
- PHP名稱空間PHP
- vuex名稱空間Vue
- jQuery 名稱空間jQuery
- JavaScript 名稱空間JavaScript
- TimesTen臨時(記憶體)空間使用和調整臨時(記憶體)空間記憶體
- OpenCV 名稱空間學習筆記OpenCV筆記
- 【 PHP 學習筆記 】名稱空間PHP筆記
- [ PHP 學習筆記 ] 名稱空間PHP筆記
- php名稱空間namespace使用筆記PHPnamespace筆記
- C#名稱空間、型別的別名管理C#型別
- docker的資源控制(CPU、記憶體、IO)Docker記憶體
- Python作用域和名稱空間Python
- XML和Schema名稱空間詳解XML
- 內聯和巢狀名稱空間巢狀
- 深入理解javascript系列(二):記憶體空間JavaScript記憶體
- Linux使用者空間記憶體管理Linux記憶體
- python名稱空間Python
- C++名稱空間C++
- 更改模型名稱空間模型
- 全域性名稱空間
- C++ 名稱空間C++
- Python 名稱空間Python
- 11. 名稱空間
- ts---名稱空間
- JavaScript之記憶體空間JavaScript記憶體
- PHP 核心特性 - 名稱空間PHP
- Spring名稱空間解析Spring
- 使用名稱空間:基礎