kubernetes資源調度之LimitRange


系列目錄

LimitRange從字面意義上來看就是對范圍進行限制,實際上是對cpu和內存資源使用范圍的限制

前面我們講到過資源配額,資源配額是對整個名稱空間的資源的總限制,是從整體上來限制的,而LimitRange則是對pod和container級別來做限制的

由於LimitRange是基於名稱空間的,因此為了測試,我們先創建一個名稱空間

kubectl create namespace default-mem-example

創建LimitRange和Pod對象

以下配置文件聲明了內存的默認限制量和默認請求量

admin/resource/memory-defaults.yaml 

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

在default-mem-example名稱空間下創建它

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults.yaml --namespace=default-mem-example

現在,如果有在容器在default-mem-example名稱空間下創建,並且在創建的時候沒有指定內存申請值和內存限制值,則它會被默認分配256M的內存請求和512M的內存上限

下面是一個包含容器的pod的配置.容器沒有顯式聲明資源申請和內存限制

admin/resource/memory-defaults-pod.yaml 

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo-ctr
    image: nginx

下面創建這個pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod.yaml --namespace=default-mem-example

查看這個pod的詳細信息

kubectl get pod default-mem-demo --output=yaml --namespace=default-mem-example
containers:
- image: nginx
  imagePullPolicy: Always
  name: default-mem-demo-ctr
  resources:
    limits:
      memory: 512Mi
    requests:
      memory: 256Mi

以上輸出信息顯示pod的容器包含了一個256M的內存申請和一個512M的內存限制.它們是LimitRange里聲明的默認值

僅指定限制,沒指定申請

下面是一個pod的其中一個容器的聲明文件,它聲明了內存限制,但是沒有內存申請

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-2
spec:
  containers:
  - name: default-mem-demo-2-ctr
    image: nginx
    resources:
      limits:
        memory: "1Gi"

創建它

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-2.yaml --namespace=default-mem-example

查看信息

kubectl get pod default-mem-demo-2 --output=yaml --namespace=default-mem-example
resources:
  limits:
    memory: 1Gi
  requests:
    memory: 1Gi

可以看到容器的內存申請值和限制值是一樣的.需要注意它並不是LimitRange里的默認值256M

僅聲明了申請,沒有聲明限制

下面是一個包含一個容器的pod聲明,容器只申請了資源,沒有限制

apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo-3
spec:
  containers:
  - name: default-mem-demo-3-ctr
    image: nginx
    resources:
      requests:
        memory: "128Mi"

創建pod

kubectl apply -f https://k8s.io/examples/admin/resource/memory-defaults-pod-3.yaml --namespace=default-mem-example

查看信息

kubectl get pod default-mem-demo-3 --output=yaml --namespace=default-mem-example
resources:
  limits:
    memory: 512Mi
  requests:
    memory: 128Mi

輸出信息顯示容器的申請值被設置為聲明的值.而限制值被設置成了512M,這是LimitRange的默認設置

設置申請和限制值的動機

如果一個名稱空間包含有資源限額,那么設置申請和限制默認值往往也是有幫助的.以下是資源配額對命名空間施加的兩個限制

  • 在命名空間運行的每一個容器必須有它自己的內存限額(CPU限額)。

  • 在命名空間中所有的容器使用的內存總量(CPU總量)不能超出指定的限額。

完整示例

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
  namespace: example
spec:
  limits:
  - default:  # default limit
      memory: 512Mi
      cpu: 2
    defaultRequest:  # default request
      memory: 256Mi
      cpu: 0.5
    max:  # max limit
      memory: 800Mi
      cpu: 3
    min:  # min request
      memory: 100Mi
      cpu: 0.3
    maxLimitRequestRatio:  # max value for limit / request
      memory: 2
      cpu: 2
    type: Container # limit type, support: Container / Pod / PersistentVolumeClaim
  • default為默認值,即pod不設置的時候的默認值.

  • defaultRequest 默認請求

  • max 請求上限

  • min請求下限

注意默認請求值即為創建pod的時候不指定resource申請時默認賦予的值,默認值即為默認限制的上限.即不指定的時候默認賦予的值.min和max是可以指定的最大值和最小值.並且需要注意的是以上都是Pod級別的.

-maxLimitRequestRatio顧名思義,是一個比率值,它是限制值和請求值的比率.由於資源調度都是基於申請的值,因此可能會出現資源超售情況(當然,可以使用配額來限制總的量),這個比率顯示了超售的比率.


免責聲明!

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



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