You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure Kubernetes集群中MySQL与Spring应用的内存告警及资源配置咨询

apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql-db-testing
namespace: testing
spec:
selector:
matchLabels:
app: mysql-db-testing
replicas: 1
strategy:
type: Recreate
template:
metadata:
labels:
app: mysql-db-testing
spec:
containers:
- name: mysql-db-container-testing
image: mysql:8.0.31
env:
- name: MYSQL_ROOT_PASSWORD
valueFrom:
secretKeyRef:
name: mysqldb-secret-testing
key: password
ports:
- containerPort: 3306
name: mysql-port
volumeMounts:
- mountPath: "/var/lib/mysql"
name: mysql-persistent-storage
volumes:
- name: mysql-persistent-storage
persistentVolumeClaim:
claimName: azure-managed-disk-pvc-mysql-testing
nodeSelector:
env: preprod

### Spring Boot应用部署YAML
```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: spring-app-api-testing
  namespace: testing
  labels:
    app: spring-app-api-testing
spec:
  replicas: 1
  selector:
    matchLabels:
      app: spring-app-api-testing
  template:
    metadata:
      labels:
        app: spring-app-api-testing
    spec:
      containers:
        - name: spring-app-api-testing
          image: techradaracr.azurecr.io/technology-radar-be:$(Build.BuildId)
          env:
          - name: MYSQL_PASSWORD
            valueFrom:
              secretKeyRef:
                name: mysqldb-secret-testing
                key: password
          - name: MYSQL_PORT
            valueFrom:
              configMapKeyRef:
                name: spring-app-testing-config-map
                key: mysql_port
          - name: MYSQL_HOST
            valueFrom:
              configMapKeyRef:
                name: spring-app-testing-config-map
                key: mysql_host
      nodeSelector:
        env: preprod
---
apiVersion: v1
kind: Service
metadata:
  labels:
    app: spring-app-api-testing
    k8s-app: spring-app-api-testing
  name: spring-app-api-testing-service
  namespace: testing
spec:
  ports:
  - name: http
    port: 80
    protocol: TCP
    targetPort: 8080
  type: LoadBalancer
  selector:
    app: spring-app-api-testing

资源配置方案

1. MySQL资源调整

针对小型内部数据库的场景,为MySQL添加如下resources配置,限制其内存占用:

containers: 
- name: mysql-db-container-testing 
  # ... 保留原有所有配置
  resources:
    requests:
      cpu: "200m"  # 预留0.2核CPU,满足基础运行
      memory: "512Mi"  # 预留512MB内存,保证调度优先级
    limits:
      cpu: "1"  # 最多占用1核CPU,避免抢占Spring应用资源
      memory: "1Gi"  # 限制最大内存1GB,彻底防止内存耗尽

补充优化:可以在MySQL容器中添加自定义my.cnf配置,将innodb_buffer_pool_size设置为512MB(匹配requests.memory),让MySQL内存使用更贴合K8s限制,减少OOM风险。

2. Spring Boot应用资源调整

结合内部工具的低负载特性,为Spring Boot应用配置如下资源,并同步调整JVM参数:

containers:
  - name: spring-app-api-testing
    # ... 保留原有所有配置
    resources:
      requests:
        cpu: "300m"  # 预留0.3核CPU
        memory: "1Gi"  # 预留1GB内存,满足JVM启动基础需求
      limits:
        cpu: "1.5"  # 最多占用1.5核CPU,应对突发请求
        memory: "2Gi"  # 限制最大内存2GB,为JVM留足空间
    env:
    # ... 保留原有环境变量
    - name: JAVA_OPTS
      value: "-Xmx1536m -Xms512m"  # JVM堆内存上限设为1.5GB,低于K8s内存限制

关键说明:JVM的-Xmx必须小于K8s的memory.limits,否则JVM内存溢出或被K8s强制终止,这里预留25%的缓冲空间是合理的。

3. 整体资源合理性验证

节点总内存4GB,扣除K8s系统组件(约512MB-1GB),剩余可用内存约3GB-3.5GB:

  • MySQL最多占用1GB,Spring Boot最多占用2GB,合计3GB,完全在节点可用内存范围内
  • CPU方面,节点共2核,两个Pod的CPU上限合计2.5核,K8s会通过CPU节流控制超额使用,不会导致节点崩溃

后续优化建议

  • 用kubectl top pods -n testing定期查看Pod实际资源占用,根据数据微调requests和limits
  • 开启Kubernetes Vertical Pod Autoscaler(VPA),让系统自动适配负载变化调整资源配置

内容的提问来源于stack exchange,提问作者Krzysztof Michalski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 08:10:24