管理集装箱资源

指定一个,您可以选择指定每个资源的多少容器需要。指定最常见的资源是CPU和内存(RAM);还有其他人。

指定资源时要求对于POD中的容器,调度程序使用此信息来确定要放置POD的节点。当您指定资源时限制对于容器,Kubelet强制执行这些限制,以便不允许运行容器使用比您所设置的限制更多的资源。Kubelet至少还储备了要求专门用于该容器的系统资源的数量。

要求和限制

如果POD正在运行的节点具有足够的资源,则可能(并且允许)用于使用更多资源的容器而不是其要求对于该资源指定。但是,容器不允许使用的不仅仅是其资源限制

例如,如果您设置了记忆请求256 MIB用于容器,并且该容器位于与8Gib内存的节点的POD中,没有其他豆荚,则容器可以尝试使用更多的RAM。

如果你设置了一个记忆该容器的4gib限制,kubelet(和集装箱运行时)强制执行限制。运行时会阻止容器使用的多于配置的资源限制。例如:当容器中的进程尝试消耗多于允许的内存量时,系统内核终止了尝试分配的进程,其中没有内存(OOM)错误。

限制可以实现反应性(系统介入一旦违规)或通过执行(系统防止容器超过超过限制)。不同的运行时间可以具有不同的方法来实现相同的限制。

笔记:如果容器指定其自己的内存限制,但不指定内存请求,则Kubernetes会自动分配与限制匹配的内存请求。同样,如果容器指定其自己的CPU限制,但没有指定CPU请求,则Kubernetes会自动分配与限制匹配的CPU请求。

资源类型

中央处理器记忆每个A.资源类型。资源类型具有基本单元。CPU表示计算处理,并以单位指定kubernetes cpus。内存以字节为单位指定。如果您使用的是Kubernetes v1.14或更新,则可以指定巨额资源。巨大的页面是一个特定于Linux的特征,节点内核分配了远远大于默认页面大小的内存块。

例如,在默认页面大小为4kib的系统上,您可以指定限制,巨大的页面-2MI:80mi。如果集装箱尝试分配超过40个2MIB的巨大页面(总共80个MIB),则该分配失败。

笔记:你不能过度使用巨大的页面 - *资源。这与...不同记忆中央处理器资源。

CPU和记忆集体称为计算资源, 或者资源。计算资源是可衡量的数量,可以请求,分配和消耗。它们与众不同API资源。API资源,如豆荚和服务是否可以通过Kubernetes API服务器读取和修改对象。

POD和容器的资源请求和限制

POD的每个容器都可以指定以下一个或多个:

  • spec.containers []。资源.limits.cpu
  • spec.containers []。资源..limits.memory
  • spec.containers []。资源.limits.hugepages-
  • spec.containers []。resources.Requests.cpu
  • spec.containers []。resources.requests.memory
  • spec.containers []。resources.Requests.hugepages-

虽然只能在各个容器上指定请求和限制,但谈论POD资源请求和限制是方便的。一种POD资源请求/限制对于特定资源类型,是POD中每个容器的该类型的资源请求/限制的总和。

Kubernetes中的资源单位

CPU的含义

测量CPU资源的限制和请求中央处理器单位。在Kubernetes中,一个CPU相当于1 VCPU /核心对于云提供商和1超线程在裸金属英特尔处理器上。

允许分数请求。一个容器spec.containers []。resources.Requests.cpu0.5保证一半的CPU作为要求1 CPU的CPU。表达方式0.1相当于表达式100米,这可以被读为“一百毫林普”。有些人说“一百毫克”,这被认为是同样的意思。具有小数点的请求,如0.1,被转换为100米通过API,精确精细1M不被允许。出于这个原因,表格100米可能是首选。

CPU总是要求作为绝对数量,永不作为相对数量;0.1在单核,双核或48芯机上的CPU是相同的CPU。

记忆的意义

限制和要求记忆以字节为单位测量。您可以使用以下后缀之一表达作为普通整数的内存或作为固定点编号:e,p,t,g,m,k。您还可以使用两个电源:ei,pi,ti,gi,mi,ki。例如,以下表示大致相同的值:

128974848,129E6,129M,123mi

这是一个例子。以下吊舱有两个容器。每个容器都有0.25 CPU和64MIB的请求(226.内存的字节。每个容器的限制为0.5 CPU和128MIB的内存。您可以说POD具有0.5 CPU和128 MIB的内存的请求,并限制为1 CPU和256MIB的内存。

apiersionv1.种类元数据名称前端规格容器-名称应用程序图像图片.my-company.example / app:v4资源要求记忆“64mi”中央处理器“250米”限制记忆“128mi”中央处理器“500米”-名称log-aggregator.图像映像.my-company.example / log-aggregator:v6资源要求记忆“64mi”中央处理器“250米”限制记忆“128mi”中央处理器“500米”

如何安排具有资源请求的POD

创建POD时,Kubernetes Scheduler选择要运行的POD的节点。每个节点都有最大容量,每个资源类型:它可以为POD提供的CPU和内存量。调度器确保,对于每个资源类型,调度容器的资源请求的总和小于节点的容量。注意,尽管节点上的实际内存或CPU资源使用非常低,但如果容量检查失败,调度程序仍然拒绝在节点上放置一个POD。当资源使用后稍后在每日峰值期间,在节点的情况下,这可以防止节点上的资源短缺。

如何运行资源限制的豆荚

当Kubelet启动POD的容器时,它将CPU和内存限制传递给容器运行时。

使用Docker时:

  • spec.containers []。resources.Requests.cpu被转换为其核心值,这可能是分数的,并乘以1024.此数量或2的越大,用作值- 普通股份旗帜在Docker运行命令。

  • spec.containers []。资源.limits.cpu被转换为其初始值并乘以100.结果值是容器可以每100ms使用的CPU时间的总量。在此间隔期间,容器不能使用多于其CPU时间的份额。

    笔记:默认配额期为100ms。CPU配额的最小分辨率为1ms。
  • spec.containers []。资源..limits.memory被转换为整数,并用作值的值- 记忆旗帜在Docker运行命令。

如果容器超过其内存限制,则可能会终止。如果它重新开始,则Kubelet将重新启动它,与任何其他类型的运行时故障一样。

如果容器超出其内存请求,则每当节点从内存中运行时,它可能会被驱逐它的吊舱。

在延长的时间段内可能或可能不允许容器超过其CPU限制。但是,它不会因过度的CPU使用而被杀死。

要确定是否无法调度容器或由于资源限制被杀死,请参阅故障排除部分。

监视计算和内存资源使用情况

POD的资源使用作为POD状态的一部分。

如果是可选的监控工具在群集中可用,然后可以从中检索POD资源使用情况指标API.直接或来自您的监控工具。

当地短暂的存储

特征状态: Kubernetes v1.10β

节点具有本地短暂的存储,由本地连接的可写设备支持,或者有时由RAM备份。“短暂的”意味着没有关于耐用性的长期保证。

PODS使用暂时的本地存储来进行刮擦空间,缓存和日志。Kubelet可以使用当地短暂存储来安装划痕空间来挂载extherdir.进入容器。

Kubelet也使用这种存储来保持节点级容器日志,容器图像和运行容器的可写层。

警告:如果节点发生故障,则其短暂存储中的数据可能会丢失。
您的应用程序无法期望来自本地短暂存储的任何性能SLA(例如磁盘IOPS)。

作为测试功能,Kubernetes允许您跟踪,储备和限制Pod可以消耗的截止日期存储量。

本地短暂存储器配置

Kubernetes支持两种方法可以在节点上配置本地短暂存储器:

在此配置中,您可以放置​​所有不同种类的暂时的本地数据(extherdir.卷,可写入的图层,容器图像,日志)到一个文件系统中。配置kubelet意味着将此文件系统推向Kubernetes(Kubelet)数据的最有效方法。

kubelet也写道节点级容器日志并将这些类似于暂时的本地存储。

kubelet写入配置日志目录中的文件到文件(/ var / log默认);并具有用于其他本地存储数据的基本目录(/ var / lib / kubelet默认)。

通常,两者/ var / lib / kubelet/ var / log在系统根文件系统上,Kubelet设计有那个布局。

您的节点可以具有尽可能多的其他文件系统,而不是用于Kubernetes,如您所相同。

您在节点上有一个文件系统,您正在使用来自运行Pods的截误数据:日志和extherdir.卷。您可以使用此文件系统进行其他数据(例如:与Kubernetes无关的系统日志);它甚至可以是根文件系统。

kubelet也写道节点级容器日志进入第一个文件系统,并将这些类似于暂时的本地存储。

您还使用一个单独的文件系统,由不同的逻辑存储设备备份。在此配置中,您将kubelet放置容器图像层和可写入的目录在该第二文件系统上位于该目录。

第一个文件系统不包含任何图像图层或可写入的图层。

您的节点可以具有尽可能多的其他文件系统,而不是用于Kubernetes,如您所相同。

Kubelet可以测量它使用的本地存储量。它确实提供了:

  • localstorageacapacityisolation特征门已启用(默认情况下该功能),以及
  • 您已使用本地短暂存储的支持配置之一设置节点。

如果您有不同的配置,则Kubelet不适用于暂时本地存储的资源限制。

笔记:kubelet轨道TMPFS.ExpterDir卷作为集装箱内存使用,而不是当地短暂的存储。

设置当地短暂存储器的请求和限制

您可以使用短暂存储用于管理当地短暂存储空间。POD的每个容器都可以指定以下一个或多个:

  • spec.containers []。资源.Limits.ephemeral-resort
  • spec.containers []。Resources.Requests.ephemeral-Ression

限制和要求短暂存储以字节为单位测量。您可以将存储作为普通整数或使用其中一个后缀或作为定点编号使用其中一个:e,p,t,g,m,k。您还可以使用两个等价物:ei,pi,ti,gi,mi,ki。例如,以下表示大致相同的值:

128974848,129E6,129M,123mi

在以下示例中,POD具有两个容器。每个容器都有2Gib的当地短暂存储。每个容器的限制为4Gib的本地短暂存储空间。因此,POD具有4GiB的本地短暂存储,以及8Gib的当地短暂存储器的限制。

apiersionv1.种类元数据名称前端规格容器-名称应用程序图像图片.my-company.example / app:v4资源要求短暂存储“2Gi”限制短暂存储“4Gi”-名称log-aggregator.图像映像.my-company.example / log-aggregator:v6资源要求短暂存储“2Gi”限制短暂存储“4Gi”

如何安排与临时存储请求的豆荚

创建POD时,Kubernetes Scheduler选择要运行的POD的节点。每个节点都有最大数量的本地短暂存储空间,它可以提供豆荚。有关更多信息,请参阅节点分配

调度程序确保计划容器的资源请求的总和小于节点的容量。

短暂存储消耗管理

如果Kubelet管理当地短暂存储作为资源,则Kubelet测量存储使用:

  • extherdir.卷,除外TMPFS.extherdir.
  • 控股节点级日志的目录
  • 可写的容器层

如果POD使用比允许的更短暂的存储器,则Kubelet设置了一种驱动信号,触发豆荚驱逐。

对于集装箱级隔离,如果容器的可写层和日志使用超过其存储限制,则Kubelet标志着驱动的豆荚。

对于POD级别隔离,Kubelet通过求解该豆荚中的容器的限制来解决整体豆荚存储限制。在这种情况下,如果来自所有容器的本地短暂存储的总和以及POD的总和extherdir.卷超出了整体Pod存储限制,然后Kubelet也标志着驱动的豆荚。

警告:

如果kubelet没有测量本地短暂存储器,则不会被驱逐超过其本地存储限制的POD以违反本地存储资源限制。

但是,如果文件系统空间用于可写的容器层,节点级日志或extherdir.卷降低,节点污点本身就像本地储存一样短,这种污染触发任何不具体容忍污染的豆荚。

看到支持配置用于短暂的本地存储。

Kubelet支持测量Pod存储使用的不同方式:

kubelet执行常规,计划检查每个extherdir.卷,容器日志目录和可写的容器层。

扫描测量使用了多少空间。

笔记:

在此模式下,Kubelet不跟踪已删除文件的打开文件描述符。

如果您(或容器)在内部创建文件extherdir.卷,然后打开该文件,然后删除文件仍然打开,然后删除文件的inode留下,直到关闭该文件,但kubelet不会将空格分类为使用。

特征状态: Kubernetes v1.15 [alpha]

项目配额是一个操作系统级别功能,用于管理文件系统上的存储使用。使用Kubernetes,您可以启用项目配额来监控存储使用。确保文件系统支持extherdir.节点上的卷提供项目配额支持。例如,XFS和Ext4FS提供项目配额。

笔记:项目配额允许您监控存储使用;他们不执行限制。

Kubernetes使用项目ID开始1048576。使用中的ID在/ etc / projects/ etc / projid。如果此范围内的项目ID用于系统上的其他目的,则必须注册这些项目ID/ etc / projects/ etc / projid因此,Kubernetes不使用它们。

配额比目录扫描更快,更准确。将目录分配给项目时,在该项目中创建目录下创建的所有文件,内核仅需要跟踪该项目中文件中使用多少块。
如果创建和删除文件,但具有打开的文件描述符,则继续使用空间。配额跟踪记录该空间准确,而目录扫描可忽视已删除文件使用的存储。

如果要使用项目配额,则应:

  • 启用localstorageacapacityisolationfsquotamonitoring = true特征门使用feedgates.田野kubelet配置或者- 盖茨命令行标志。

  • 确保启用了根文件系统(或可选运行时文件系统)。所有XFS文件系统都支持项目配额。对于ext4文件系统,您需要在未安装文件系统时启用项目配额跟踪功能。

    #对于ext4,带/开发/块设备未安装sudo tune2fs -o project-q prjquota / dev / block-device
  • 确保将根文件系统(或可选运行时文件系统)安装有启用项目配额。对于XFS和EXT4FS,挂载选项被命名prjquota.

扩展资源

扩展资源是完全合格的资源名称Kubernetes.io.领域。它们允许集群运营商宣传和用户消耗非Kubernetes内置资源。

使用扩展资源需要两个步骤。首先,群集运算符必须宣传扩展资源。其次,用户必须在POD中请求扩展资源。

管理扩展资源

节点级扩展资源

节点级扩展资源与节点相关联。

设备插件管理资源

设备插件用于如何在每个节点上授予设备插件托管资源。

其他资源

要宣传新的节点级扩展资源,群集运算符可以提交一个修补HTTP请求到API服务器指定可用数量status.capacity.对于群集中的节点。在此操作之后,节点status.capacity.将包括新资源。这status.allocatable.字段由Kubelet异步使用新资源自动更新。请注意,因为调度程序使用节点status.allocatable.值评估POD FIC度时,将节点容量与新资源和请求在该节点上的资源安排的第一个POD之间修补节点容量之间可能存在短暂的延迟。

例子:

这是一个示例,展示了如何使用卷曲要形成一个HTTP请求,该请求在节点上发布五个“example.com/foo”资源K8S-Node-1谁的主人是K8S-Master

卷曲 - 头顶“Content-type:application / json-patch + JSON”\-  request补丁\- 数据'[{“op”:“添加”,“路径”:“/status/capacity/example.com ~1foo”,“值”:“5”}]'\http:// k8s-master:8080 / api / v1 / nodes / k8s-node-1 /状态
笔记:在前面的请求中,〜1是角色的编码/在修补程序路径中。JSON-PADP中的操作路径值被解释为JSON指针。有关更多详细信息,请参阅IETF RFC 6901,第3节

群集级别扩展资源

群集级别的扩展资源没有与节点相关联。它们通常由调度程序扩展器管理,该调度器扩展器处理资源消耗和资源配额。

您可以指定由调度程序扩展器处理的扩展资源调度程序策略配置

例子:

调度程序策略的以下配置指示群集级扩展资源“example.com/foo”由调度程序扩展器处理。

  • 仅当POD请求“example.com/foo”时,调度程序才会将POD发送到Scheduler Extender。
  • 忽略了字段指定调度程序不会检查其“example.com/foo”资源podfitsresources谓词。
{“种类”“政策”“apierion”“v1”“扩展器”:[{“URLPREFIX”“bindverb”“捆绑”“ManagedResources”:[{“名称”“example.com/foo”“忽略了薄纱器”真的}]}]}

消耗延长资源

用户可以在CPU和内存等POD规范中消耗扩展资源。调度程序负责资源计费,以便不超过可用金额同时分配给POD。

API服务器将百分比限制为整数。示例有效的数量是3.3000m.3ki.。示例无效的数量是0.51500米

笔记:扩展资源替换不透明的整数资源。用户可以使用除此之外的任何域名前缀Kubernetes.io.预留。

要在POD中消耗扩展资源,请将资源名称包含为密钥spec.containers []。资源。边缘地图在集装箱规格中。

笔记:如果两个都存在于容器规范中,则无法过度使用扩展资源,因此请求和限制必须等于。

仅当满足所有资源请求时,才会安排一个POD,包括CPU,内存和任何扩展资源。豆荚仍然存在待办的只要不满足资源请求即可。

例子:

下面的POD请求2 CPU和1“example.com/foo”(扩展资源)。

apiersionv1.种类元数据名称我的豆荚规格容器-名称我的容器图像myimage.资源要求中央处理器2example.com/foo.1限制example.com/foo.1

PID限制

进程ID(PID)限制允许配置Kubelet以限制给定POD可以消耗的PID的数量。看PID限制有关信息。

故障排除

我的豆荚是待命的事件消息失败

如果调度程序无法找到POD可以适合的任何节点,则POD仍然未加工,直到找到一个地方。每次调度程序无法找到POD的位置,都会生成一个事件,如下所示:

kubectl描述了Pod Frontend |grep -a.3.活动
事件:来自SubObject PathReason消息36s 5s 6 {scheduler}失败的原因Podexceedsfreecpu和可能的其他人

在前面的示例中,由于节点上的CPU资源不足而命名为“前端”的POD无法调度。由于内存不足(PodexceedSFreeMeMory),类似的错误消息也可以建议失败。一般来说,如果POD与这种类型的消息等待,则需要尝试几件事:

  • 将更多节点添加到群集中。
  • 终止不需要的豆荚,为待处理豆荚腾出空间。
  • 检查POD不大于所有节点。例如,如果所有节点都有容量CPU:1,然后是一个要求的podCPU:1.1永远不会安排。

您可以检查节点容量和分配的金额kubectl描述节点命令。例如:

Kubectl描述节点E2E-Tes​​t-Node-Pool-4LW4
名称:E2E-Tes​​t-node-pool-4lw4 [...为清楚起见删除的线条...]容量:CPU:2内存:7679792KI豆荚:110分配:CPU:1800M内存:7474992KI POD:110 [...线条为清楚起见删除......]非终止的吊舱:(总共5)命名空间名称CPU请求CPU限制内存请求内存限制------------------------------------------------------------------------------------------------------------------------------------------------  ---------- -------------- ------------- kube-system fluentd-gcp-v1.38-28bv1 100m (5%) 0 (0%) 200Mi (2%) 200Mi (2%) kube-system kube-dns-3297075139-61lj3 260m (13%) 0 (0%) 100Mi (1%) 170Mi (2%) kube-system kube-proxy-e2e-test-... 100m (5%) 0 (0%) 0 (0%) 0 (0%) kube-system monitoring-influxdb-grafana-v4-z1m12 200m (10%) 200m (10%) 600Mi (8%) 600Mi (8%) kube-system node-problem-detector-v0.1-fj7m3 20m (1%) 200m (10%) 20Mi (0%) 100Mi (1%) Allocated resources: (Total limits may be over 100 percent, i.e., overcommitted.) CPU Requests CPU Limits Memory Requests Memory Limits ------------ ---------- --------------- ------------- 680m (34%) 400m (20%) 920Mi (11%) 1070Mi (13%)

在前面的输出中,您可以看到,如果POD请求超过1120米的CPU或6.23GI的内存,则它将不适合节点。

看着豆荚部分,您可以看到哪些吊舱在节点上占用空间。

POD可用的资源量小于节点容量,因为系统守护程序使用一部分可用资源。这分配场地nodestatus.给出豆荚的资源量。有关更多信息,请参阅节点分配资源

资源配额功能可以配置为限制可以消耗的资源总量。如果与命名空间一起使用,它可以防止一个团队介绍所有资源。

我的容器被终止了

您的容器可能会被终止,因为它是资源匮乏的。要检查是否被杀死了容器,因为它正在击中资源限制,请致电kubectl描述了豆荚关于兴趣的豆荚:

Kubectl描述了Pod Simmemleak-Hra99
名称:Simmemleak-Hra99命名空间:默认图像:Saadalni / Simmemleak节点:Kubernetes-node-TF0F / 10.240.216.66标签:名称= Simmemleak状态:运行原因:消息:IP:10.244.2.75复制控制器:SimmemLeak(1/ 1副本创建)容器:Simmemleak:图片:Saadali / Simmemleak限制:CPU:100M内存:50MI状态:运行开始:Tue,07 2015年7月12:54:41 -0700最后终止状态:终止退出代码:1开始:Fri,07 2015年7月12日12:54:30 -0700完成:FRI,07 2015年7月12:54:33 -0700准备好:假重启数量:5条件:类型状态就绪虚假事件:Fireveen从SubObjectPath的姓氏数量,07 7月2015年7月12:53:51 -0700 Tue,07 2015年7月1日12:53:51 -0700 1 {Scheduler}预定成功分配了Simmemleak-Hra99到Kubernetes-node-TF0f Tue,2015年7月2015年7月12:53:51 -0700星期二,07年7月1日12:53:51 -0700 1 {kubelet kubernetes-node-tf0f}隐式必需的容器pod拉伙伴容器图像“k8s.gcr.io/pause:0.8.0”已经存在Achine Tue,2015年7月7日12:53:51 -0700 Tue,2015年7月12日2015 12:53:51 -0700 1 {kubelet Kubernetes-node-TF0F}隐式必需的需要使用Docker ID 6A41280F516D Tue创建的Contruct Contract Pod,2015年7月12日创建:53:51 -0700TUE,2015年7月7日12:53:51 -0700 1 {kubelet kubernetes-node-tf0f}隐式必需的容器pod以docker id 6a41280f516d tue,2015年7月12:53:51 -0700 tue,2015年7月7日12:53:51 -0700 1 {kubelet kubernetes-node-tf0f} spec.containers {simmemleak}用docker ID 87348f12526a创建创建

在前面的例子中,重启数量:5表示这一点Simmemleak.吊舱中的容器终止并重新启动五次。

你可以打电话kubectl得到pod.与之-o go-template = ...获取先前终止容器的状态的选项:

kubectl get pod -o go-template='{{range.status.containerstatuses}} {{“容器名称:”}} {{。name}} {{。\ r \ nlaststate:“}}} {{。laststate}} {{end}}'Simmemleak-Hra99.
容器名称:SimmemLeak姓氏:地图[终止:地图[ExitCode:137原因:OOM杀死了

你可以看到容器被终止,因为原因:oom杀死了, 在哪里oom.代表内存。

下一步是什么

最后修改2月18日,2021年下午2:14 PST:为kube-scheduler策略添加参考文件(4d20ce5b2)