Azure中配置副本与资源的Deployment未按指定资源部署问题
在Azure环境中创建带有3个副本的Deployment,已为每个容器配置CPU请求与限制为2核、内存请求与限制为8Gi,但实际运行时Pod始终占用4 CPU和15Gi内存。部署使用的YAML文件如下:
apiVersion: apps/v1 kind: Deployment metadata: name: test namespace: test-cf-ns spec: replicas: 3 selector: matchLabels: app: test-cf template: metadata: labels: app: test-cf spec: nodeSelector: kubernetes.io/os: linux containers: - image: adobecoldfusion/coldfusion2021:latest name: test-cf imagePullPolicy: Always resources: limits: cpu: 2 memory: 8Gi requests: cpu: 2 memory: 8Gi
检查容器内部实际进程:Adobe ColdFusion镜像默认可能启动多进程,或内置JVM参数配置过高,导致资源占用超出K8s限制。可进入容器查看进程状态:
kubectl exec -n test-cf-ns <pod-name> -- top同时查看ColdFusion的JVM配置文件
/opt/coldfusion2021/bin/jvm.config,确认默认堆内存设置是否过高。验证K8s资源限制生效状态:执行以下命令查看Pod的资源配置是否正确应用:
kubectl describe pod -n test-cf-ns <pod-name>检查输出中
Resources字段的Limits和Requests是否与YAML配置一致。若配置已应用但容器仍超用,可能是Java进程未识别K8s的cgroup限制(老版本JVM默认不支持容器内存限制)。调整JVM参数适配容器限制:ColdFusion基于Java运行,需添加JVM参数让其识别容器资源限制。可在Deployment的容器中通过环境变量修改JVM参数,示例修改如下:
containers: - image: adobecoldfusion/coldfusion2021:latest name: test-cf imagePullPolicy: Always resources: limits: cpu: 2 memory: 8Gi requests: cpu: 2 memory: 8Gi env: - name: JVM_ARGS value: "-XX:+UseContainerSupport -XX:MaxRAMPercentage=75.0 -Xmx6g"-XX:+UseContainerSupport让JVM识别容器cgroup限制,-XX:MaxRAMPercentage设置堆内存占容器内存的比例,避免内存溢出。确认实际运行的Pod数量:执行以下命令检查当前Pod副本数是否为3:
kubectl get pods -n test-cf-ns若实际仅运行2个Pod,总占用会是4 CPU(2×2)和约16Gi内存(接近15Gi),可能是误将总占用当成单个Pod的资源使用。
排查Azure节点资源负载:检查Pod所在节点的整体资源使用,确认是否有其他Pod或进程占用资源导致统计数据偏差:
kubectl top node kubectl top pod -n test-cf-ns对比节点总负载与目标Pod的单独负载,排除节点其他资源占用的干扰。
内容的提问来源于stack exchange,提问作者Souvik Saha Choudhury

