[英]Quotas and others for a Java Microservice, JVM Params, k8s and Docker
假设通过 Docker 和 Kubernetes 部署了一个 Java 微服务(Dropwizard)。
一个示例微服务使用192Mi
HeapSize 启动并完美运行。 这被确定为基本的 memory 要求。
使用openjdk-runtime:11-hotspot
的示例 Dockerfile
FROM some-container-reg/openjdk-runtime:11-hotspot
# prepare build
COPY --chown=1001:1001 build/install/svc-example .
COPY --chown=1001:1001 config.yml .
# exposing port(s)
EXPOSE 8080
# setting entry point...
ENTRYPOINT ["bin/svc-example", "server", "config.yml"]
注意:由于使用openjdk > 10
,JVM 会检测它是否在容器中运行。 因此,无需像在 Java 8 中那样启用实验性 VM 功能来实现此目的。有关详细信息,请参阅下面的链接。
https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8146115
对应的k8s部署
resources:
limits:
cpu: 250m
memory: 288Mi
requests:
cpu: 100m
memory: 192Mi
env:
- name: JAVA_OPTS
value: "-XX:MaxRAMPercentage=75.0"
容器请求等于来自java应用程序本身的工作量。 限制已定义为请求加上96Mi
的偏移量。 通过这样做,我想确保除了 JVM-Heap 之外的需求有足够的资源来正常工作MetaspaceSize, CodeCache, ...
还通过应用-XX:MaxRAMPercentage=75.0
在容器部署中定义JAVA_OPTS
,这为 JVM 定义了总 memory 的 75% 的限制。 为什么不在-XX:Xmx=192Mi
中定义明确的堆限制? 有关详细信息,请参阅下面的链接。
所以,现在我的问题:
GC
或MaxMetaspaceSize
以防止 memory 的使用超出限制?您需要使用分析器分析您的应用程序,并使用 APM 工具对其进行监控,以便在需要时和持续活动时微调 memory 要求。 关于最后一个问题,无论 docker 映像具有的 JRE/JDK 是用于为 kubernetes 中的 pod 创建容器的 JDK/JRE。 另外我注意到您使用的 JDK 不推荐用于生产部署……而是使用 JRE。
从 Kubernetes 配额角度要记住的是,在任何时候,如果 java 的 memory 消耗超过限制中定义的值,则 pod 将被终止。
如果没有节点在请求中定义了那么多可用的 memory,则根本不会调度 pod。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.