默認(rèn)情況下pod運(yùn)行沒(méi)有任何CPU和內(nèi)存的限制。這意味著系統(tǒng)中的pod可以盡可能多的消耗CPU和內(nèi)存在pod執(zhí)行的節(jié)點(diǎn)。
基于多種原因用戶可能希望對(duì)系統(tǒng)中的單個(gè)pod的資源使用量進(jìn)行限制。
例如:
? 1.集群中的每個(gè)節(jié)點(diǎn)都有2GB內(nèi)存。集群管理員不同意pod需要超過(guò)2GB的內(nèi)存,因?yàn)檫@個(gè)集群里面沒(méi)有節(jié)點(diǎn)可以支持這個(gè)需求。為了預(yù)防pod永久不能調(diào)度到一個(gè)節(jié)點(diǎn)上,管理員拒絕超過(guò)2GB的pod。
? 2.在一個(gè)組織中兩個(gè)團(tuán)體分享一個(gè)集群,分別運(yùn)行開(kāi)發(fā)和生產(chǎn)工作負(fù)載。生產(chǎn)工作負(fù)載消耗8G內(nèi)存,但是開(kāi)發(fā)工作負(fù)載消耗512MB內(nèi)存。管理員給每一個(gè)工作負(fù)載建立分離的命名空間,并且給每個(gè)命名空間限制。
? 3.用戶可以創(chuàng)建一個(gè)資源消耗剛剛低于機(jī)器資源容量的pod??捎玫氖S嗫臻g太小,但是每個(gè)節(jié)點(diǎn)都是如此對(duì)于整個(gè)集群是很昂貴的浪費(fèi)。因此,集群管理員希望設(shè)置限制pod必須消耗其平均節(jié)點(diǎn)大小至少20%內(nèi)存和CPU,為了提供統(tǒng)一的調(diào)度和限制浪費(fèi)。
這個(gè)例子演示如何限制應(yīng)用于一個(gè)Kubernetes命名空間控制每個(gè)pod最大/最小資源限制。此外,這個(gè)例子演示了在沒(méi)有最終用戶指定值的情況下如何將默認(rèn)資源限制應(yīng)用于pod。
有關(guān)詳細(xì)信息參閱限制范圍文檔。Kubernetes資源模型詳細(xì)信息參考資源。
第0步:前提條件
這個(gè)例子需要一個(gè)運(yùn)行的Kubernetes集群。如何建立一個(gè)集群參考Getting Started guides。如果你還沒(méi)有準(zhǔn)備好,請(qǐng)轉(zhuǎn)到<kubernetes>目錄。
第1步: 創(chuàng)建一個(gè)命名空間
這個(gè)例子將在自己的命名空間工作,以演示涉及的概念。
讓我們創(chuàng)建一個(gè)叫l(wèi)imit-example的命名空間:
$ kubectl create namespace limit-example
namespace "limit-example" created
注意 kubectl命令可以打印創(chuàng)建或突變的資源的類型和名稱,然后可以在后續(xù)的命令中使用:
$ kubectl get namespaces
NAME STATUS AGE
default Active 51s
limit-example Active 45s
第2步:應(yīng)用命名空間限制
給我們的命名空間創(chuàng)建一個(gè)簡(jiǎn)單的限制。
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 -
在這種情境下,我們已經(jīng)說(shuō)過(guò):
1.如果指定了最大的資源約束(2 CPU和1G內(nèi)存 在這種情況下),那么必須為所有的容器指定資源限制。嘗試創(chuàng)建pod的時(shí)候,未指定資源限制將導(dǎo)致驗(yàn)證錯(cuò)誤。注意在limits.yaml中設(shè)置了默認(rèn)的限制 (300m CPU 和 200Mi內(nèi)存)。
2.如果指定了最小的資源約束(100m CPU和3Mi內(nèi)存 在這種情況下)那么必須給所有的容器資源指定一個(gè)請(qǐng)求。嘗試創(chuàng)建pod的時(shí)候,未指定請(qǐng)求將導(dǎo)致驗(yàn)證錯(cuò)誤。注意 在limits.yaml給defaultRequest設(shè)置了默認(rèn)的值(200m CPU和100Mi內(nèi)存)。
3.對(duì)于任何pod,所有容器內(nèi)存資源請(qǐng)求必須大于等于6Mi,所有的容器內(nèi)存總和必須小于等于1Gi;所有容器的CPU總和請(qǐng)求必須大于等于200m,所有容器的資源限制必須小于等于2。
第3步:創(chuàng)建點(diǎn)施行
命名空間中列舉的限制,只在集群中的pod創(chuàng)建或更新的時(shí)候施行。如果修改限制為不同的值范圍,將不會(huì)影響以前在命名空間中創(chuàng)建的pod。如果資源(CPU或內(nèi)存)受到限制,那么用戶將會(huì)在創(chuàng)建的時(shí)候收到錯(cuò)誤說(shuō)明。
我們發(fā)布一個(gè)Deployment創(chuàng)建包含一個(gè)容器的pod演示如果將默認(rèn)值應(yīng)用于每一個(gè)pod。
$ kubectl run nginx --image=nginx --replicas=1 --namespace=limit-example
deployment "nginx" created
注意 kubectl run創(chuàng)建一個(gè)Deployment在大于等于1.2版本的Kubernetes集群。如果你是使用的老版本,創(chuàng)建replication controllers代替。如果你想獲取老的行為,使用--generator=run/v1創(chuàng)建replication controllers。詳細(xì)信息參考 kubectl run。Deployment管理1個(gè)包含單獨(dú)容器的pod副本。讓我們看看它管理的pod。首先找到這個(gè)pod的名字:
$ kubectl get pods --namespace=limit-example
NAME READY STATUS RESTARTS AGE
nginx-2040093540-s8vzu 1/1 Running 0 11s
讓我們以yaml的格式打印這個(gè)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容器已經(jīng)占用了命名空間默認(rèn)的CPU和內(nèi)存資源限制和請(qǐng)求。
讓我們創(chuàng)建一個(gè)超過(guò)我們?cè)试S限制的pod,它有一個(gè)容器請(qǐng)求3個(gè)CPU內(nèi)核。
$ 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.]
讓我們創(chuàng)建一個(gè)在允許限制邊界內(nèi)的pod。
$ kubectl create -f docs/admin/limitrange/valid-pod.yaml --namespace=limit-example
pod "valid-pod" created
現(xiàn)在看看這個(gè)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
注意 這個(gè)pod指定了明確的資源限制和請(qǐng)求,所以它沒(méi)有使用命名空間的默認(rèn)值。
注意:在運(yùn)行容器的物理節(jié)點(diǎn)上默認(rèn)Kubernetes設(shè)置中強(qiáng)制執(zhí)行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 ...
第4步:清除
要?jiǎng)h除此示例使用的資源,只需刪除limit-example命名空間。
$ kubectl delete namespace limit-example
namespace "limit-example" deleted
$ kubectl get namespaces
NAME STATUS AGE
default Active 12m
總結(jié)
集群管理員想要限制單個(gè)容器或pod資源消耗的總計(jì),可以限制每個(gè)kubernetes命名空間的允許范圍。在沒(méi)有明確任務(wù)的情況下,Kubernetes系統(tǒng)能夠應(yīng)用默認(rèn)的資源限制和請(qǐng)求,以便限制pod在節(jié)點(diǎn)上的資源消耗量。