Kubernetes 配置Pod和容器(四)設(shè)置CPU和Mem限制

默認(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)上的資源消耗量。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容