asp.net-web-api - 如何限制 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 可以获得所有主机内存。但是有限制 - 他们会死。
现在我看到了两种方法:
- 使用 GC 工作站
- 使用限制和k8s 读取探测:处理程序将在每次迭代时检查当前内存,如果当前使用的内存接近 80%,则调用 GC.Collect()(我将通过 env 变量的限制)
如何限制 kubernetes pod 中 .net 核心应用程序的内存大小?
如何正确设置 Kubernetes 中 pod 的内存限制?
解决方案
您应该切换到 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 超过它的资源限制并重新调度时杀死它。
推荐阅读
- swift - 连续的单元测试失败,尽管它们单独成功
- javascript - 将页脚粘贴到页面底部
- angular - rxjs:使用 rxjs 自定义运算符更改 HttpRequest
- security - 验证 Tuxedo 服务身份验证和加密
- android - 在 Android Auto 中向服务请求权限
- java - 读取带有注释的属性文件时出现 Vert.x-Config 异常
- javascript - 如果原始空白,Javascript推送到数组添加逗号
- java - 为什么方法在每个数组中返回多个值而不是一个?
- android - 如何在不每次重新创建片段的情况下在片段之间切换?
- javascript - 如何控制表单中的输入值