limitRange:为命名空间配置默认的默认的资源请求和限制 如果在一个有默认资源限制的命名空间创建容器, 该容器没有声明自己的资源限制时,将会被指定默认的资源限制.

LimitRange是在pod和container级别的资源限制

Gk9Ttf.jpg

内存配额

创建命名空间

1
kubectl create ns lr

创建默认内存配额

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
vim mem-lr-demo.yaml


---
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container
1
kubectl apply -f mem-lr-demo.yaml -n lr

测试

创建pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
vim mem-demo.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: default-mem-demo
spec:
  containers:
  - name: default-mem-demo
    image: nginx
1
kubectl apply -f mem-demo.yaml -n lr

查看pod详情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
kubectl get pods -n lr -o yaml

.....
    containers:
    - image: nginx
      imagePullPolicy: Always
      name: default-mem-demo
      resources:
        limits:
          memory: 512Mi
        requests:
          memory: 256Mi
.....

注意:

如果创建容器时仅指定限制,不指定申请。那么容器里的申请值和限制值是一样,而不是LimitRange里的默认值256M。

如果创建容器时仅指定申请,不指定限制时。那么容器里的申请值就是指定的值,而限制值是LimitRange的默认值

内存最大和最小限制

创建命名空间

1
kubectl create ns lr-1

创建LimitRange

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
vim maxmin-lr-demo.yaml

---
apiVersion: v1
kind: LimitRange
metadata:
  name: mem-min-max-demo
spec:
  limits:
  - max:
      memory: 1Gi
    min:
      memory: 500Mi
    type: Container

测试

创建pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
vim maxmin-demo.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: constraints-mem-demo
spec:
  containers:
  - name: constraints-mem-demo
    image: nginx
    resources:
      limits:
        memory: "800Mi"
      requests:
        memory: "600Mi"
1
kubectl apply -f maxmin-demo.yaml -n lr-1

查看pod详情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  kubectl get pods -n lr-1 -o yaml
  
  ......
  containers:
  - image: nginx
    imagePullPolicy: Always
    name: constraints-mem-demo-ctr
    resources:
      limits:
        memory: 800Mi
      requests:
        memory: 600Mi
  ......

注意:创建pod时资源请求值和限制值必须在LimitRange设置的范围内,否则创建pod时会报错。如果创建容器时没有声明请求和限制,它会从LimitRange那里获得默认的请求和限制

CPU配额

创建命名空间

1
kubectl create ns lr-2

创建默认cpu配额

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
vim cpu-lr-demo.yaml

apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-limit-range
spec:
  limits:
  - default:
      cpu: 1
    defaultRequest:
      cpu: 0.5
    type: Container
1
kubectl apply -f vim cpu-lr-demo.yaml -n lr-2

测试

创建pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
vim cpu-demo.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: default-cpu-demo
spec:
  containers:
  - name: default-cpu-demo
    image: nginx
1
kubectl apply -f cpu-demo.yaml -n lr-2

#### 查看pod详情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
kubectl get pods -n lr-1 -o yaml

......
spec:
    containers:
    - image: nginx
      imagePullPolicy: Always
      name: default-cpu-demo
      resources:
        limits:
          cpu: "1"
        requests:
          cpu: 500m
......

注意:

如果创建容器时仅指定限制,不指定申请。那么容器里的申请值和限制值是一样,而不是LimitRange里的默认值0.5cpu。

如果创建容器时仅指定申请,不指定限制时。那么容器里的申请值就是指定的值,而限制值是LimitRange的默认值

CPU的最大和最小限制

创建命名空间

1
kubectl create ns lr-3

创建LimitRange

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
vim cpu-maxmin-lr-demo.yaml

---
apiVersion: v1
kind: LimitRange
metadata:
  name: cpu-min-max-demo-lr
spec:
  limits:
  - max:
      cpu: "800m"
    min:
      cpu: "200m"
    type: Container
1
kubectl apply -f cpu-maxmin-lr-demo.yaml -n lr-3

测试

创建pod

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
vim cpu-maxmin.yaml

---
apiVersion: v1
kind: Pod
metadata:
  name: constraints-cpu-demo
spec:
  containers:
  - name: constraints-cpu-demo-ctr
    image: nginx
    resources:
      limits:
        cpu: "800m"
      requests:
        cpu: "500m"
1
kubectl apply -f cpu-maxmin.yaml -n lr-3

查看pod详情

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
 kubectl get pods -n lr-3 -o yaml
 ......
 containers:
  - image: nginx
    imagePullPolicy: Always
    name: constraints-cpu-demo-ctr
    resources:
      limits:
        cpu: 800m
      requests:
        cpu: 500m
  ......

注意:创建pod时资源请求值和限制值必须在LimitRange设置的范围内,否则创建pod时会报错。如果创建容器时没有声明请求和限制,它会从LimitRange那里获得默认的请求和限制

完整示例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
apiVersion: v1
kind: LimitRange
metadata:
  name: limit-range-demo
spec:
  limits:
  - default:
      memory: 512Mi
      cpu: 1
    defaultRequest:
      memory: 256Mi
      cpu: 0.5
    max:
      memory: 1024Mi
      cpu: 1
    min:
      memory: 128Mi
      cpu: 0.5
    type: Container

说明:

  • default:即该namespace配置resourceQuota时,创建container的默认limit上限
  • defaultRequest:即该namespace配置resourceQuota时,创建container的默认request上限
  • max:即该namespace下创建container的资源最大值
  • min:即该namespace下创建container的资源最小值

其中: min <= defaultRequest <= default <= max

如果指定了 LimitRange 对象的 spec.limits.maxLimitRequestRatio 字段,名称空间中的 Pod/容器的 request 和 limit 都不能为 0,且 limit 除以 request 的结果必须小于或等于 LimitRange 的 spec.limits.maxLimitRequestRatio