Kubernetes K8S之CPU和內存資源限制詳解

 

Kubernetes K8S之CPU和內存資源限制詳解linux

 

Pod資源限制

備註:CPU單位換算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超過 1m。1000m CPU = 1 CPU。api

官網地址:app

1 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/
2 https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/

Kubernetes對資源的限制其實是經過cgroup來控制的,cgroup是容器的一組用來控制內核如何運行進程的相關屬性集合。針對內存、CPU和各類設備都有對應的cgroup。spa

默認狀況下,Pod運行沒有CPU和內存的限額。這意味着系統中的任何Pod將可以像執行Pod所在節點機器同樣,能夠消耗足夠多的CPU和內存。通常會針對某些應用的Pod資源進行資源限制,這個資源限制是經過resources的requests【要分配的資源】和limits【最大使用資源】來實現的code

 

CPU資源限制示例
 1 # cat cpu-request-limit.yaml
 2 apiVersion: v1
 3 kind: Pod
 4 metadata:
 5   name: cpu-demo
 6   namespace: cpu-example
 7 spec:
 8   containers:
 9   - name: cpu-demo-ctr
10     image: vish/stress
11     resources:
12       limits:
13         cpu: "1"
14       requests:
15         cpu: "0.5"
16     args:
17     - -cpus
18     - "2"

配置文件的 args 部分提供了容器啓動時的參數。-cpus 「2」參數告訴容器嘗試使用 2 個 CPU。對象

 

內存資源限制示例
 1 # memory-request-limit.yaml
 2 apiVersion: v1
 3 kind: Pod
 4 metadata:
 5   name: memory-demo
 6   namespace: mem-example
 7 spec:
 8   containers:
 9   - name: memory-demo-ctr
10     image: polinux/stress
11     resources:
12       limits:
13         memory: "200Mi"
14       requests:
15         memory: "100Mi"
16     command: ["stress"]
17     args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]

配置文件的 args 部分提供了容器啓動時的參數。 "--vm-bytes", "150M" 參數告知容器嘗試分配 150 MiB 內存。不容許args中的啓動內存大於limits限制內存blog

 

namespace資源限制

備註:CPU單位換算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超過 1m。1000m CPU = 1 CPU。進程

官網地址:內存

https://kubernetes.io/zh/docs/tasks/administer-cluster/manage-resources/

 

爲命名空間配置內存和 CPU 配額

怎麼爲命名空間設置容器可用的內存和 CPU 總量。你能夠經過 ResourceQuota 對象設置配額,使用 ResourceQuota 限制命名空間中全部容器的內存請求總量、內存限制總量、CPU 請求總量和CPU 限制總量資源

若是你想對單個容器而不是全部容器進行限制,就請使用 LimitRange。

示例:

 1 # cat quota-mem-cpu.yaml
 2 apiVersion: v1
 3 kind: ResourceQuota
 4 metadata:
 5   name: mem-cpu-demo
 6 spec:
 7   hard:
 8     requests.cpu: "1"
 9     requests.memory: 1Gi
10     limits.cpu: "2"
11     limits.memory: 2Gi

 

應用以下【命名空間quota-mem-cpu-example已提早建立完畢】:

kubectl create -f quota-mem-cpu.yaml --namespace=quota-mem-cpu-example

 

查看 ResourceQuota 詳情:

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

 

輸出部分結果以下:

 1 spec:
 2   hard:
 3     limits.cpu: "2"
 4     limits.memory: 2Gi
 5     requests.cpu: "1"
 6     requests.memory: 1Gi
 7 status:
 8   hard:
 9     limits.cpu: "2"
10     limits.memory: 2Gi
11     requests.cpu: "1"
12     requests.memory: 1Gi
13   used:
14     limits.cpu: "0"
15     limits.memory: "0"
16     requests.cpu: "0"
17     requests.memory: "0"

ResourceQuota 在 quota-mem-cpu-example 命名空間中設置了以下要求:

  • 每一個容器必須有內存請求和限制,以及 CPU 請求和限制。
  • 全部容器的內存請求總和不能超過1 GiB。
  • 全部容器的內存限制總和不能超過2 GiB。
  • 全部容器的 CPU 請求總和不能超過1 cpu。
  • 全部容器的 CPU 限制總和不能超過2 cpu。

 

爲命名空間配置默認的內存請求和限制

示例:

 1 # cat memory-defaults.yaml
 2 apiVersion: v1
 3 kind: LimitRange
 4 metadata:
 5   name: mem-limit-range
 6 spec:
 7   limits:
 8   - default:
 9       memory: 512Mi
10     defaultRequest:
11       memory: 256Mi
12     type: Container

default相似於以前的limit;defaultRequest相似於以前的request。

應用以下:

kubectl create -f memory-defaults.yaml --namespace=default-mem-example

命名空間default-mem-example已提早建立完畢

如今,若是在 default-mem-example 命名空間建立容器,而且該容器沒有聲明本身的內存請求和限制值,那麼它將被指定一個默認的內存請求256 MiB和一個默認的內存限制512 Mib。

 

爲命名空間配置默認的CPU請求和限制

示例:

 1 # cpu-defaults.yaml
 2 apiVersion: v1
 3 kind: LimitRange
 4 metadata:
 5   name: cpu-limit-range
 6 spec:
 7   limits:
 8   - default:
 9       cpu: 1
10     defaultRequest:
11       cpu: 0.5
12     type: Container

 

應用以下:

kubectl create -f cpu-defaults.yaml --namespace=default-cpu-example

其中default-cpu-example名稱空間已被提早建立

如今若是在 default-cpu-example 命名空間建立一個容器,該容器沒有聲明本身的 CPU 請求和限制時,那麼將會給它指定默認的 CPU 請求0.5和默認的 CPU 限制值1。

 

配置命名空間的最小和最大內存約束

示例:

 1 # cat memory-constraints.yaml
 2 apiVersion: v1
 3 kind: LimitRange
 4 metadata:
 5   name: mem-min-max-demo-lr
 6 spec:
 7   limits:
 8   - max:
 9       memory: 1Gi
10     min:
11       memory: 500Mi
12     type: Container

 

應用以下:

kubectl create -f memory-constraints.yaml --namespace=constraints-mem-example

 

其中constraints-mem-example名稱空間已被提早建立

查看 LimitRange 的詳情:

kubectl get limitrange mem-min-max-demo-lr --namespace=constraints-mem-example --output=yaml

 

輸出顯示預期的最小和最大內存約束。但請注意,即便您沒有在 LimitRange 的配置文件中指定默認值,默認值也會被自動建立

 1 limits:
 2 - default:
 3     memory: 1Gi
 4   defaultRequest:
 5     memory: 1Gi
 6   max:
 7     memory: 1Gi
 8   min:
 9     memory: 500Mi
10   type: Container

如今,只要在 constraints-mem-example 命名空間中建立容器,Kubernetes 就會執行下面的步驟:

  • 若是 Container 未指定本身的內存請求和限制,將爲它指定默認的內存請求和限制。
  • 驗證 Container 的內存請求是否大於或等於500 MiB【超出範圍容器建立失敗】。
  • 驗證 Container 的內存限制是否小於或等於1 GiB【超出範圍容器建立失敗】。

 

配置命名空間的最小和最大CPU約束

示例:

 1 # cpu-constraints.yaml
 2 apiVersion: v1
 3 kind: LimitRange
 4 metadata:
 5   name: cpu-min-max-demo-lr
 6 spec:
 7   limits:
 8   - max:
 9       cpu: "800m"
10     min:
11       cpu: "200m"
12     type: Container

 

應用以下:

kubectl create -f cpu-constraints.yaml --namespace=constraints-cpu-example

 

其中constraints-cpu-example名稱空間已被提早建立

查看 LimitRange 詳情:

kubectl get limitrange cpu-min-max-demo-lr --output=yaml --namespace=constraints-cpu-example

 

輸出結果顯示 CPU 的最小和最大限制符合預期。但須要注意的是,儘管你在 LimitRange 的配置文件中你沒有聲明默認值,默認值也會被自動建立

 1 limits:
 2 - default:
 3     cpu: 800m
 4   defaultRequest:
 5     cpu: 800m
 6   max:
 7     cpu: 800m
 8   min:
 9     cpu: 200m
10   type: Container

如今無論何時在 constraints-cpu-example 命名空間中建立容器,Kubernetes 都會執行下面這些步驟:

  • 若是容器沒有聲明本身的 CPU 請求和限制,將爲容器指定默認 CPU 請求和限制。
  • 覈查容器聲明的 CPU 請求確保其大於或者等於200 millicpu。
  • 覈查容器聲明的 CPU 限制確保其小於或者等於800 millicpu。

 

配置命名空間下pod總數

示例:

1 # cat quota-pod.yaml
2 apiVersion: v1
3 kind: ResourceQuota
4 metadata:
5   name: pod-demo
6 spec:
7   hard:
8     pods: "2"

 

應用以下【命名空間quota-pod-example已提早建立完畢】:

kubectl apply -f quota-pod.yaml --namespace=quota-pod-example

 

查看資源配額的詳細信息:

kubectl get resourcequota pod-demo --namespace=quota-pod-example --output=yaml

 

從輸出的信息咱們能夠看到,該命名空間下pod的配額是2個,目前建立的pods數爲0,配額使用率爲0。

1 spec:
2   hard:
3     pods: "2"
4 status:
5   hard:
6     pods: "2"
7   used:
8     pods: "0"

 

相關閱讀

一、官網:Pod的CPU資源分配限制

二、官網:Pod的內存資源分配限制

三、官網:管理內存、CPU 和 API 資源

完畢!

 

 


 

———END———
若是以爲不錯就關注下唄 (-^O^-) !

相關文章
相關標籤/搜索