华为云CCE实战:从零到一,手把手教你部署SpringBoot+MySQL+Redis微服务项目
华为云CCE实战SpringBootMySQLRedis微服务云端部署全指南引言在数字化转型浪潮中将传统SpringBoot应用迁移至云端已成为开发者必备技能。华为云容器引擎CCE作为企业级Kubernetes服务为微服务部署提供了稳定高效的运行环境。本文将带您完成一个典型SpringBoot应用含MySQL和Redis依赖从本地开发到云端部署的全流程重点解决三个核心问题如何正确处理Docker镜像中的中文字符集等细节问题如何实现云上数据库初始化与数据迁移如何配置服务发现实现微服务间安全通信不同于简单的Hello World示例我们模拟真实业务场景涵盖镜像构建优化、持久化存储配置、服务网格集成等进阶内容。适合已有Docker和Kubernetes基础希望提升云原生实践能力的开发者。1. 环境准备与架构设计1.1 华为云资源规划在开始部署前需要合理规划云资源。以下是推荐的基础配置资源类型规格建议数量备注CCE集群虚拟机节点/50节点1选择与业务匹配的节点规格节点规格4核8GB/通用计算型2开发环境可适当降低配置弹性IP按需计费1用于外部访问云硬盘高性能SSD/100GB2分别用于MySQL和Redis数据持久化容器镜像仓库SWR标准版1建议与集群同区域提示生产环境建议启用多可用区部署并配置自动伸缩策略。测试环境可使用小规格资源降低成本。1.2 本地开发环境检查确保本地环境满足以下要求JDK 8推荐Amazon Corretto 11Maven 3.6Docker Desktop 4.12IntelliJ IDEA社区版即可MySQL Workbench可选Redis Desktop Manager可选验证环境是否就绪# 检查Java版本 java -version # 检查Maven mvn -v # 检查Docker docker --version2. 应用容器化与镜像优化2.1 SpringBoot应用Dockerfile深度优化标准Dockerfile往往忽略中文字符集、时区等细节问题。以下是经过生产验证的优化版本# 使用官方镜像作为基础 FROM eclipse-temurin:11-jre-jammy # 设置时区与字符集 ENV TZAsia/Shanghai \ LANGC.UTF-8 # 安装中文字体解决验证码等问题 RUN apt-get update \ apt-get install -y --no-install-recommends \ fonts-wqy-microhei \ fonts-wqy-zenhei \ ttf-mscorefonts-installer \ rm -rf /var/lib/apt/lists/* # 创建应用目录 RUN mkdir -p /app/logs WORKDIR /app # 复制JAR文件Maven打包后的产物 COPY target/your-app-*.jar app.jar # 暴露端口 EXPOSE 8080 # 启动命令考虑JVM参数优化 ENTRYPOINT [java, \ -server, \ -XX:UseG1GC, \ -XX:MaxRAMPercentage75.0, \ -Djava.security.egdfile:/dev/./urandom, \ -jar, \ app.jar]关键优化点使用eclipse-temurin替代openjdk获得更好的许可证支持显式设置时区和UTF-8字符集预装常用中文字体合理的JVM内存配置自动适应容器内存限制2.2 多阶段构建与镜像瘦身对于生产环境推荐使用多阶段构建减少镜像体积# 构建阶段 FROM maven:3.8.6-eclipse-temurin-11 AS build WORKDIR /workspace COPY pom.xml . RUN mvn dependency:go-offline COPY src src RUN mvn package -DskipTests # 运行时阶段 FROM eclipse-temurin:11-jre-jammy # ...保持之前的优化配置 COPY --frombuild /workspace/target/*.jar app.jar # ...其余配置不变这种构建方式可以将典型SpringBoot应用镜像从300MB缩减到150MB左右。3. 华为云CCE集群配置3.1 创建Kubernetes集群在华为云控制台完成CCE集群创建登录华为云控制台进入CCE服务选择购买集群填写基本信息集群名称dev-cluster版本选择最新稳定版如v1.25网络模型VPC网络容器网络选择与VPC不冲突的CIDR添加节点选择虚拟机节点规格s6.large.22核4GB系统盘高IO/100GB数量2高级设置启用自动修复配置SSH密钥对确认配置并创建约5-10分钟注意生产环境建议至少3个节点并启用多可用区部署。3.2 配置kubectl访问安装最新版kubectl后获取集群连接信息# 下载集群配置文件 curl -O https://my-cluster.cce.cn-north-4.myhuaweicloud.com/config # 设置KUBECONFIG环境变量 export KUBECONFIG./config # 验证连接 kubectl get nodes预期输出应显示2个Ready状态的节点。4. 数据库服务部署4.1 MySQL有状态部署使用StatefulSet确保数据库稳定运行# mysql-statefulset.yaml apiVersion: apps/v1 kind: StatefulSet metadata: name: mysql spec: serviceName: mysql replicas: 1 selector: matchLabels: app: mysql template: metadata: labels: app: mysql spec: containers: - name: mysql image: mysql:5.7 env: - name: MYSQL_ROOT_PASSWORD value: your-strong-password - name: MYSQL_DATABASE value: app_db ports: - containerPort: 3306 volumeMounts: - name: mysql-data mountPath: /var/lib/mysql volumeClaimTemplates: - metadata: name: mysql-data spec: accessModes: [ ReadWriteOnce ] storageClassName: csi-disk resources: requests: storage: 100Gi应用配置并验证kubectl apply -f mysql-statefulset.yaml kubectl get pods -l appmysql4.2 数据初始化技巧将本地SQL文件导入云上MySQL# 将SQL文件拷贝到集群节点 scp -i your-key.pem init.sql rootnode-ip:/tmp/ # 获取MySQL Pod名称 MYSQL_POD$(kubectl get pods -l appmysql -o jsonpath{.items[0].metadata.name}) # 拷贝到容器内 kubectl cp /tmp/init.sql $MYSQL_POD:/tmp/ # 执行导入 kubectl exec $MYSQL_POD -- \ mysql -uroot -pyour-strong-password app_db /tmp/init.sql5. 应用部署与服务暴露5.1 部署SpringBoot应用创建Deployment和Service# springboot-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: springboot-app spec: replicas: 2 selector: matchLabels: app: springboot-app template: metadata: labels: app: springboot-app spec: containers: - name: app image: swr.cn-north-4.myhuaweicloud.com/your-namespace/your-app:v1.0 ports: - containerPort: 8080 env: - name: SPRING_DATASOURCE_URL value: jdbc:mysql://mysql:3306/app_db?useSSLfalse - name: SPRING_DATASOURCE_USERNAME value: root - name: SPRING_DATASOURCE_PASSWORD valueFrom: secretKeyRef: name: db-secret key: password - name: SPRING_REDIS_HOST value: redis --- apiVersion: v1 kind: Service metadata: name: springboot-app spec: selector: app: springboot-app ports: - protocol: TCP port: 80 targetPort: 80805.2 配置Ingress实现外部访问# ingress.yaml apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: app-ingress annotations: kubernetes.io/ingress.class: nginx spec: rules: - host: your-domain.com http: paths: - path: / pathType: Prefix backend: service: name: springboot-app port: number: 80应用配置后可通过域名访问您的应用。6. 运维与监控配置6.1 日志收集方案配置Fluent Bit实现日志集中收集# fluent-bit-config.yaml apiVersion: v1 kind: ConfigMap metadata: name: fluent-bit-config data: fluent-bit.conf: | [SERVICE] Flush 5 Daemon Off Log_Level info [INPUT] Name tail Path /var/log/containers/*.log Parser docker Tag kube.* Refresh_Interval 5 [OUTPUT] Name es Match * Host elasticsearch Port 9200 Logstash_Format On Logstash_Prefix logstash6.2 基础监控告警使用华为云AOM服务监控关键指标容器CPU使用率 70%持续5分钟内存使用率 80%持续5分钟Pod重启次数 3次/小时磁盘使用率 85%7. 安全加固实践7.1 网络策略配置限制数据库仅允许应用访问# network-policy.yaml apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: mysql-allow-only-app spec: podSelector: matchLabels: app: mysql policyTypes: - Ingress ingress: - from: - podSelector: matchLabels: app: springboot-app ports: - protocol: TCP port: 33067.2 敏感信息管理使用Kubernetes Secrets管理数据库密码# 创建Secret kubectl create secret generic db-secret \ --from-literalpasswordyour-strong-password在Deployment中通过secretKeyRef引用。8. 性能调优技巧8.1 JVM参数优化根据容器内存限制动态配置JVMenv: - name: JAVA_OPTS value: -XX:UseContainerSupport -XX:MaxRAMPercentage75.08.2 连接池配置优化HikariCP连接池# application-prod.properties spring.datasource.hikari.maximum-pool-size10 spring.datasource.hikari.minimum-idle5 spring.datasource.hikari.idle-timeout30000 spring.datasource.hikari.connection-timeout300009. 常见问题排查9.1 容器启动失败诊断# 查看Pod详情 kubectl describe pod pod-name # 查看容器日志 kubectl logs pod-name -c container-name # 进入运行中的容器 kubectl exec -it pod-name -- /bin/bash9.2 网络连接问题检查服务发现# 查看Service的ClusterIP kubectl get svc mysql # 从应用Pod测试连接 kubectl exec app-pod -- curl -v http://mysql:330610. 成本优化建议使用弹性伸缩HPA根据负载自动调整副本数设置Pod资源请求和限制避免资源浪费非生产环境可启用定时伸缩CronHPA使用Spot实例运行可中断的工作负载定期清理未使用的镜像和存储卷