# 限定容器的计算资源
本文讨论了如何在容器级别创建 LimitRange。假设有一个 Pod 包含 4个容器,每个容器都定义了 spec.resource,此时 LimitRanger 管理控制器在处理该 Pod 中的 4个容器时,处理方式是不一样的。
演示步骤如下:
- 执行如下命令创建名称空间 - limitrange-demo- kubectl create namespace limitrange-demo1- 将 kubectl 默认名称空间切换至 - limitrange-demo- kubectl config set-context --current --namespace=limitrange-demo1
- LimitRange 对象的 yaml 文件如下所示: - apiVersion: v1 kind: LimitRange metadata: name: limit-mem-cpu-per-container spec: limits: - max: cpu: "800m" memory: "1Gi" min: cpu: "100m" memory: "99Mi" default: cpu: "700m" memory: "900Mi" defaultRequest: cpu: "110m" memory: "111Mi" type: Container1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19- 该对象为名称空间中的容器定义了: - 最大和最小的CPU/内存
- 默认的 CPU/内存限定
- 默认的 CPU/内存请求
 - 执行命令以创建该对象: - kubectl create -f https://kuboard.cn/statics/learning/policy/lr-container-limit-range.yaml -n limitrange-demo1- 执行命令查看结果 - kubectl describe limitrange/limit-mem-cpu-per-container -n limitrange-demo1- 输出结果如下所示 - Type Resource Min Max Default Request Default Limit Max Limit/Request Ratio ---- -------- --- --- --------------- ------------- ----------------------- Container cpu 100m 800m 110m 700m - Container memory 99Mi 1Gi 111Mi 900Mi -1
 2
 3
 4
- 前面提到的包含 4 个容器的 Pod,其 yaml 文件如下所示: - apiVersion: v1 kind: Pod metadata: name: busybox1 spec: containers: - name: busybox-cnt01 image: busybox command: ["/bin/sh"] args: ["-c", "while true; do echo hello from cnt01; sleep 10;done"] resources: requests: memory: "100Mi" cpu: "100m" limits: memory: "200Mi" cpu: "500m" - name: busybox-cnt02 image: busybox command: ["/bin/sh"] args: ["-c", "while true; do echo hello from cnt02; sleep 10;done"] resources: requests: memory: "100Mi" cpu: "100m" - name: busybox-cnt03 image: busybox command: ["/bin/sh"] args: ["-c", "while true; do echo hello from cnt03; sleep 10;done"] resources: limits: memory: "200Mi" cpu: "500m" - name: busybox-cnt04 image: busybox command: ["/bin/sh"] args: ["-c", "while true; do echo hello from cnt04; sleep 10;done"]1
 2
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37- 执行命令以创建该 Pod - kubectl apply -f https://kuboard.cn/statics/learning/policy/lr-container-pod.yaml1
# 容器包含有效的 CPU/内存的requests/limits
执行以下命令,查看 busybox-cnt01 的配置信息
kubectl get  po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[0].resources"
1
输出结果如下所示
{
  "limits": {
    "cpu": "500m",
    "memory": "200Mi"
  },
  "requests": {
    "cpu": "100m",
    "memory": "100Mi"
  }
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- busyboxPod 中的容器- busybox-cnt01定义了- requests.cpu=100m和- requests.memory=100Mi
- 100m <= 500m <= 800m容器的 cpu limit(500m)在名称空间 LimitRange 指定的范围内
- 99Mi <= 200Mi <= 1Gi容器的内存 limit(200Mi)在名称空间 LimitRange 指定的范围内
- 没有为CPU/内存指定 request/limit 比例
- 此时容器的定义是有效的,将被创建
# 容器包含有效的 CPU/内存requests且没有指定limits
执行以下命令,查看 busybox-cnt02 的配置信息
kubectl get  po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[1].resources"
1
输出结果如下所示
{
  "limits": {
    "cpu": "700m",
    "memory": "900Mi"
  },
  "requests": {
    "cpu": "100m",
    "memory": "100Mi"
  }
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- busyboxPod 中的容器- busybox-cnt02定义了- requests.cpu=100m和- requests.memory=100Mi,且为指定 CPU/内存的最大限定
- 由于容器没有定义 limits,则名称空间的 LimitRange 定义的 limits.cpu=700mi和limits.memory=900Mi被注入到该容器
- 100m <= 700m <= 800m容器的CPU最大限定(700m)在名称空间 LimitRange 指定的范围内
- 99Mi <= 900Mi <= 1Gi容器的内存 limit(900Mi)在名称空间 LimitRange 指定的范围内
- 没有为CPU/内存指定 request/limit 比例
- 此时容器的定义是有效的,将被创建
# 容器包含有效的CPU/内存limits且没有指定requests
执行以下命令,查看 busybox-cnt03 的配置信息
kubectl get  po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[2].resources"
1
输出结果如下所示
{
  "limits": {
    "cpu": "500m",
    "memory": "200Mi"
  },
  "requests": {
    "cpu": "500m",
    "memory": "200Mi"
  }
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- busyboxPod 中的容器- busybox-cnt03定义了- limits.cpu=500m和- limits.memory=200Mi,且没有指定 CPU/内存的- requests
- 由于容器没有定义 requests,名称空间中 LimitRange 定义的defaultRequest并没有注入到容器的request字段,反而,容器定义的limits被设置到了其requests字段:limits.cpu=500m和limits.memory=200Mi
- 100m <= 500m <= 800m容器的 cpu 最大限定(500m)在名称空间 LimitRange 指定的范围内
- 99Mi <= 200Mi <= 1Gi容器的内存最大限定(200Mi)在名称空间 LimitRange 指定的范围内
- 没有为CPU/内存指定 request/limit 比例
- 此时容器的定义是有效的,将被创建
# 容器不包含CPU/内存的requests/limits
执行以下命令,查看 busybox-cnt04 的配置信息
kubectl get  po/busybox1 -n limitrange-demo -o json | jq ".spec.containers[3].resources"
1
输出结果如下所示:
{
  "limits": {
    "cpu": "700m",
    "memory": "900Mi"
  },
  "requests": {
    "cpu": "110m",
    "memory": "111Mi"
  }
}
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
- busyboxPod 中的容器- busybox-cnt04既没有定义 request,也没有定义 limits
- 由于容器没有定义 limits,则名称空间的 LimitRange 定义的 limits.cpu=700mi和limits.memory=900Mi被注入到该容器
- 由于容器没有定义 requests,则名称空间的 LimitRange 定义的 requests.cpu=110m和requests.memory=110Mi被注入到该容器
- 100m <= 700m <= 800m容器的 cpu 最大限定(700m)在名称空间 LimitRange 指定的范围内
- 99Mi <= 900Mi <= 1Gi容器的内存 limit(900Mi)在名称空间 LimitRange 指定的范围内
- 没有为CPU/内存指定 request/limit 比例
- 此时容器的定义是有效的,将被创建
Pod busybox 中所有的容器都通过了名称空间的 LimitRange 检查,此 Pod 将被创建
免费答疑
 微信群
微信扫码 进群发广告者死全家... 

赞赏
微信扫码 

← 概述 限定Pod的计算资源 →
