首页 > 解决方案 > 如何限制 kubernetes pod 中 .net 核心应用程序的内存大小?

问题描述

我有一个 kubernetes 集群,每个节点上都有 16Gb RAM

以及一个典型的dotnet core webapi应用

我尝试像这里配置限制:

apiVersion: v1
kind: LimitRange
metadata:
  name: mem-limit-range
spec:
  limits:
  - default:
      memory: 512Mi
    defaultRequest:
      memory: 256Mi
    type: Container

但我的应用程序认为可以使用 16Gb

因为cat /proc/meminfo | head -n 1返回MemTotal: 16635172 kB(或者可能来自 cgroups,我不确定)

所以..可能是限制不起作用?

不!当我的 pod 达到内存限制时,K8s 成功杀死了我的 pod

.net core 有有趣的 GC 模式,更多细节在这里。这是一个很好的模式,但看起来它不适用于 k8s 解决方案,因为应用程序获取了有关内存的错误信息。无限的 pod 可以获得所有主机内存。但是有限制 - 他们会死。

现在我看到了两种方法:

  1. 使用 GC 工作站
  2. 使用限制和k8s 读取探测:处理程序将在每次迭代时检查当前内存,如果当前使用的内存接近 80%,则调用 GC.Collect()(我将通过 env 变量的限制)

如何限制 kubernetes pod 中 .net 核心应用程序的内存大小?

如何正确设置 Kubernetes 中 pod 的内存限制?

标签: asp.net-web-apiasp.net-corekubernetes.net-core

解决方案


您应该切换到 Workstation GC 以优化以降低内存使用率。就绪探针不用于检查内存

为了正确配置资源限制,您应该在负载较重的单个 pod 上测试您的应用程序并监控(例如 Prometheus 和 Grafana)的使用情况。有关更深入的详细信息,请参阅此博客文章。如果您还没有部署监视器堆栈,您至少可以使用kubectl top pods.

如果您发现了单个 pod 的断点,您可以将限制添加到特定 pod,如下面的示例(有关更多示例和详细信息,请参阅Kubernetes 文档)

apiVersion: v1
kind: Pod
metadata:
  name: exmple-pod
spec:
  containers:
  - name: net-core-app
    image: net-code-image
    resources:
      requests:
        memory: 64Mi
        cpu: 250m
      limits:
        memory: 128Mi
        cpu: 500m

就绪探针实际上是用来判断 Pod 何时准备就绪。我猜你想到了 liveness probe ,但是这还不够用,因为 Kubernetes 会在 Pod 超过它的资源限制并重新调度时杀死它。


推荐阅读