为命名空间配置默认的 CPU 请求和限制

    本章介绍如何为命名空间配置默认的 CPU 请求和限制。

    一个 Kubernetes 集群可被划分为多个命名空间。 如果你在具有默认 CPU 的命名空间内创建一个 Pod,并且这个 Pod 中任何容器都没有声明自己的 CPU 限制, 那么控制面会为容器设定默认的 CPU 限制。

    Kubernetes 在一些特定情况还可以设置默认的 CPU 请求,本文后续章节将会对其进行解释。

    你必须拥有一个 Kubernetes 的集群,同时你的 Kubernetes 集群必须带有 kubectl 命令行工具。 建议在至少有两个节点的集群上运行本教程,且这些节点不作为控制平面主机。 如果你还没有集群,你可以通过 构建一个你自己的集群,或者你可以使用下面任意一个 Kubernetes 工具构建:

    在你的集群里你必须要有创建命名空间的权限。

    如果你还不熟悉 Kubernetes 中 1.0 CPU 的含义, 请阅读 CPU 的含义

    创建命名空间

    创建一个命名空间,以便本练习中创建的资源和集群的其余部分相隔离。

    以下为 LimitRange 的示例清单。 清单中声明了默认 CPU 请求和默认 CPU 限制。

    1. kind: LimitRange
    2. metadata:
    3. name: cpu-limit-range
    4. spec:
    5. limits:
    6. - default:
    7. cpu: 1
    8. defaultRequest:
    9. cpu: 0.5
    10. type: Container

    在命名空间 default-cpu-example 中创建 LimitRange 对象:

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

    以下为只包含一个容器的 Pod 的清单。该容器没有声明 CPU 请求和限制。

    admin/resource/cpu-defaults-pod.yaml

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. spec:
    5. containers:
    6. - name: default-cpu-demo-ctr
    7. image: nginx

    创建 Pod。

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

    查看该 Pod 的声明:

    输出显示该 Pod 的唯一的容器有 500m 的 CPU 请求和 1 cpu 的 CPU 限制。 这些是 LimitRange 声明的默认值。

    1. containers:
    2. - image: nginx
    3. imagePullPolicy: Always
    4. name: default-cpu-demo-ctr
    5. resources:
    6. limits:
    7. cpu: "1"
    8. requests:
    9. cpu: 500m

    你只声明容器的限制,而不声明请求会怎么样?

    以下为只包含一个容器的 Pod 的清单。该容器声明了 CPU 限制,而没有声明 CPU 请求。

    admin/resource/cpu-defaults-pod-2.yaml

    1. apiVersion: v1
    2. kind: Pod
    3. metadata:
    4. name: default-cpu-demo-2
    5. spec:
    6. containers:
    7. - name: default-cpu-demo-2-ctr
    8. image: nginx
    9. resources:
    10. limits:

    创建 Pod

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

    查看你所创建的 Pod 的:

    1. kubectl get pod default-cpu-demo-2 --output=yaml --namespace=default-cpu-example

    输出显示该容器的 CPU 请求和 CPU 限制设置相同。注意该容器没有被指定默认的 CPU 请求值 0.5 cpu

    admin/resource/cpu-defaults-pod-3.yaml

    1. kind: Pod
    2. metadata:
    3. name: default-cpu-demo-3
    4. spec:
    5. containers:
    6. - name: default-cpu-demo-3-ctr
    7. image: nginx
    8. resources:
    9. requests:
    10. cpu: "0.75"

    创建 Pod:

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

    查看你所创建的 Pod 的:

    1. kubectl get pod default-cpu-demo-3 --output=yaml --namespace=default-cpu-example

    输出显示你所创建的 Pod 中,容器的 CPU 请求为 Pod 清单中声明的值。 然而同一容器的 CPU 限制被设置为 1 cpu,此值是该命名空间的默认 CPU 限制值。

    1. resources:
    2. limits:
    3. cpu: "1"
    4. cpu: 750m

    默认 CPU 限制和请求的动机

    如果你的命名空间设置了 CPU , 为 CPU 限制设置一个默认值会很有帮助。 以下是 CPU 资源配额对命名空间的施加的两条限制:

    • 命名空间中运行的每个 Pod 中的容器都必须有 CPU 限制。

    • CPU 限制用来在 Pod 被调度到的节点上执行资源预留。

    预留给命名空间中所有 Pod 使用的 CPU 总量不能超过规定的限制。

    当你添加 LimitRange 时:

    如果该命名空间中的任何 Pod 的容器未指定 CPU 限制, 控制面将默认 CPU 限制应用于该容器, 这样 Pod 可以在受到 CPU ResourceQuota 限制的命名空间中运行。

    接下来

    应用开发者参考