利用Kubernetes名稱空間來管理記憶體和CPU資源(一)
女主宣言
眾所周知,Kubernetes是允許指定CPU和RAM的請求和限制的,這一特性對於單獨的pod的資源消耗管理非常有用。在本系列文章中,我們將向大家展示叢集資源的高效管理的三種策略。
PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!
眾所周知,Kubernetes是允許指定CPU和RAM的請求和限制的,這一特性對於單獨的pod的資源消耗管理非常有用。
但是,如果你是Kubernetes叢集管理員,你可能還希望控制叢集中資源的全域性性消耗,並/或配置所有容器的預設資源需求。
值得高興的是,Kubernetes支援名稱空間級別的叢集資源管理。正如你可能已經知道的,Kubernetes的名稱空間提供了名稱和資源配額的範圍,這允許在多個使用者、專案和團隊之間有效地劃分叢集資源。在Kubernetes中,你可以定義預設資源請求和限制、資源約束(最小和最大資源請求和限制),以及在給定名稱空間中執行的所有容器的資源配額。這些特性使得叢集中的應用程式能夠高效地利用資源,並在不同的團隊之間有效地分配資源。例如,使用名稱空間的資源約束允許你控制生產和開發工作負載如何使用資源,從而允許它們消耗有限的叢集資源的公平份額。這可以通過為生產和開發工作負載建立單獨的名稱空間來實現,併為它們分配不同的資源約束。
在本篇文章中,我們將向你展示叢集資源的高效管理的三種策略:
設定預設的資源請求和容器的限制
定義最小和最大的資源約束
為名稱空間中的所有容器設定資源配額
這些策略將幫助你解決各種各樣的用例,利用Kubernetes名稱空間和資源管理的全部功能。
定義名稱空間中容器的預設資源請求和限制
在這個例子中,我們將定義名稱空間中容器的預設請求和限制。這些預設值將被自動應用到不指定其自定義資源請求和限制的容器中。通過這種方式,預設的資源請求和限制可以為名稱空間中的容器施加繫結資源使用策略。
正如你所知,預設的資源請求和限制是在名稱空間級別定義的,因此我們需要建立一個新的名稱空間:
kubectl create namespace default-resources-config namespace "default-resources-config" created
資源請求的預設值和名稱空間的限制必須在 LimitRange 物件中定義。我們選擇使用以下說明:
apiVersion: v1 kind: LimitRange metadata: name: default-requests-and-limits spec: limits: - default: memory: 512Mi cpu: 0.8 defaultRequest: memory: 256Mi cpu: 0.4 type: Container
這個 spec.limits.default 欄位設定預設的資源限制,而 spec.default.defaultrequest 欄位為在我們的名稱空間中執行的容器設定預設的請求。
儲存為 limit-range-1.yaml 檔案並通過以下命令建立 LimitRange:
kubectl create -f limit-range-1.yaml --namespace=default-resources-config limitrange "default-requests-and-limits" created
現在,如果我們在 default-resources-config 名稱空間中建立一個pod,並忽略其容器的記憶體或CPU請求和限制,那麼它將被分配為上面的 LimitRange 定義的預設值。讓我們建立一個 pod 看看它是如何工作的:
apiVersion: v1 kind: Pod metadata: name: default-resources-demo spec: containers: - name: default-resources-cont image: httpd:2.4
儲存為 default-resources-demo-pod.yaml 並在我們的名稱空間中建立一個pod:
kubectl create -f default-resources-demo-pod.yaml --namespace default-resources-config pod "default-resources-demo" created
正如你所看到的,pod中的Apache HTTP伺服器容器沒有資源請求和限制。然而,由於我們已經指定了預設名稱空間資源,所以它們將被自動分配給容器。
kubectl get pod default-resources-demo --output=yaml --namespace=default-resources-config
從下面的輸出中可以看到,預設的資源請求和限制被自動應用到我們的容器中:
containers: - image: httpd:2.4 imagePullPolicy: IfNotPresent name: default-resources-cont resources: limits: cpu: 800m memory: 512Mi requests: cpu: 400m memory: 256Mi
就這麼簡單!
但是,如果我們只指定請求或限制,而不是兩者都指定,會發生什麼呢?讓我們建立一個新的pod,只指定資源限制來檢查以下內容:
apiVersion: v1
kind: Podmetadata: name: default-resources-demo-2
spec: containers: - name: default-resources-cont image: httpd:2.4 resources: limits: memory: "1Gi" cpu: 1
我們儲存為 default-resources-demo-pod-2.yaml 並在我們的名稱空間中建立pod:
kubectl create -f default-resources-demo-pod-2.yaml --namespace default-resources-configpod "default-resources-demo-2" created
現在,檢查分配的容器資源:
kubectl get pod default-resources-demo-2 --output=yaml --namespace default-resources-config
響應應該是:
containers: - image: httpd:2.4 imagePullPolicy: IfNotPresent name: default-resources-cont resources: limits: cpu: "1" memory: 1Gi requests: cpu: "1" memory: 1Gi
如你所見,Kubernetes會自動設定資源請求,以匹配容器指定的限制。請注意,即使容器最初沒有指定資源請求,這些值也會被應用。
接下來,讓我們看看如果指定了記憶體和CPU請求,並省略了資源限制,會發生什麼情況。為第三個pod建立一個規範:
apiVersion: v1
kind: Podmetadata: name: default-resources-demo-3
spec: containers: - name: default-resources-cont image: httpd:2.4 resources: requests: memory: "0.4Gi" cpu: 0.6
我們儲存為 default-resources-demo-pod-3.yaml 並在我們的名稱空間中建立pod:
kubectl create -f default-resources-demo-pod-3.yaml --namespace default-resources-configpod "default-resources-demo-3" created
在建立pod之後,檢查分配的容器資源:
kubectl get pod default-resources-demo-3 --output=yaml --namespace default-resources-config
你應該在終端中獲得以下輸出:
containers: - image: httpd:2.4 imagePullPolicy: IfNotPresent name: default-resources-cont resources: limits: cpu: 800m memory: 512Mi requests: cpu: 600m memory: 429496729600m
如你所見,容器被分配了上面指定的預設限制和資源請求。
注意:如果容器的記憶體和CPU請求大於預設的資源限制,則不會建立pod。
在這個例子完成之後,讓我們清理一下。
刪除名稱空間:
kubectl delete namespace default-resources-confignamespace "default-resources-config" deleted
總結
在本篇文章中,我們將向大家展示了設定預設的資源請求和容器的限制。後續系列文章將會繼續展示:定義最小和最大的資源約束以及為名稱空間中的所有容器設定資源配額。
HULK一線技術雜談
由360雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算、資料庫、大資料、監控、泛前端、自動化測試等眾多技術領域,通過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2216455/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 利用Kubernetes名稱空間來管理記憶體和CPU資源(二)記憶體
- Kubernetes 名稱空間入門
- C++ 動態記憶體分配與名稱空間C++記憶體
- 如何使用 Docker 來限制 CPU、記憶體和 IO等資源?Docker記憶體
- Kubernetes 的層級名稱空間介紹
- 使用p名稱空間和c名稱空間的XML快捷方式XML
- 名稱空間
- Python作用域和名稱空間Python
- Linux使用者空間記憶體管理Linux記憶體
- PHP名稱空間PHP
- PHP 名稱空間PHP
- 20200109 - 名稱空間
- python名稱空間Python
- vuex名稱空間Vue
- OpenCV 名稱空間學習筆記OpenCV筆記
- TP5學習筆記一 名稱空間筆記
- 內聯和巢狀名稱空間巢狀
- docker的資源控制(CPU、記憶體、IO)Docker記憶體
- 15-名稱空間
- Python名稱空間包Python
- 11. 名稱空間
- ts---名稱空間
- C++名稱空間C++
- 深入理解Kubernetes資源限制:記憶體記憶體
- 使用 NGINX 在 Kubernetes 中實現多租戶和名稱空間隔離Nginx
- Python3 名稱空間和作用域Python
- JavaScript之記憶體空間JavaScript記憶體
- Python中名稱空間是什麼?名稱空間生命週期是多久?Python
- ros節點名稱空間ROS
- PHP 核心特性 - 名稱空間PHP
- 3-1 名稱空間
- 什麼是名稱空間?
- JVM記憶體分為3個記憶體空間JVM記憶體
- Linux下檢視CPU型號,記憶體大小,硬碟空間的命令Linux記憶體硬碟
- 為容器指定cpu和記憶體資源(k8s官翻)記憶體K8S
- 對名稱空間的一點個人理解
- TypeScript學習筆記(三)泛型、模組化和名稱空間TypeScript筆記泛型
- 提升CPU等資源的利用率,減少CPU的空轉