基於多種緣由,用戶可能但願對系統中的單個pod的資源使用量進行限制。nginx
例如:vim
集羣中的每一個節點都有2GB內存。集羣管理員不一樣意pod須要超過2GB的內存,由於這個集羣裏面沒有節點能夠支持這個需求。爲了預防pod永久不能調度到一個節點上,管理員拒絕超過2GB的pod。api
在一個組織中兩個團體分享一個集羣,分別運行開發和生產工做負載。生產工做負載消耗8G內存,可是開發工做負載消耗512MB內存。管理員給每個工做負載創建分離的命名空間,而且給每一個命名空間限制。app
用戶能夠建立一個資源消耗剛剛低於機器資源容量的pod。可用的剩餘空間過小,可是每一個節點都是如此對於整個集羣是很昂貴的浪費。所以,集羣管理員但願設置限制pod必須消耗其平均節點大小至少20%內存和CPU,爲了提供統一的調度和限制浪費。ide
這個例子演示如何限制應用於一個Kubernetes命名空間控制每一個pod最大/最小資源限制。此外,這個例子演示了在沒有最終用戶指定值的狀況下如何將默認資源限制應用於pod。ui
有關詳細信息參閱限制範圍文檔。Kubernetes資源模型詳細信息參考資源。google
前提條件spa
這個例子須要一個運行的Kubernetes集羣。如何創建一個集羣參考Getting Started guides。若是你尚未準備好,請轉到目錄。orm
01server
第1步: 建立一個命名空間
這個例子將在本身的命名空間工做,以演示涉及的概念。
讓咱們建立一個叫limit-example的命名空間:
$ kubectl create namespace limit-example
namespace "limit-example" created
注意 kubectl命令能夠打印建立或突變的資源的類型和名稱,而後能夠在後續的命令中使用:
$ kubectl get namespaces
NAME STATUS AGE
default Active 51s
limit-example Active 45s
02
第2步:應用命名空間限制
給咱們的命名空間建立一個簡單的限制。
kubectl create -f docs/admin/limitrange/limits.yaml --namespace=limit-example
limitrange "mylimits" created
讓咱們看一下給咱們命名空間施加的限制。
$ kubectl describe limits mylimits --namespace=limit-example
Name: mylimits
Namespace: limit-example
Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio
---- -------- --- --- --------------- ------------- -----------------------
Pod cpu 200m 2 - - -
Pod memory 6Mi 1Gi - - -
Container cpu 100m 2 200m 300m -
Container memory 3Mi 1Gi 100Mi 200Mi -
在這種情境下,咱們已經說過:
1.若是指定了最大的資源約束(2 CPU和1G內存 在這種狀況下),那麼必須爲全部的容器指定資源限制。嘗試建立pod的時候,未指定資源限制將致使驗證錯誤。注意在limits.yaml中設置了默認的限制 (300m CPU 和 200Mi內存)。
2.若是指定了最小的資源約束(100m CPU和3Mi內存 在這種狀況下)那麼必須給全部的容器資源指定一個請求。嘗試建立pod的時候,未指定請求將致使驗證錯誤。注意 在limits.yaml給defaultRequest設置了默認的值(200m CPU和100Mi內存)。
3.對於任何pod,全部容器內存資源請求必須大於等於6Mi,全部的容器內存總和必須小於等於1Gi;全部容器的CPU總和請求必須大於等於200m,全部容器的資源限制必須小於等於2。
03
第3步:建立點施行
命名空間中列舉的限制,只在集羣中的pod建立或更新的時候施行。若是修改限制爲不一樣的值範圍,將不會影響之前在命名空間中建立的pod。若是資源(CPU或內存)受到限制,那麼用戶將會在建立的時候收到錯誤說明。
咱們發佈一個Deployment建立包含一個容器的pod演示若是將默認值應用於每個pod。
$ kubectl run nginx --image=nginx --replicas=1 --namespace=limit-example
deployment "nginx" created
注意 kubectl run建立一個Deployment在大於等於1.2版本的Kubernetes集羣。若是你是使用的老版本,建立replication controllers代替。若是你想獲取老的行爲,使用--generator=run/v1建立replication controllers。詳細信息參考 kubectl run。Deployment管理1個包含單獨容器的pod副本。讓咱們看看它管理的pod。首先找到這個pod的名字:
$ kubectl get pods --namespace=limit-example
NAME READY STATUS RESTARTS AGE
nginx-2040093540-s8vzu 1/1 Running 0 11s
讓咱們以yaml的格式打印這個pod的輸出(使用 -o yaml),而後查看resources字段。
注意你的pod名字跟這裏可能不同:
$ kubectl get pods nginx-2040093540-s8vzu --namespace=limit-example -o yaml | grep resources -C 8
resourceVersion: "57"
selfLink: /api/v1/namespaces/limit-example/pods/nginx-2040093540-ivimu
uid: 67b20741-f53b-11e5-b066-64510658e388
spec:
containers:
- image: nginx
imagePullPolicy: Always
name: nginx
resources:
limits:
cpu: 300m
memory: 200Mi
requests:
cpu: 200m
memory: 100Mi
terminationMessagePath: /dev/termination-log
volumeMounts:
注意咱們的nginx容器已經佔用了命名空間默認的CPU和內存資源限制和請求。
讓咱們建立一個超過咱們容許限制的pod,它有一個容器請求3個CPU內核。
$ kubectl create -f docs/admin/limitrange/invalid-pod.yaml --namespace=limit-example
Error from server: error when creating "docs/admin/limitrange/invalid-pod.yaml": Pod "invalid-pod" is forbidden: [Maximum cpu usage per Pod is 2, but limit is 3., Maximum cpu usage per Container is 2, but limit is 3.]
讓咱們建立一個在容許限制邊界內的pod。
$ kubectl create -f docs/admin/limitrange/valid-pod.yaml --namespace=limit-example
pod "valid-pod" created
如今看看這個pod的resources字段。
$ kubectl get pods valid-pod --namespace=limit-example -o yaml | grep -C 6 resources
uid: 3b1bfd7a-f53c-11e5-b066-64510658e388
spec:
containers:
- image: gcr.io/google_containers/serve_hostname
imagePullPolicy: Always
name: kubernetes-serve-hostname
resources:
limits:
cpu: "1"
memory: 512Mi
requests:
cpu: "1"
memory: 512Mi
注意這個pod指定了明確的資源限制和請求,因此它沒有使用命名空間的默認值。
注意:在運行容器的物理節點上默認Kubernetes設置中強制執行CPU資源限制。除非管理員採用如下方式部署kubelet:
$ kubelet --help
Usage of kubelet
....
--cpu-cfs-quota[=true]: Enable CPU CFS quota enforcement for containers that specify CPU limits
$ kubelet --cpu-cfs-quota=false ...
04
第4步:清除
要刪除此示例使用的資源,只需刪除limit-example命名空間。
$ kubectl delete namespace limit-example
namespace "limit-example" deleted
$ kubectl get namespaces
NAME STATUS AGE
default Active 12m
總結
集羣管理員想要限制單個容器或pod資源消耗的總計,能夠限制每一個kubernetes命名空間的容許範圍。在沒有明確任務的狀況下,Kubernetes系統可以應用默認的資源限制和請求,以便限制pod在節點上的資源消耗量。