我们有两个节点,每个节点都有96 GB内存。我们的计划是,我们的吊舱将从其中一个节点获取90.5 GB内存,从另一个节点获取91 GB内存。实际发生的是,吊舱从一个节点获得93.5GB,从另一个节点获取88 GB。这导致荚永久地重新启动,并且应用程序从未达到运行状态。
背景:我们是kubernetes的新手,在AWS上的ek集群上使用版本1.14 (v1.14.9- eks 658790)。目前我们有不同大小的豆荚,合在一起构成我们的产品的一个单位。在测试设置上,我们希望与一个单元一起工作,在生产上与多个单元一起工作。这是一个问题,我们支付更多的钱,节点,减少吊舱限制或数量的副本。
豆荚的详细情况:
+-------------+--------------+-----------+-------------+
| Pod name | Mem requests | pod limit | # of copies |
+-------------+--------------+-----------+-------------+
| BIG-OK-POD | 35 | 46 | 2 |
| OK-POD | 7.5 | 7.5 | 4 |
| A-OK-POD | 6 | 6 | 8 |
| WOLF-POD | 5 | 5 | 1 |
| WOLF-B-POD | 1 | 1 | 1 |
| SHEEP-POD | 2 | 2 | 1 |
| SHEEP-B-POD | 2 | 2 | 1 |
| SHEEP-C-POD | 1.5 | 1.5 | 1 |
+-------------+--------------+-----------+-------------+我们不关心豆荚在哪里运行,我们只是希望节点能够处理内存需求,而不会失败。
我重新命名了豆荚,以使它更容易遵循我们的预期。
预期位置:
我们预计狼荚会在一个节点上,绵羊豆荚在另一个节点上,而OK豆荚会在两个节点之间被分开。
Node 1:
+-------------+-----------+-------------+----------------+
| Pod name | pod limit | # of copies | combined limit |
+-------------+-----------+-------------+----------------+
| BIG-OK-POD | 46 | 1 | 46 |
| OK-POD | 7.5 | 2 | 15 |
| A-OK-POD | 6 | 4 | 24 |
| WOLF-POD | 5 | 1 | 5 |
| WOLF-B-POD | 1 | 1 | 1 |
+-------------+-----------+-------------+----------------+
| | TOTAL: 91 |
+-------------+-----------+-------------+----------------+
Node 2:
+-------------+-----------+-------------+----------------+
| Pod name | pod limit | # of copies | combined limit |
+-------------+-----------+-------------+----------------+
| BIG-OK-POD | 46 | 1 | 46 |
| OK-POD | 7.5 | 2 | 15 |
| A-OK-POD | 6 | 4 | 24 |
| SHEEP-POD | 2 | 1 | 2 |
| SHEEP-B-POD | 2 | 1 | 2 |
| SHEEP-C-POD | 1.5 | 1 | 1.5 |
+-------------+-----------+-------------+----------------+
| | TOTAL: 90.5 |
+-------------+-----------+-------------+----------------+实际放置:
Node 1:
+-------------+-----------+-------------+----------------+
| Pod name | pod limit | # of copies | combined limit |
+-------------+-----------+-------------+----------------+
| BIG-OK-POD | 46 | 1 | 46 |
| OK-POD | 7.5 | 2 | 15 |
| A-OK-POD | 6 | 4 | 24 |
| WOLF-POD | 5 | 1 | 5 |
| SHEEP-B-POD | 2 | 1 | 2 |
| SHEEP-C-POD | 1.5 | 1 | 1.5 |
+-------------+-----------+-------------+----------------+
| | TOTAL: 93.5 |
+-------------+-----------+-------------+----------------+
Node 2:
+-------------+-----------+-------------+----------------+
| Pod name | pod limit | # of copies | combined limit |
+-------------+-----------+-------------+----------------+
| BIG-OK-POD | 46 | 1 | 46 |
| OK-POD | 7.5 | 2 | 15 |
| A-OK-POD | 6 | 4 | 24 |
| WOLF-B-POD | 1 | 1 | 1 |
| SHEEP-POD | 2 | 1 | 2 |
+-------------+-----------+-------------+----------------+
| | TOTAL: 88 |
+-------------+-----------+-------------+----------------+有没有办法告诉kubernetes,节点应该将4GB的内存留给节点本身?
在阅读了的答案后,我们尝试更改系统--保留=内存(设置为0.2Gi),但是对于任何大于0.3Gi的值(0.5Gi、1Gi、2Gi、3Gi和4Gi),豆荚永远处于待定状态。
更新:我们找到了一种方法来减少对一些豆荚的限制,现在系统已经启动并且稳定了(尽管有一个节点在99%上)。我们无法让K8s从预览配置开始,我们仍然不知道为什么。
发布于 2020-09-10 09:00:13
Kubernetes让我们配置服务器,以便为系统守护进程保留资源。
为此,您需要配置kubelet代理。这是一个每个节点的配置。
因此,如果要在一个节点上预留4Gb内存,则需要使用以下选项在此节点上配置kubelet代理:
--system-reserved=memory=4Gi您可以在正式文件中找到更多关于这一点的信息。
发布于 2020-09-10 08:42:44
每个资源类型有两个资源说明符。
资源请求指定了豆荚应该保留的特定资源(CPU或内存)的数量。豆荚可以使用比所请求的资源更多的资源,但不能超过资源限制。
根据Kubernetes的文件:
创建Pod时,Kubernetes调度程序会为Pod选择要运行的节点。每个节点对于每种资源类型都有最大的容量:它可以为Pods提供的CPU和内存量。调度器确保,对于每种资源类型,调度容器的资源请求之和小于节点的容量。注意,尽管节点上的实际内存或CPU资源使用率非常低,但如果容量检查失败,调度程序仍然拒绝在节点上放置Pod。这可以防止当资源使用增加时,例如在请求速率的日峰值期间,节点上的资源短缺。
以下是资源请求和限制的典型配置。
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"发布于 2020-09-10 13:54:21
您在同一个“堆栈溢出问题”中触及了几个主题。
专题1.
有没有办法告诉kubernetes,节点应该将4GB的内存留给节点本身?背景:..。版本1.14在一个ek集群上
主题上的官方医生说,如果您的Kubernetes服务器位于版本1.8或更新版本1.8,那么它是可配置的。
在GiHub上有一条关于“库贝保留和系统预留不工作的#72762”的老线索,这也是值得一查的。
以及一个非常全面的文章,它指定了如何防止关键系统和Kubernetes服务的资源短缺。
专题2。
我们期望狼荚在一个节点上,羊荚在另一个节点上。
可以将Pod限制为只能在特定的节点上运行,或者更愿意在特定的节点上运行。有几种方法可以做到这一点,推荐的方法都使用标签选择器来进行选择。
nodeSelector是最简单的节点选择约束形式。nodeSelector是PodSpec的一个领域。它指定了键值对的映射。为了使pod有资格在节点上运行,节点必须将每个指定的键值对作为标签(它也可以有附加的标签)。最常见的用法是一个键值对。
当OK豆荚在节点之间被分开的时候。
荚间亲和力和反亲和力允许您约束您的荚符合调度https://kubernetes.io/docs/concepts/scheduling-eviction/assign-pod-node/#inter-pod-affinity-and-anti-affinity的节点,而不是基于节点上的标签。规则的形式是“如果X已经运行了一个或多个符合规则Y的豆荚,则这个荚应该(或者,在反亲和力的情况下,不应该)运行在X中”。
专题3.
听起来它可以用于我详细共享的两个节点的单位用例,但是对于生产,我们有很多节点,而不是一个接一个地配置它们。
https://stackoverflow.com/questions/63824731
复制相似问题