[kubernetes]-kubernetes使用jdk给pod百分比分配内存

目的:结合自己在操作中遇到的问题 看到一个博客在这方面讲的不错 自己也记录一下,目前还在测试。

结合我自己的例子

      - name: haozhuo-ec
        image: registry.cn-shanghai.aliyuncs.com/yjk-datag/k8s-haozhuo-ec:v215
        #image: registry.cn-shanghai.aliyuncs.com/yjk-datag/haozhuo-video:vtest06
        env:
        - name: DUBBO_IP_TO_REGISTRY
          valueFrom:
            fieldRef:
              fieldPath: status.hostIP
        - name: DUBBO_PORT_TO_REGISTRY
          value: "20907"
        resources:
          limits:
            cpu: 2000m
            memory: 2048Mi
          requests:
            cpu: 1000m
            memory: 1024Mi

这表示haozhuo-ec这个容器运行在Kubernetes集群中时,最低能拥有1核CPU,1024M内存,最高不超过2核CPU,2048M内存。

其余访问少的容器 配置更低。并且我tomcat设置的内存是分配 内存的一半,服务就会经常被重启。

假想当我们把这个yaml资源声明应用到Kubernetes集群时,Kubernetes将它调度一个拥有64核CPU,128G内存的宿主机节点上。Docker容器本质是是宿主机上的一个进程,它与宿主机共享一个/proc目录,也就是说我们在容器内看到的/proc/meminfo,/proc/cpuinfo与直接在宿主机上看到的一致。也即,此容器认为自己的系统资源同样是64核CPU,128G内存。

此处,就出现了运行的容器感知的资源,与Kubernetes分配给它的资源的偏差。在早期的Java版本(JDK 8u131之前)中,这种偏差可能会导致Java应用不断的重启。

那么,为什么Pod会不断重启呢?

以刚才这个配置为例,Java应用以为这自身拥有128G内存,默认情况下,JVM的Max Heap Size是系统内存的1/4,也就是32G作为最大JVM堆内存。但是,当应用运行的总内存,超过Kubernetes的声明限制的2G时,应用就会触发Kubernetes集群定义的资源超配额限制,自动重启此应用POD。于是,我们看到的现象,就是这个应用有越来越多的restart。

如果用户运行的JDK8版本低于131,解决这个问题的办法,是需要在容器启动JAVA程序时,自行定义好与资源配额一致的-Xmx等参数。后来,随着JDK版本的升级,容器感知的功能就内置于Java应用中了,如果JDK8的版本高于191,我们就可以使用MaxRAMPercentage这种更智能化的参数来解决这个问题了。

参考JVM参数进化史。图片来自网络

[kubernetes]-kubernetes使用jdk给pod百分比分配内存_第1张图片

MaxRAMPercentageInitialRAMPercentageMinRAMPercentage。这三个参数是JDK8U191为适配Docker容器新增的几个参数,类比Xmx、Xms,至于-XX:InitialRAMFraction、-XX:MaxRAMFraction、-XX:MinRAMFraction已经被标记为deprecated 。这几个参数的好处是什么呢?Docker容器模式下,我们可以给每个JVM实例所属的POD分配任意大小的内存上限。比如,给每个账户服务分配4G,给每个支付服务分配8G。如此一来,启动脚本就不好写成通用的了,指定3G也不是,指定6G也不是。但是,有了这三个新增参数,我们就可以在通用的启动脚本中指定75%(-XX:MaxRAMPercentage=75 -XX:InitialRAMPercentage=75 -XX:MinRAMPercentage=75)。那么,账户服务就相当于设置了-Xmx3g -Xms3g。而支付服务相当于设置了-Xmx6g -Xms6g

这个比我自己动态设置tomcat内存 逼格高。但是自己使用的时候设置为75会报错 要设置75.0

参考

https://mp.weixin.qq.com/s/ZvDa-i8yIvkXYvhSiOFTXQ

你可能感兴趣的:(kubernetes)