Kubernetes pod内存使用程序



我有一个用例,在我的jax-rs rest api暴露将做一个内存密集型操作,如生成pdf并将其作为响应发送。我想在开始执行业务逻辑之前检查pod内存使用情况,以及当前内存使用情况是否为>50%,我想向用户发送一个错误响应,要求他稍后再试。我如何检查kubernetes pod内存使用在我的rest api。这可能吗?

当前代码如下所示:

@Path("/doSomeMemoryStuff")
@Produces("text/plain")
public Response doStuff(){
int memoryUsage = getPodCurrentMemoryUsage();  //Get pod current memory usage
if( memoryUsage <= 50 ) {
//do Some memory intensive operation
}
else{
//memory usage is more than 50 % , return error
return Response.ok("Try again later.").build();
}
}         

我如何从我的rest api中找出pod的当前内存使用情况。提前谢谢。

严格地说,我们可以将您的语句解释为"Kubernetes pod内存自动使用">,如果您有进程,不时地消耗大量需要释放的资源,您可以使用垂直pod自动缩放器.

一些有趣的参考:

  1. https://github.com/kubernetes/autoscaler/tree/master/vertical-pod-autoscaler
  2. https://docs.aws.amazon.com/eks/latest/userguide/vertical-pod-autoscaler.html
  3. https://cloud.google.com/kubernetes-engine/docs/concepts/verticalpodautoscaler

当一个进程和另一个进程的资源需求非常不同时,使用VPA是合适的。

如果不是这样(或多或少的所有请求都将使用一个已知的参考资料),甚至如果你使用VPA,建议你限制你的服务,如果他们不接受请求正致力于一项昂贵的操作,Kubernetes将自动增加或减少吊舱根据负载的数量和你的用户将会收到一个503错误,正是表明他们现在不能提供,应该稍后再试。

也就是说:

  1. 如果不是绝对必要的话,不要使用VPA。
  2. 用足够数量的pod配置你的部署。
  3. 将您的服务限制为单个并发请求(或尽可能多地适合您的资源配置)。
  4. 不要做任何特别的事情,如果你的系统已经达到了你设置的限制,只要让用户收到一个503(你的用户界面会将错误翻译为"Try again later">)。

部署的细节可能会有所不同,但基本上通过在三个级别上运行,您可以为基础结构提供一些对负载类型的适应性:

  1. 应用程序级别:对于每个应用程序实例,您可以定义(http请求)速率限制。它必须与pod的请求/限制保持一致。如果你不能修改你的应用程序(例如使用bucket4j),你可以使用(例如)Nginx添加一个适配器到你的Pod(具体配置参见第3点)。
  2. 部署水平:一旦你的应用程序不会因为请求过载而中断,你应该能够横向扩展你的基础设施,使用https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/为每个Pod或部署中的副本提供请求/限制(有很多指标可用于自动扩展)。
  3. 负载均衡器级别:对于简单的场景,你可以简单地配置一个入口控制器来限制速率(即使用Nginx控制器),但是,如果你能够分割你的请求(例如...?queryType=hard&...),你可以隔离你的配置(第1点和第2点),以维护多个基础设施(具有几个垂直缩放),每个基础设施已经准备好处理特定类型的请求,这可以很容易地用Nginx完成(Istio可能是多余的)。使用此策略,假设您有两个区域:"LR:低资源">"HR:高资源">。如果系统上没有负载,两个区域都不消耗资源(即minReplies: 1),如果有许多"LR">请求,则资源在这个区域使用,如果它们在"HR">中,则资源在另一个区域中使用,如果它们在两个区域中,则它们在两个区域之间分布。逻辑上,最大负载将是LR.maxReplies + HR.maxReplies(您可以制定更复杂的规则,例如使用Istio,但始终使用最简单的方案,您认为将为您工作)。

最新更新