我们正在用swag升级FutureStack注册,直到4月30日。条款和条件适用。 现在注册

Kubernetes基础,第1部分:如何使用请求和限制管理集群容量

6分钟阅读

通过格伦王子

这是五部分系列的第一部分Kubernetes基本面。在接下来的几周内再来看看有没有新的零件。

Kubernetes是一个用于自动化容器化应用程序的系统。它管理集群中的节点,您可以定义应用程序的资源需求。了解Kubernetes.管理资源(特别是在高峰时期)对于保持容器平稳运行非常重要。

在这篇文章中,我们将看看Kubernetes如何使用请求和限制来管理CPU和内存。

请求和限制是如何工作的

Kubernetes集群中的每个节点都具有可用于运行容器的已分配的内存(RAM)和计算能力(CPU)。

Kubernetes定义了一个或多个容器到豆荚的逻辑分组。反过来,可以在节点上部署和管理pod。当您创建一个Pod时,您通常指定容器在该Pod中共享的存储和网络。然后,Kubernetes调度器将寻找具有运行Pod所需资源的节点。

为了帮助调度器,我们可以为使用的每个容器指定上下RAM和CPU限制请求限制。这两个关键字使我们能够指定以下内容:

  • 通过在容器上指定请求,我们设置了该容器所需的最小RAM或CPU数量。Kubernetes将把所有容器请求卷成一个总Pod请求。调度器将使用这个总请求来确保Pod可以部署在具有足够资源的节点上。
  • 通过对容器指定限制,我们可以设置容器可以消耗的最大RAM或CPU数量。Kubernetes将这些限制转换为容器服务(例如Docker)来强制执行这些限制。如果容器超过其内存限制,则可能终止并重新启动容器(如果可能的话)。CPU限制不那么严格,通常可以在很长一段时间内超出。

让我们看看请求和限制是如何使用的。

设置CPU请求和限制

CPU上的请求和限制是以CPU单元来度量的。在Kubernetes中,单个CPU单元等于一个虚拟CPU (vCPU)或云提供商的核心,或裸金属处理器上的单个线程。

在某些情况下,一个完整的CPU单元仍然可以被认为是一个容器的大量资源,尤其是当我们讨论微服务时。这就是Kubernetes支持CPU分数的原因。虽然您可以将CPU的分数作为小数输入—例如,0.5个CPU—Kubernetes使用“millicpu”记数法,其中1000 millicpu(或1000 m)等于一个CPU单位。

当我们提交一个CPU单元的请求时,Kubernetes调度器将使用这个值在集群中查找Pod可以运行的节点。例如,如果一个Pod包含单个容器,其CPU请求为1个CPU,调度器将确保它放置这个Pod的节点有1个CPU资源空闲。对于Docker容器,Kubernetes使用CPU份额约束按比例分配CPU。

如果我们指定限制,Kubernetes将尝试设置容器的上限CPU使用率限制。如前所述,这不是一个硬限制,并且根据容器化技术,容器可能或可能不会超过该限制。对于Docker容器,Kubernetes使用CPU时间约束设置CPU占用率的上限。这允许Docker限制容器可以使用的运行时间超过100毫秒的百分比。

下面是一个Pod配置YAML文件的简单示例,其CPU请求为0.5个单元,CPU限制为1.5个单元。

apiVersion: v1种类:Pod元数据:name: cpu-request-limit-example spec: containers:—name: cpu-request-limit-container image: images。例如:requests: cpu: "500m" limits: cpu: "1500m"

该配置定义了一个名为“cpu-request-limit-container”的容器,其中包含参考资料部分中指定的映像限制。在该部分中,我们将指定我们的请求和限制。在本例中,我们要求500 millicpu (CPU单元的0.5或50%),并将容器限制为1500 millicpu (CPU单元的1.5或150%)。

设置内存请求和限制

内存请求和限制以字节为单位进行度量,使用一些标准短代码来指定更大的数量,如Kilobytes (K)或1,000字节、Megabytes (M)或1,000,000字节、Gigabytes (G)或1,000,000,000字节。还有两个版本的快捷方式。例如,Ki(1024字节)、Mi和Gi。与CPU单位不同,内存没有分数,因为最小的单位是字节。

Kubernetes调度器使用内存请求在集群中找到一个有足够内存运行Pod的节点。内存限制的工作方式与CPU限制类似,只是它们的执行方式更为严格。如果容器超过内存限制,它可能会被终止,并可能由于“内存不足”错误而重新启动。

下面的Pod配置YAML文件的简单示例包含256兆字节的内存请求和512兆字节的内存限制。

apiVersion: v1 kind: Pod元数据:name: memory-request-limit-example spec: containers:—name: memory-request-limit-container image: images。示例/app-image资源:requests: memory: "256M" limits: memory: "512M"

该配置定义了一个名为“memory-request-limit-container”的容器,其中包含参考资料部分中指定的图像限制。我们已经指定了256M的内存请求,并将容器限制为512M。

通过名称空间设置限制

如果有几个开发人员或开发团队在同一个大型Kubernetes集群中工作,一个好的实践是设置共同的资源需求,以确保资源不会在无意中被消耗。使用Kubernetes,您可以为团队定义不同的名称空间,并使用资源配额来强制这些名称空间的配额。

例如,您可能有一个Kubernetes集群,它有64个CPU单元和256 gb RAM,分布在8个节点上。您可以创建三个名称空间——每个开发团队一个名称空间——使用10个CPU单位和80gb内存的资源配额。这将允许每个开发团队创建任意数量的pod,并保留一些CPU和内存。

有关为名称空间指定资源配额的更多信息,请参见资源配额部分Kubernetes文档。

监控库伯内特的重要性

在容器和名称空间上设置请求和限制可以很好地确保Kubernetes集群不会耗尽资源。但是,在维护各个服务的运行状况以及集群的总体运行状况方面,监视仍然发挥着重要作用。

当您拥有在Kubernetes pods中运行许多服务的大型集群时,运行状况和错误监视可能会很困难。的New Relic的平台提供了一个简单的方法监视您的Kubernetes集群以及在其中运行的服务。它可以帮助您确保在容器和跨集群设置的请求和限制是适当的。


Kubernetes仪表板提供了关于Kubernetes平台运行状况的概述

很好地理解Kubernetes如何处理CPU和内存资源,并启用配置来管理这些资源,这对于确保Kubernetes集群在任何时候都有足够的容量至关重要。正如我们所看到的,设置CPU和内存请求和限制很容易——现在您知道如何做了。通过添加一层监视,您将大大有助于确保Pods不会争夺集群上的资源。

准备好深入研究Kubernetes监控了吗?查看使用New Relic监控Kubernetes的完整介绍

新Relic是今年的白金赞助商Kubecon + CloudNativeCon虚拟会议11月17日至20日。在白金赞助商大厅的虚拟展台上停下,与我们的开发专家交谈。