# k8s 在 Namespace 中配置默认的 CPU 请求与限额

本页展示了如何在命名空间中配置默认的 CPU 请求与限额。 一个 k8s 集群能细分为不同的命名空间。如果在一个拥有默认 CPU 限额的命名空间中创建一个容器,则这个容器不需要指定它自己的 CPU 限额,它会被分配这个默认的 CPU 限额值。k8s 在某些条件下才会分配默认的 CPU 请求值,这个将在本主题的后面解释。

# Before you begin

您需要有一个 k8s 集群,并且必须配置 kubectl 命令行工具以与集群通信。如果您还没有集群,可以使用 Minikube 创建一个集群。

# 创建一个命名空间

创建一个命名空间为了使你在本练习中创建的资源与集群的其它部分相隔离。

kubectl create namespace default-cpu-example

# 创建一个 LimitRange 和一个 Pod

以下是一个 LimitRange 对象的配置文件。这个配置中指定了一个默认的 CPU 请求和一个默认的 CPU 限额。

cpu-defaults.yaml
apiVersion: v1 kind: LimitRange metadata: name: cpu-limit-range spec: limits: - default: cpu: 1 defaultRequest: cpu: 0.5 type: Container

在这个 defaule-cpu-example 命名空间中创建这个 LimitRange:

kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-defaults.yaml --namespace=default-cpu-example

现在如果在这个 defaule-cpu-example 命名空间中创建一个容器,则该容器不需要指定它自己的 CPU 请求和 CPU 限额,该容器会被赋予一个默认的 CPU 请求值 0.5 和一个默认的 CPU 限额值 1。

cpu-defaults-pod.yaml
apiVersion: v1 kind: Pod metadata: name: default-cpu-demo spec: containers: - name: default-cpu-demo-ctr image: nginx

创建 Pod

kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-defaults-pod.yaml --namespace=default-cpu-example

查看该 Pod 的配置:

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

输出显示该 Pod 的容器含有一个 CPU 请求值 500m 和一个 CPU 限额值 1。 这些是由 LimitRange 指定的默认值。

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

# 如果你指定了一个容器的限额值,但未指定请求值,会发生什么?

以下是一个含有一个容器的 Pod 的配置文件。该容器指定了一个 CPU 限额,但未指定请求:

cpu-defaults-pod-2.yaml
apiVersion: v1 kind: Pod metadata: name: default-cpu-demo-2 spec: containers: - name: default-cpu-demo-2-ctr image: nginx resources: limits: cpu: "1"

创建该 Pod:

kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-defaults-pod-2.yaml --namespace=default-cpu-example

查看该 Pod 的配置:

kubectl get pod cpu-limit-no-request --output=yaml --namespace=default-cpu-example

输出展示该容器的 CPU 请求值与它的限额值相等。 注意该容器并未被赋予这个默认的 CPU 请求值 0.5。

resources:
  limits:
    cpu: "1"
  requests:
    cpu: "1"

# 如果你指定了一个容器的请求值,未指定限额值,会发生什么?

以下是含有一个容器的 Pod 的配置文件。该容器指定了一个 CPU 请求,但未指定一个限额:

cpu-defaults-pod-3.yaml
apiVersion: v1 kind: Pod metadata: name: default-cpu-demo-3 spec: containers: - name: default-cpu-demo-3-ctr image: nginx resources: requests: cpu: "0.75"

创建该 Pod

kubectl create -f https://k8s.io/docs/tasks/administer-cluster/cpu-defaults-pod-3.yaml --namespace=default-cpu-example

输出显示该容器的 CPU 请求值被设置为该容器配置文件中指定的值。该容器的 CPU 限额设置为 1,这是该命名空间的默认 CPU 的限额值。

resources:
  limits:
    cpu: "1"
  requests:
    cpu: 750m

# 默认 CPU 限额和请求的动机

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

  • 在命名空间运行的每一个容器必须含有它自己的 CPU 限额。
  • 在命名空间中所有容器使用的 CPU 总量不能超出指定的限额。

如果一个容器没有指定它自己的 CPU 限额,它将被赋予默认的限额值,然后它可以在被配额限制的命名空间中运行。

Last Updated: 4/15/2023, 8:33:17 PM