如何使用 Kubernetes 资源配额

资源配额通过控制应用程序可以消耗多少 CPU 或内存来防止资源争用和“圈地运动”。
84 位读者喜欢这篇文章。
Secret ingredient in open source

Opensource.com

当有人提到他们需要管理 Kubernetes 计算资源,尤其是 CPU 和内存时,“控制”这个词就会浮现在脑海中。这些对话通常发生在 Kubernetes 平台部署一段时间后,开发人员广泛使用集群时。而且大多数时候,这个话题是在问题发生后才出现的。

当 Kubernetes 实施部署时没有考虑到集群的未来增长时,资源问题很常见。问题也可能与部署和管理 Kubernetes 集群的团队的经验水平有关。

如果没有控制,一个失控的应用程序或开发人员可能会扰乱业务。当多个开发人员共享具有固定数量节点的集群时,这种情况会无意中发生。这些资源约束可能会引发开发人员之间的分歧、互相指责以及争夺可用资源。对于集群管理员和开发人员来说,这都是非常糟糕的情况。

有几种方法可以管理应用程序在 Kubernetes 环境中如何利用计算资源。大多数时候,资源配额和限制范围就足够了。请注意,在 Kubernetes 中,存储管理采用了一种不寻常的方法,即使用持久卷插件,在该插件中定义了用于解决和控制不同存储需求的属性。

Kubernetes 资源配额是一种控制计算资源使用方式的方法。本文将向您展示如何使用此功能来管理开发人员的行为并控制应用程序资源消耗。

什么是资源配额?

简而言之,资源配额提供了约束,限制了每个命名空间的资源消耗。它们只能应用于命名空间级别,这意味着它们可以应用于计算资源并限制命名空间内对象的数量。

Kubernetes 资源配额由 ResourceQuota 对象定义。当应用于命名空间时,它可以限制计算资源,例如 CPU 和内存,以及以下对象的创建

  • Pod
  • 服务
  • 密钥
  • 持久卷声明 (PVC)
  • ConfigMap

Kubernetes 支持两种类型的 CPU 和内存配额来管理计算资源。这些通过限制和请求来控制,正如 LimitRange 文档所解释的那样。

简而言之,请求定义了容器的保证 CPU 或内存资源,而限制是容器可以使用的内存或 CPU 阈值,具体取决于其他容器使用情况的可用资源。

下图说明了 Kubernetes 资源配额中请求和限制之间的区别。

以下练习演示了如何使用资源配额来创建约束,以根据定义的阈值将应用程序限制为某些资源。它还展示了实施资源配额以获得对 Kubernetes 实施控制的有用性。

先决条件

在开始之前,请确保您的本地机器上已部署 Kubernetes。以下是我的配置

  • Minikube v1.14.2
  • Fedora 33 操作系统
  • 互联网接入

如果您需要帮助在 Linux 笔记本电脑上部署 Minikube,您可以按照 Bryant Son 的 Minikube 入门指南 中的步骤操作。或者,如果您使用的是 Windows 或 macOS,您可以按照 这些步骤 操作。

设置资源配额

此示例创建 CPU 配额,但内存配额或两者组合的过程类似。

在实际生产场景中,CPU 资源通常是您需要管理以避免资源争用的首要计算资源。当您在服务器(计算)之上运行多个应用程序时,情况确实如此。

首先创建一个新命名空间,您将在其中应用 CPU 配额

$ 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"

使用以下命令将配额应用于您的 Kubernetes 集群

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

使用 kubectl describe 命令验证配额是否已应用

$ 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

注意“已用资源”列;当您部署 Pod 时,此值将更改。

现在您已经定义了配额,请对其进行测试。在此示例中,在同一命名空间中部署三个不同的 Pod,以查看您是否可以根据定义的限制控制资源的使用。这三个 Pod 是

  • PodA: 此 Pod 是第一个实例化的,将使用 50% 的可用 CPU。
  • PodB: 此 Pod 将使用另外 50% 的可用 CPU;它将是第二个实例化的 Pod。
  • PodC: 定义的配额应阻止部署此第三个 Pod。

现在您了解了场景,请部署 Pod。

部署 Pod

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

通过再次描述配额并注意“已用 CPU”值限制和请求来验证 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,因为配额允许它

$ 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

现在,尝试实例化第三个 Pod,即使您知道 PodA 和 Pod B 已最大化您定义的 CPU 配额阈值

$ 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 将不会实例化,因为定义的配额阻止创建 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

正如本示例所示,正确定义的资源配额是 Kubernetes 管理员可以用来管理开发人员行为的强大工具。

清理

删除您创建的命名空间(在本例中为 quota-test

$ kubectl delete -n quota-test

规划您的配额

有很多方法可以控制用户如何部署应用程序以避免 Kubernetes 集群中的“圈地运动”。对配额、限制范围和其他本机功能进行合理的实施有助于集群的稳定性。

在计算资源上实施资源配额是一个重要的设计决策,您需要仔细考虑,尤其是在部署 Kubernetes 以运行业务关键型企业应用程序时。

在定义配额时,将开发人员纳入您的计划非常重要。由于他们具备应用程序知识,因此他们是估计所需资源的最佳资源。

下一步阅读
标签
ID
Mike Calizo 是 Elastic.co 的首席客户成功经理,专注于政府客户,常驻澳大利亚堪培拉。Mike 认为“数据就是力量”,利用这种力量可以提升组织能力,通过创新实现差异化,并通过成本优化策略提高效率。

评论已关闭。

Creative Commons License本作品根据知识共享署名-相同方式共享 4.0 国际许可协议获得许可。
© . All rights reserved.