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


Pod資源限制
備注:CPU單位換算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超過 1m。1000m CPU = 1 CPU。

官網地址:

https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-cpu-resource/
https://kubernetes.io/zh/docs/tasks/configure-pod-container/assign-memory-resource/
Kubernetes對資源的限制實際上是通過cgroup來控制的,cgroup是容器的一組用來控制內核如何運行進程的相關屬性集合。針對內存、CPU和各種設備都有對應的cgroup。

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

CPU資源限制示例
# cat cpu-request-limit.yaml
apiVersion: v1
kind: Pod
metadata:
  name: cpu-demo
  namespace: cpu-example
spec:
  containers:
  - name: cpu-demo-ctr
    image: vish/stress
    resources:
      limits:
        cpu: "1"
      requests:
        cpu: "0.5"
    args:
    - -cpus
    - "2"
配置文件的 args 部分提供了容器啟動時的參數。-cpus “2”參數告訴容器嘗試使用 2 個 CPU。

內存資源限制示例
# memory-request-limit.yaml
apiVersion: v1
kind: Pod
metadata:
  name: memory-demo
  namespace: mem-example
spec:
  containers:
  - name: memory-demo-ctr
    image: polinux/stress
    resources:
      limits:
        memory: "200Mi"
      requests:
        memory: "100Mi"
    command: ["stress"]
    args: ["--vm", "1", "--vm-bytes", "150M", "--vm-hang", "1"]
配置文件的 args 部分提供了容器啟動時的參數。 "--vm-bytes", "150M" 參數告知容器嘗試分配 150 MiB 內存。不允許args中的啟動內存大於limits限制內存。

namespace資源限制
備注:CPU單位換算:100m CPU,100 milliCPU 和 0.1 CPU 都相同;精度不能超過 1m。1000m CPU = 1 CPU。

官網地址:

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

為命名空間配置內存和 CPU 配額
怎么為命名空間設置容器可用的內存和 CPU 總量。你可以通過 ResourceQuota 對象設置配額,使用 ResourceQuota 限制命名空間中所有容器的內存請求總量、內存限制總量、CPU 請求總量和CPU 限制總量。

如果你想對單個容器而不是所有容器進行限制,就請使用 LimitRange。

示例:

# cat quota-mem-cpu.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: mem-cpu-demo
spec:
  hard:
    requests.cpu: "1"
    requests.memory: 1Gi
    limits.cpu: "2"
    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
輸出部分結果如下:

spec:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
status:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
  used:
    limits.cpu: "0"
    limits.memory: "0"
    requests.cpu: "0"
    requests.memory: "0"
ResourceQuota 在 quota-mem-cpu-example 命名空間中設置了如下要求:

每個容器必須有內存請求和限制,以及 CPU 請求和限制。
所有容器的內存請求總和不能超過1 GiB。
所有容器的內存限制總和不能超過2 GiB。
所有容器的 CPU 請求總和不能超過1 cpu。
所有容器的 CPU 限制總和不能超過2 cpu。
為命名空間配置默認的內存請求和限制
示例:

# cat memory-defaults.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    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請求和限制
示例:

# cpu-defaults.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container
應用如下:

kubectl create -f cpu-defaults.yaml --namespace=default-cpu-example
其中default-cpu-example名稱空間已被提前創建

現在如果在 default-cpu-example 命名空間創建一個容器,該容器沒有聲明自己的 CPU 請求和限制時,那么將會給它指定默認的 CPU 請求0.5和默認的 CPU 限制值1。

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

# cat memory-constraints.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-min-max-demo-lr
spec:
  limits:
  - max:
      memory: 1Gi
    min:
      memory: 500Mi
    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 的配置文件中指定默認值,默認值也會被自動創建。

limits:
- default:
    memory: 1Gi
  defaultRequest:
    memory: 1Gi
  max:
    memory: 1Gi
  min:
    memory: 500Mi
  type: Container
現在,只要在 constraints-mem-example 命名空間中創建容器,Kubernetes 就會執行下面的步驟:

如果 Container 未指定自己的內存請求和限制,將為它指定默認的內存請求和限制。
驗證 Container 的內存請求是否大於或等於500 MiB【超出范圍容器創建失敗】。
驗證 Container 的內存限制是否小於或等於1 GiB【超出范圍容器創建失敗】。
配置命名空間的最小和最大CPU約束
示例:

# cpu-constraints.yaml
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-min-max-demo-lr
spec:
  limits:
  - max:
      cpu: "800m"
    min:
      cpu: "200m"
    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 的配置文件中你沒有聲明默認值,默認值也會被自動創建。

limits:
- default:
    cpu: 800m
  defaultRequest:
    cpu: 800m
  max:
    cpu: 800m
  min:
    cpu: 200m
  type: Container
現在不管什么時候在 constraints-cpu-example 命名空間中創建容器,Kubernetes 都會執行下面這些步驟:

如果容器沒有聲明自己的 CPU 請求和限制,將為容器指定默認 CPU 請求和限制。
核查容器聲明的 CPU 請求確保其大於或者等於200 millicpu。
核查容器聲明的 CPU 限制確保其小於或者等於800 millicpu。
配置命名空間下pod總數
示例:

# cat quota-pod.yaml
apiVersion: v1
kind: ResourceQuota
metadata:
  name: pod-demo
spec:
  hard:
    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。

spec:
  hard:
    pods: "2"
status:
  hard:
    pods: "2"
  used:
    pods: "0"

 來源:http://www.zhangblog.com/2021/01/04/kubernetes28/


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM