繁体   English   中英

Java 微服务、JVM 参数、k8s 和 Docker 的配额和其他

[英]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中定义明确的堆限制? 有关详细信息,请参阅下面的链接。

https://bugs.openjdk.java.net/browse/JDK-8186315

所以,现在我的问题:

  • 我对上述建议是否正确?
  • 您如何确定实现低成本部署的限制?
  • 是否需要对 JVM 应用额外的参数,如GCMaxMetaspaceSize以防止 memory 的使用超出限制?
  • 我还需要为 Dockerfile 定义 JVM-Args 吗? 更清楚一点,Docker 的 JVM 和 Java-Microservice 的 JVM 是一样的吗?

您需要使用分析器分析您的应用程序,并使用 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM