[英]How to limit memory size for .net core application in pod of kubernetes?
我有一个 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
cat /proc/meminfo | head -n 1
返回MemTotal: 16635172 kB
(或者可能来自 cgroups,我不确定)
所以..可能是限制不起作用?
不! K8s 在达到内存限制时成功杀死了我的 pod
.net core 有有趣的 GC 模式, 更多细节在这里。 这是一个很好的模式,但看起来它对 k8s 不起作用,因为应用程序获得了错误的内存信息。 无限的 Pod 可以获得所有主机内存。 但是有限制——他们会死。
现在我看到两种方法:
如何在 Kubernetes 的 pod 中限制 .net core 应用程序的内存大小?
如何在 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
readiness 探针实际上是用来判断 Pod 何时准备就绪的。 我猜你想到了活性探测,但这还不够使用,因为当 Pod 超出资源限制并重新调度时,Kubernetes 会杀死它。
使用环境变量COMPlus_GCHeapHardLimit
并注意:您应该使用十六进制值
这意味着10000000
的值是 256MB!
我使用 docker run 命令参数(可以通过部署 yaml 传递)来指定容器的内存大小:
args:
- "--memory=124m --memory-swap=124m"
这样 .net GC“看到”只有 124MB 可用。
args 说明符与容器说明符下的端口和名称处于同一级别:
containers:
- name: xxx
ports:
....
args:
- "--memory=124m --memory-swap=124m"
关于参数“--memory”和“--memory-swap”的描述可以在这里找到https://docs.docker.com/config/containers/resource_constraints/
-m 或 --memory= 容器可以使用的最大内存量。 如果设置此选项,则最小允许值为 6m(6 兆字节)。
--memory-swap* 允许此容器交换到磁盘的内存量。 请参阅 --memory-swap 详细信息。
可以在此处找到有关将参数传递给 run 命令的更多详细信息: How to pass docker run flags via kubernetes pod
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.