TranslateProject/translated/tech/20201216 How to use Kubernetes resource quotas.md
2021-01-10 15:05:36 +08:00

8.4 KiB
Raw Blame History

Kubernetes resource quota 使用指南

Resource quotas 控制control应用的 CPU 或内存使用情况,防止资源被过量使用resource contention抢占land grabs Jars with food inside on a shelf

当 Kubernetes 集群运行过一段时间或者在被开发者大量使用后,Kubernetes 资源(例如 CPU 和内存)的控制的问题就会显现出来。而在大多情况下只有集群出问题后,我们才会意识到资源控制的重要性。

Kubernetes 部署过程如果没有能充分考虑到将来的扩展性,资源类问题将会非常常见,此类问题与集群的管理和部署团队的经验有关。

如果不加以合理控制,一个暴力的应用或者开发者可能影响到共享该集群的所有业务,大家可以因此相互埋怨、指责并保护性地抢占资源。这对于集群管理和开发人员都是非常难以处理的场景。

在 Kubernetes 环境中控制应用的计算资源使用有多种方式。大部分情况下,我们可以使用 resource quota 和 limit range。注意存储管理不在我们讨论范围之内存储管理可以通过 Persistent Volume 插件,以实现针对不同的存储控制需求。

Resource quota 是一种控制 Kubernetes 计算资源的方法。本文告诉你如何使用 resource quota 来管理开发人员行为并控制应用的资源使用。

什么是 resource quota

resource quotas 通过 ResourceQuota object 来为每个 namespace 设置资源配额,对以下对象类型的 CPU 和内存进行限制

  • Pods
  • Services
  • Secrets
  • Persistent Volume Claims (PVCs)
  • ConfigMaps

Kubernetes 通过 request 和 limit 两个参数对 CPU 和内存进行限制(参考 LimitRange 文档)。前者表示容器最小被保证资源,后者表示容器最大可用资源。实际上最大可用资源还受限于其它容器的实际使用情况。

下一张图片解释 request 和 limit quota 的区别:

Requests and limits in Kubernetes resource quotas

(Michael Calizo, CC BY-SA 4.0)

下面我们就通过一个例子来说明如何设置 resource quota如何在 Kubernetes 的实现进行更好的资源控制。

准备环境

首先你需要一个 Kubernetes 环境。以下是我使用 Kubernetes 环境:

  • Minikube v1.14.2
  • Fedora 33 操作系统
  • 网络访问

如果你想在 Linux 机器上通过 Minikube 搭建 Kubernetes 测试环境,可以参考 Bryant Son Getting started with Minikube 一文。Window 或者 macOS 用户可以参考这篇文章.

设置 resource quota

这里我们仅展示 CPU quota 设置步骤,配置内存 quota 与之类似。

在生产环境中CPU 是最需要被控制的资源,尤其是在多应用的场景下特别需要注意防止某些应用消耗太多 CPU 而影响到其它应用。

首先我们创建一个 namespace

$ kubectl create namespace quota-test
namespace/quota-test created

准备 cpu-quota.yaml 文件,内容如下

apiVersion: v1
kind: ResourceQuota
metadata:
  name: test-cpu-quota
spec:
  hard:
    requests.cpu: "100m"  
    limits.cpu: "200m"

应用 CPU quota 到 Kubernetes 集群:

$ kubectl apply -f cpu-qouta.yaml
resourcequota/test-cpu-quota created

使用 kubectl describe 检查 quota 配置情况:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    0     200m
requests.cpu  0     100m

Used resources 列中显示了当前情况,该列值会随着 pod 的部署而变化。

下面是我们来验证 quota 管理的场景。我们将在 namespace 下部署三个的 pods为它们配置以不同的资源限制如下

  • PodA: 第一个被实例化,使用 50% 可用 CPU 资源
  • PodB: 第二个被实例化,使用其余 50% 可用 CPU 资源
  • PodC: 没有可用 CPU 资源,因此不会被部署

部署 pods

PodA:

$ kubectl create -n quota-test -f- << EOF
apiVersion: v1
kind: Pod
metadata:
  name: poda
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "50m"
      limits:
        cpu: "100m"
  restartPolicy: Never
EOF

部署 PodA 后,再次查看 quota 描述信息中的 Used CPU 信息

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
--------      ----  ----
limits.cpu    100m  200m
requests.cpu  50m   100m

PodB:

$ kubectl create -n quota-test -f- << EOF
apiVersion: v1
kind: Pod
metadata:
  name: podb
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "50m"
      limits:
        cpu: "100m"
  restartPolicy: Never
EOF

再次查看 CPU 资源使用,此时 PodB 启动后 CPU limit 已经达到上限:

$ kubectl describe resourcequota/test-cpu-quota --namespace quota-test
Name:         test-cpu-quota
Namespace:    quota-test
Resource      Used  Hard
\--------      ----  ----
limits.cpu    200m  200m
requests.cpu  100m  100m

PodC:

试着创建 PodC此时 CPU quota 已经被 PodA 和 PodB 用尽:

$ kubectl create -n quota-test -f- << EOF
apiVersion: v1
kind: Pod
metadata:
  name: podc
spec:
  containers:
  - name: quota-test
    image: busybox
    imagePullPolicy: IfNotPresent
    command: ['sh', '-c', 'echo Pod is Running ; sleep 5000']
    resources:
      requests:
        cpu: "5m"
      limits:
        cpu: "10m"
  restartPolicy: Never
EOF

正我们期望,第三个 Pod 无法被启动quota 限制了Pod 的创建:

`Error from server (Forbidden): error when creating "STDIN": pods "podc" is forbidden: exceeded quota: test-cpu-quota, requested: limits.cpu=10m,requests.cpu=5m, used: limits.cpu=200m,requests.cpu=100m, limited: limits.cpu=200m,requests.cpu=100m`

如我们的例子所示,定义合理的 resource quota 限制开发者行为对 Kubernetes 管理十分重要。

清理

删除刚才创建的 namespace quota-test:

$ kubectl delete -n quota-test

规划 resource quota

Kubernetes 中提供多种方式来控制资源的抢占和使用,合理的规划和配置 quota、limit range 等参数对保持集群的稳定性十分必要。

你应该十分谨慎地控制计算资源的 resource quota特别是在商业生产应用环境。

在规划 resource quota 时,开发人员的参与很重要,需要他们预估并给出最合理的资源使用值。


via: https://opensource.com/article/20/12/kubernetes-resource-quotas

作者:Mike Calizo 选题:lujun9972 译者:larryzju 校对:校对者ID

本文由 LCTT 原创编译,Linux中国 荣誉推出