kubernetes资源调度之LimitRange

系列目录html

LimitRange从字面意义上来看就是对范围进行限制,其实是对cpu和内存资源使用范围的限制nginx

前面咱们讲到过资源配额,资源配额是对整个名称空间的资源的总限制,是从总体上来限制的,而LimitRange则是对pod和container级别来作限制的api

因为LimitRange是基于名称空间的,所以为了测试,咱们先建立一个名称空间app

kubectl create namespace default-mem-example

建立LimitRange和Pod对象测试

如下配置文件声明了内存的默认限制量和默认请求量spa

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名称空间下建立它code

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

如今,若是有在容器在default-mem-example名称空间下建立,而且在建立的时候没有指定内存申请值和内存限制值,则它会被默认分配256M的内存请求和512M的内存上限htm

下面是一个包含容器的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

下面建立这个podblog

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顾名思义,是一个比率值,它是限制值和请求值的比率.因为资源调度都是基于申请的值,所以可能会出现资源超售状况(固然,可使用配额来限制总的量),这个比率显示了超售的比率.

相关文章
相关标签/搜索