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

