# 限定容器的计算资源

参考文档:Limit Ranges

本文讨论了如何在容器级别创建 LimitRange。假设有一个 Pod 包含 4个容器,每个容器都定义了 spec.resource,此时 LimitRanger 管理控制器在处理该 Pod 中的 4个容器时,处理方式是不一样的。

演示步骤如下:

  • 执行如下命令创建名称空间 limitrange-demo

    kubectl create namespace limitrange-demo
    
    1

    将 kubectl 默认名称空间切换至 limitrange-demo

    kubectl config set-context --current --namespace=limitrange-demo
    
    1
  • 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: Container
    
    1
    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-demo
    
    1

    执行命令查看结果

    kubectl describe limitrange/limit-mem-cpu-per-container -n limitrange-demo
    
    1

    输出结果如下所示

    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.yaml
    
    1

# 容器包含有效的 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
  • busybox Pod 中的容器 busybox-cnt01 定义了 requests.cpu=100mrequests.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
  • busybox Pod 中的容器 busybox-cnt02 定义了 requests.cpu=100mrequests.memory=100Mi,且为指定 CPU/内存的最大限定
  • 由于容器没有定义 limits,则名称空间的 LimitRange 定义的 limits.cpu=700milimits.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
  • busybox Pod 中的容器 busybox-cnt03 定义了 limits.cpu=500mlimits.memory=200Mi,且没有指定 CPU/内存的 requests
  • 由于容器没有定义 requests,名称空间中 LimitRange 定义的 defaultRequest 并没有注入到容器的 request 字段,反而,容器定义的 limits 被设置到了其 requests 字段: limits.cpu=500mlimits.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
  • busybox Pod 中的容器 busybox-cnt04 既没有定义 request,也没有定义 limits
  • 由于容器没有定义 limits,则名称空间的 LimitRange 定义的 limits.cpu=700milimits.memory=900Mi 被注入到该容器
  • 由于容器没有定义 requests,则名称空间的 LimitRange 定义的 requests.cpu=110mrequests.memory=110Mi 被注入到该容器
  • 100m <= 700m <= 800m 容器的 cpu 最大限定(700m)在名称空间 LimitRange 指定的范围内
  • 99Mi <= 900Mi <= 1Gi 容器的内存 limit(900Mi)在名称空间 LimitRange 指定的范围内
  • 没有为CPU/内存指定 request/limit 比例
  • 此时容器的定义是有效的,将被创建

Pod busybox 中所有的容器都通过了名称空间的 LimitRange 检查,此 Pod 将被创建