利用Kubernetes名稱空間來管理記憶體和CPU資源(一)

HULK一線技術雜談發表於2018-10-15

女主宣言

眾所周知,Kubernetes是允許指定CPU和RAM的請求和限制的,這一特性對於單獨的pod的資源消耗管理非常有用。在本系列文章中,我們將向大家展示叢集資源的高效管理的三種策略。

PS:豐富的一線技術、多元化的表現形式,盡在“HULK一線技術雜談”,點關注哦!

眾所周知,Kubernetes是允許指定CPU和RAM的請求和限制的,這一特性對於單獨的pod的資源消耗管理非常有用。

但是,如果你是Kubernetes叢集管理員,你可能還希望控制叢集中資源的全域性性消耗,並/或配置所有容器的預設資源需求。

值得高興的是,Kubernetes支援名稱空間級別的叢集資源管理。正如你可能已經知道的,Kubernetes的名稱空間提供了名稱和資源配額的範圍,這允許在多個使用者、專案和團隊之間有效地劃分叢集資源。在Kubernetes中,你可以定義預設資源請求和限制、資源約束(最小和最大資源請求和限制),以及在給定名稱空間中執行的所有容器的資源配額。這些特性使得叢集中的應用程式能夠高效地利用資源,並在不同的團隊之間有效地分配資源。例如,使用名稱空間的資源約束允許你控制生產和開發工作負載如何使用資源,從而允許它們消耗有限的叢集資源的公平份額。這可以透過為生產和開發工作負載建立單獨的名稱空間來實現,併為它們分配不同的資源約束。

在本篇文章中,我們將向你展示叢集資源的高效管理的三種策略:

  1. 設定預設的資源請求和容器的限制

  2. 定義最小和最大的資源約束

  3. 為名稱空間中的所有容器設定資源配額

這些策略將幫助你解決各種各樣的用例,利用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雲平臺團隊打造的技術分享公眾號,內容涉及雲端計算資料庫大資料監控泛前端自動化測試等眾多技術領域,透過夯實的技術積累和豐富的一線實戰經驗,為你帶來最有料的技術分享

利用Kubernetes名稱空間來管理記憶體和CPU資源(一)

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31555491/viewspace-2216455/,如需轉載,請註明出處,否則將追究法律責任。

相關文章