Kubernetes No CPU Limit:不限制 CPU 可能会更好

4a62cf61d1557b2c5033c30a6b376c11.gif

新钛云服已累计为您分享644篇技术干货

568ad0407ed8342065ee26d9ccb6a5d2.gif


介绍

Kubernetes 是一个开源容器编排平台,可帮助编排您的容器化应用程序。使用Kubernetes之后 ,无需担心应用程序的扩展和可用性。在将应用程序迁移到Kubernetes 集群之前,集群需要拥有灾难恢复的高可用性,以及安全、可扩展和优化的特性。

Kubernetes 利用来自底层虚拟机或物理机的资源,然后由各个容器使用。最常见的资源是 CPU 和 RAM,还有其他资源。如果需要,Kubernetes 可以限制这些资源及其容器对它们的消耗。对容器的 CPU/Memory 使用设置限制是一种普遍的做法。

CPU/Memory 限制是容器可以使用的最大 CPU/Memory。它限制容器使用节点上所有可用的 CPU/Memory。因此,从理论上讲,这听起来不错,可以保护节点不会耗尽资源并变得无响应。

CPU 和内存限制的实现方式和工作方式彼此不同。内存限制更容易检测到,我们只需要检查 pod 的上次重启状态,如果它由于内存不足(OOMKilled)而被杀死。另一方面,为了实现 CPU 限制,Kubernetes 使用内核限制并暴露指标而不是使用 cgroup 相关的指标,这使得很难检测 CPU 限制。这意味着,如果应用程序超出 CPU 限制,它就会受到限制

这就是问题所在。

在我们了解 CPU throttling之前,让我们了解 CPU 限制的需求以及它是如何工作的

如果我们没有在 Kubernetes 中指定 CPU limit 与 request怎么办?

如果您不指定 CPU 限制,则容器将没有任何 CPU 上限,然后它可以使用节点上所有可用的 CPU。这会使 CPU 密集型容器降低同一节点上的其他容器的速度,并可能耗尽节点上所有可用的 CPU。这反过来又会触发诸如 kubelet 等 Kubernetes 组件变得无响应的事件。这可以使节点变为 NotReady 状态,并且来自该节点的容器将被重新调度到某个其他节点上。

什么是 CPU 限制以及 CPU 限制如何工作?

CPU throttling确保如果应用程序超过指定的限制,它就会受到限制。有时,即使 CPU 使用率接近限制,也可以观察到容器throttling。发生这种情况是因为 Linux 内核中的一个错误会不必要地限制拥有 CPU 限制的容器。

现在,在我们继续之前,让我们首先了解 CPU 限制在 Kubernetes 中是如何工作的。Kubernetes使用CFS (https://kubernetes.io/docs/tasks/administer-cluster/cpu-management-policies/) 配额来对运行应用程序的 pod 实施 CPU 限制。Completely Fair Scheduler (CFS) 是一个进程调度程序,它根据时间段而不是基于可用的 CPU 功率来处理执行进程的 CPU 资源分配,并使用两个files:cfs_period_us 和 cfs_quota_us。(https://www.kernel.org/doc/Documentation/scheduler/sched-bwc.txt)

  • cpu.cfs_quota_us:一段时间内的总可用运行时间[以微秒为单位]

  • cpu.cfs_period_us:一个周期的长度[以微秒为单位]

cat /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_period_us  
o/p → 100000

这里,100000 us = 100 ms

cat /sys/fs/cgroup/cpu,cpuacct/cpu.cfs_quota_us  
o/p → -1

这里,cpu.cfs_quota_us 的值为 -1 表示没有任何带宽限制

792df09ace89c5b9686eaeff0560a71f.png

例如,有一个单线程应用程序在 CPU 上运行,但有 CPU 限制,应用程序需要 200 毫秒的处理时间。应用程序完成其请求的图表如下所示。

5bc572bb8015a9404edd48bfa3860d97.png

在第二种情况下,如果我们为应用程序设置 0.4 个 CPU 的 CPU 限制,则应用程序在每 100 毫秒周期后获得 40 毫秒的运行时间。在这里,之前需要 200 毫秒的请求现在需要 440 毫秒才能完成。

e284a51157fb2922293e09fdc3a96cf5.png

从上面的例子可以看出,CPU 限制是问题的真正原因。

案例

让我们以以下示例为例,其中工作节点有1 个 CPU。您可以在 linux 服务器上使用“cat /proc/cpuinfo”命令检查它。

现在,在我们创建有 CPU 限制的 Pod 之前,让我们在集群上部署一个“Metrics Server”,它可以用来获取资源使用率的相关指标。尤其是Pod/Node的指标。

可以使用以下命令部署 Metrics 服务器,这些命令首先克隆“kubernetes-metrics-server”git 存储库并在集群上创建所需的对象。

git clone https://github.com/kodekloudhub/kubernetes-metrics-server.git  
cd kubernetes-metrics-server/
kubectl apply -f .

c5cfd264c462f4aec5c1f9e31e3f7e40.png

要创建有 CPU 请求和限制的 pod,请使用以下 pod 定义创建一个文件“pod-with-cpu-limit.yaml”。这为 Pod 设置了Limit “1”和Request “0.5”。Request是容器预留的资源,Limit确保容器永远不会超过某个值。  (https://cloud.google.com/blog/products/gcp/kubernetes-best-practices-resource-requests-and-limits) 

requests:
    cpu: 100m
  limits:
    cpu: 500m

这将创建一个没有任何问题的 pod,因为 Limit 不超过我们在工作节点上拥有的实际 CPU 数量,并且请求在我们指定的限制范围内。

使用以下命令创建一个 pod

kubectl apply -f pod-with-cpu-limit.yaml
kubectl get pods
kubectl describe pod cpu-demo-pod

08a151cf40f6aee4522677218020783b.png

现在,如果您使用以下命令检查 pod 的实际 CPU 使用率,它是 1003m(1 个 CPU)。由于我们传递给 pod 的参数超过了我们在限制中指定的参数,这里 CPU 正在throttling。

使用以下命令检查使用情况。

kubectl top pods cpu-demo-pod

a5ef7de03c5d1c0198be66fd8db26930.png

但是,如果您指定的 CPU 限制超过了工作节点上可用的数量,您将面临问题并且 Pod 将进入 Pending 状态。

1a7e54cb6835d6015f6ed9d88e74a0c3.png

首先删除现有的 pod,更改 CPU 限制和请求,然后尝试使用以下命令创建一个 Pod。

kubectl get pods
kubectl delete pod cpu-demo-pod
kubectl apply -f pod-with-cpu-limit.yaml

9361defc60d3769b59f6ab6cad3f81c1.png

通过描述 Pod 来检查失败的原因。

kubectl get pods
kubectl describe pod cpu-demo-pod

您可以清楚地看到,由于 CPU 请求超过了工作节点上实际可用的 CPU,因此 Pod 无法创建并处于 Pending 状态。

7920f211491fa569cbbfc8a530d5b2ad.png

删除 CPU 限制时要小心

就集群稳定性而言,移除 CPU 限制并不是一个容易的决定。如果默认情况下未设置 CPU 限制,则它的默认限制则是节点的最高可用值。

在取消 CPU 限制之前,了解应用如何工作以及它们对 CPU 的需求非常重要。

我们可以尝试移除对延迟敏感的应用的 CPU 限制,而不是随意的从所有应用中移除 CPU 限制。

隔离没有 CPU 限制的应用是个好的方式。如果资源分配出现任何问题,这将有助于轻松控制和识别此类应用pod。

结论

如果 Docker container/Kubernetes Pod 在 Linux 系统上运行,那么它们可能会由于throttling而表现异常。虽然这可能很危险,但删除 CPU Limited 是解决此限制问题的解决方案。

这也可以通过将内核升级到修复 CPU throttling问题的版本来解决。没有 CPU 限制的应用程序也可以隔离到不同的节点,以便更容易找出影响pod容器性能的罪魁祸首。

了解新钛云服

新钛云服荣膺第四届FMCG零售消费品行业CIO年会「年度数字化服务最值得信赖品牌奖」

新钛云服三周岁,公司月营收超600万元,定下百年新钛的发展目标

当IPFS遇见云服务|新钛云服与冰河分布式实验室达成战略协议

新钛云服正式获批工信部ISP/IDC(含互联网资源协作)牌照

深耕专业,矗立鳌头,新钛云服获千万Pre-A轮融资

新钛云服,打造最专业的Cloud MSP+,做企业业务和云之间的桥梁

新钛云服一周年,完成两轮融资,服务五十多家客户

上海某仓储物流电子商务公司混合云解决方案

往期技术干货

Kubernetes扩容到7,500节点的历程

低代码开发,全民开发,淘汰职业程序员!

国内主流公有云VPC使用对比及总结

万字长文:云架构设计原则|附PDF下载

刚刚,OpenStack 第 19 个版本来了,附28项特性详细解读!

Ceph OSD故障排除|万字经验总结

七个用于Docker和Kubernetes防护的安全工具

运维人的终身成长,从清单管理开始|万字长文!

OpenStack与ZStack深度对比:架构、部署、计算存储与网络、运维监控等

什么是云原生?

IT混合云战略:是什么、为什么,如何构建?

2eb76dec230a146b507ed10a085b162a.gif

点👇分享

989c14860e1df79a7699cac1b6a552ad.gif

戳👇在看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值