# k8s 为 Namespace 配置 CPU 和内存配额

本任务展示了如何为某一名字空间内运行的所有容器配置 CPU 和内存配额。配额可以通过 ResourceQuota 对象设置。

# 开始之前

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

请确保您集群中的每个节点(node)拥有至少 1GiB 内存。

# 创建名字空间

创建一个单独的名字空间,以便于隔离您在本练习中创建的资源与集群的其他资源。

kubectl create namespace quota-mem-cpu-example

# 创建 ResourceQuota 对象

以下展示了 ResourceQuota 对象的配置文件内容:

quota-mem-cpu.yaml
apiVersion: v1 kind: ResourceQuota metadata: name: mem-cpu-demo spec: hard: requests.cpu: "1" requests.memory: 1Gi limits.cpu: "2" limits.memory: 2Gi

下面,首先创建 ResourceQuota 对象

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

然后可以通过以下命令查看 ResourceQuota 对象的详细信息:

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

以上刚创建的 ResourceQuota 对象将在 quota-mem-cpu-example 名字空间中添加以下限制:

  • 每个容器必须设置内存请求(memory request),内存限额(memory limit),cpu 请求(cpu request)和 cpu 限额(cpu limit)。
  • 所有容器的内存请求总额不得超过 1 GiB。
  • 所有容器的内存限额总额不得超过 2 GiB。
  • 所有容器的 CPU 请求总额不得超过 1 CPU。
  • 所有容器的 CPU 限额总额不得超过 2 CPU。

# 创建一个 Pod

以下展示了一个 Pod 的配置文件内容:

quota-mem-cpu-pod.yaml
apiVersion: v1 kind: Pod metadata: name: quota-mem-cpu-demo spec: containers: - name: quota-mem-cpu-demo-ctr image: nginx resources: limits: memory: "800Mi" cpu: "800m" requests: memory: "600Mi" cpu: "400m"

通过以下命令创建这个 Pod:

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

运行以下命令验证这个 Pod 的容器已经运行:

kubectl get pod quota-mem-cpu-demo --namespace=quota-mem-cpu-example

然后再次查看 ResourceQuota 对象的详细信息:

kubectl get resourcequota mem-cpu-demo --namespace=quota-mem-cpu-example --output=yaml

除了配额本身信息外,上述命令还显示了目前配额中有多少已经被使用。可以看到,刚才创建的 Pod 的内存以及 CPU 的请求和限额并没有超出配额。

status:
  hard:
    limits.cpu: "2"
    limits.memory: 2Gi
    requests.cpu: "1"
    requests.memory: 1Gi
  used:
    limits.cpu: 800m
    limits.memory: 800Mi
    requests.cpu: 400m
    requests.memory: 600Mi

# 尝试创建第二个 Pod

第二个 Pod 的配置文件如下所示:

quota-mem-cpu-pod-2.yaml
apiVersion: v1 kind: Pod metadata: name: quota-mem-cpu-demo-2 spec: containers: - name: quota-mem-cpu-demo-2-ctr image: redis resources: limits: memory: "1Gi" cpu: "800m" requests: memory: "700Mi" cpu: "400m"

在配置文件中,您可以看到第二个 Pod 的内存请求是 700 MiB。可以注意到,如果创建第二个 Pod, 目前的内存使用量加上新的内存请求已经超出了当前名字空间的内存请求配额。即 600 MiB + 700 MiB > 1 GiB。

下面尝试创建第二个 Pod:

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

以下命令输出显示第二个 Pod 并没有创建成功。错误信息说明了如果创建第二个 Pod,内存请求总额将超出名字空间的内存请求配额。

Error from server (Forbidden): error when creating "docs/tasks/administer-cluster/quota-mem-cpu-pod-2.yaml":
pods "quota-mem-cpu-demo-2" is forbidden: exceeded quota: mem-cpu-demo,
requested: requests.memory=700Mi,used: requests.memory=600Mi, limited: requests.memory=1Gi

# 讨论

在本练习中您已经看到,使用 ResourceQuota 可以限制一个名字空间中所运行的所有容器的内存请求总额。 当然,也可以通过 ResourceQuota 限制所有容器的内存限额、CPU 请求以及 CPU 限额。

如果您仅仅想限制单个容器的上述各项指标,而非名字空间中所有容器的,请使用 LimitRange。

# 练习环境的清理

通过删除名字空间即可完成环境清理:

kubectl delete namespace quota-mem-cpu-example
Last Updated: 4/15/2023, 8:33:17 PM