问题:我们在Kubernetes Pods上运行的代码在它的运行时有很大的差异;具体来说,当某些条件被触发时,它有偶尔的CPU和内存峰值。这些触发器涉及具有硬实时需求的用户查询(系统必须在<5秒内作出响应)。
在为尖顶吊舱服务的节点没有足够的CPU/RAM的情况下,Kubernetes对这些过多的请求作出了响应,完全杀死了这个吊舱;这导致在任何时候都没有输出。
我们如何确保在分配豆荚时考虑到这些尖峰;更重要的是,没有因为这些原因导致吊舱关闭?
谢谢!
发布于 2017-12-05 06:21:07
有负载的吊舱的高可用性可通过以下两种方式实现:
配置更多的CPU/内存
由于应用程序在高峰时间需要更多的CPU/内存,因此配置时,为POD分配的资源将负责额外的负载。配置POD,如下所示:
resources:
requests:
memory: "64Mi"
cpu: "250m"
limits:
memory: "128Mi"
cpu: "500m"您可以根据使用情况增加限制。但是这样做会引起两个问题
1) 未充分利用的资源
由于资源分配的数量很大,除非流量激增,否则这些资源可能会被浪费。
2) 部署失败
由于kubernetes节点中没有足够的资源来满足请求,POD部署可能会失败。
欲了解更多信息:https://kubernetes.io/docs/concepts/configuration/manage-compute-resources-container/
>自动标度
理想的方法是根据业务流量自动对POD进行自动测量。
kubectl autoscale deployment <DEPLOY-APP-NAME> --cpu-percent=50 --min=1 --max=10 根据需求配置cpu百分比,默认情况下配置80% .Min和max是可以相应配置的荚数。
因此,每当POD以50%的比例命中CPU百分比时,一个新的吊舱将被启动,并继续进行,直到它启动最多10个吊舱,反之亦然。
欲了解更多信息:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale-walkthrough/
发布于 2017-12-05 09:53:23
极限是一个极限,它应该做到这一点,就这样。
您可以做的是要么不受限制地运行-然后它将像在任何其他情况下运行在节点上运行- OOM将发生在节点,而不是Pod达到内存限制。但这听起来像是自找麻烦。请记住,即使你设定了一个很高的限制,它实际上是保证了一些资源到荚的请求,所以即使在pod上有2Gi的限制,如果请求是128 on,也可以在512 on上OOM。
你应该设计你的应用程序的方式不会产生这样的尖峰,或将容忍OOMs的豆荚。很难说您的软件到底做了什么,但是想到的一些可能帮助破解这一点的东西是请求节流、水平吊舱自动分配器或异步运行某种消息队列。
https://stackoverflow.com/questions/47643420
复制相似问题