天天看點

文檔解讀 | K8S中的Pod和容器配置(三)

預設情況下,pod運作沒有任何CPU和記憶體的限制,這意味着系統中的pod可以盡可能多的消耗CPU和記憶體在pod執行的節點。 

文檔解讀 | K8S中的Pod和容器配置(三)

基于多種原因,使用者可能希望對系統中的單個pod的資源使用量進行限制。

例如:

  1. 叢集中的每個節點都有2GB記憶體。叢集管理者不同意pod需要超過2GB的記憶體,因為這個叢集裡面沒有節點可以支援這個需求。為了預防pod永久不能排程到一個節點上,管理者拒絕超過2GB的pod。
  2. 在一個組織中兩個團體分享一個叢集,分别運作開發和生産工作負載。生産工作負載消耗8G記憶體,但是開發工作負載消耗512MB記憶體。管理者給每一個工作負載建立分離的命名空間,并且給每個命名空間限制。
  3. 使用者可以建立一個資源消耗剛剛低于機器資源容量的pod。可用的剩餘空間太小,但是每個節點都是如此對于整個叢集是很昂貴的浪費。是以,叢集管理者希望設定限制pod必須消耗其平均節點大小至少20%記憶體和CPU,為了提供統一的排程和限制浪費。

這個例子示範如何限制應用于一個Kubernetes命名空間控制每個pod最大/最小資源限制。此外,這個例子示範了在沒有最終使用者指定值的情況下如何将預設資源限制應用于pod。

有關詳細資訊參閱限制範圍文檔。Kubernetes資源模型詳細資訊參考資源。

前提條件

這個例子需要一個運作的Kubernetes叢集。如何建立一個叢集參考Getting Started guides。如果你還沒有準備好,請轉到目錄。

01

第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

– image: gcr.io/google_containers/serve_hostname

name: kubernetes-serve-hostname

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

default Active 12m

總結

叢集管理者想要限制單個容器或pod資源消耗的總計,可以限制每個kubernetes命名空間的允許範圍。在沒有明确任務的情況下,Kubernetes系統能夠應用預設的資源限制和請求,以便限制pod在節點上的資源消耗量。

本文轉移K8S技術社群-

文檔解讀 | K8S中的Pod和容器配置(三)

繼續閱讀