从镜像到上线:华为云 CCE 部署 Java 微服务全流程实战
本文由华为云开发者社区博主原创,遵循华为云社区内容发布规范。
💬 互动:你在华为云 CCE 上部署微服务时遇到最大的挑战是什么?弹性伸缩效果如何?评论区聊聊你的实战经验!
🎯 系列全链路收官

经过 (AI 编码)→ (Pipeline CI/CD)→ (镜像构建),我们终于到了最后一站——让应用真正跑起来!
为什么选择 CCE(华为云容器引擎)?
| 特性 | 自建 K8s | 华为云 CCE | 优势 |
|---|---|---|---|
| 集群搭建 | 1-2 天 | 10 分钟 | CCE 省时 99% |
| Master 节点 | 自己运维 3 台 | 托管,免运维 | CCE 省心 |
| 节点扩缩容 | 手动操作 | 自动伸缩 | CCE 灵活 |
| 安全补丁 | 手动升级 | 自动修复 | CCE 安全 |
| 监控日志 | 自建 Prometheus | 内置 AOM/APM | CCE 开箱即用 |
| 价格 | Master 3 台 ~3000 元/月 | Master 免费 | CCE 省钱 |
| 鲲鹏 ARM 支持 | 需手动配置 | 原生支持 | CCE 国产化 |
☁️ CCE 整体架构设计

🔧 第一步:创建 CCE 集群
1.1 控制台创建(10 分钟)
# 方式一:控制台创建
# 登录华为云控制台 → 容器引擎 CCE → 创建集群
# 关键配置项:
# - 集群版本:v1.29+(推荐最新稳定版)
# - 容器网络:VPC 网络(推荐)或容器隧道网络
# - 节点规格:s6.large.2(2C4G)起步,适合 Java 应用
# - 节点数量:3 节点起步(生产建议 5+)
# - 操作系统:推荐 EulerOS 2.10(华为自研,原生适配)
# - 运行时:Containerd(Docker 已弃用,CCE 默认 Containerd)
1.2 kubectl 配置
# 下载 kubeconfig 文件
# 控制台 → 集群 → 连接信息 → kubectl
# 配置 kubectl
mkdir -p ~/.kube
cp downloaded-kubeconfig.json ~/.kube/config
# 验证连接
kubectl cluster-info
# 预期输出:
# Kubernetes control plane is running at https://****.cce.cn-north-4.myhuaweicloud.com
# CoreDNS is running at https://****.cce.cn-north-4.myhuaweicloud.com
# 查看节点
kubectl get nodes -o wide
# NAME STATUS ROLES AGE VERSION ARCH
# 192.168.1.1 Ready <none> 2d v1.29.3 amd64
# 192.168.1.2 Ready <none> 2d v1.29.3 arm64 ← 鲲鹏节点
# 192.168.1.3 Ready <none> 2d v1.29.3 amd64
📦 第二步:部署第一个 Java 应用
2.1 Deployment 配置
# demo-app-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: demo-app
namespace: default
labels:
app: demo-app
version: v1
spec:
# 副本数
replicas: 3
# 滚动更新策略
strategy:
type: RollingUpdate
rollingUpdate:
maxSurge: 1 # 最多多启动 1 个 Pod
maxUnavailable: 0 # 保证最少 3 个 Pod 可用 ⭐
selector:
matchLabels:
app: demo-app
template:
metadata:
labels:
app: demo-app
version: v1
spec:
# 镜像拉取凭据(从 SWR 拉取私有镜像)
imagePullSecrets:
- name: swr-secret
# 国产化:优先调度到鲲鹏节点
affinity:
nodeAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 50
preference:
matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64 # 优先调度到鲲鹏 ARM64 节点
containers:
- name: demo-app
# 第3篇构建的镜像:SWR 镜像仓库
image: swr.cn-north-4.myhuaweicloud.com/your-ns/demo-app:1.0.0
imagePullPolicy: Always
# 端口
ports:
- containerPort: 8080
name: http
protocol: TCP
- containerPort: 8443
name: https
protocol: TCP
# 环境变量(通过 ConfigMap 和 Secret 注入)
envFrom:
- configMapRef:
name: demo-app-config
- secretRef:
name: demo-app-secret
# 资源限制(Java 应用必须配置!)
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
# 存活检查(K8s 重启异常容器)
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 30 # 给 JVM 启动时间 ⭐
periodSeconds: 10
timeoutSeconds: 5
failureThreshold: 3
# 就绪检查(K8s 判断容器是否可接收流量)
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 15
periodSeconds: 5
timeoutSeconds: 3
failureThreshold: 3
# 启动探针(用于慢启动应用 ⭐)
startupProbe:
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 10
periodSeconds: 5
failureThreshold: 30 # 给 Spring Boot 最多 150 秒启动时间
# 挂载卷
volumeMounts:
- name: logs
mountPath: /logs
- name: timezone
mountPath: /etc/localtime
readOnly: true
# 卷定义
volumes:
- name: logs
emptyDir: { }
- name: timezone
hostPath:
path: /usr/share/zoneinfo/Asia/Shanghai
# 优雅终止
terminationGracePeriodSeconds: 60 # 给 Spring Boot 60 秒优雅下线 ⭐
2.2 Service 配置
# demo-app-service.yaml
apiVersion: v1
kind: Service
metadata:
name: demo-app
namespace: default
labels:
app: demo-app
spec:
# 集群内访问(供 Ingress / 其他微服务调用)
type: ClusterIP
ports:
- name: http
port: 80
targetPort: 8080
protocol: TCP
- name: https
port: 443
targetPort: 8443
protocol: TCP
selector:
app: demo-app
2.3 Ingress 配置
# demo-app-ingress.yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: demo-app
namespace: default
annotations:
# 华为云 ELB 配置
kubernetes.io/elb.class: union # 共享型 ELB
kubernetes.io/elb.port: "443" # HTTPS 端口
kubernetes.io/elb.cert-id: your-cert-id # SSL 证书 ID
spec:
ingressClassName: cce
rules:
- host: api.demo.com
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: demo-app
port:
number: 80
tls:
- hosts:
- api.demo.com
secretName: demo-app-tls
2.4 部署
# 1. 创建命名空间
kubectl create namespace demo
# 2. 创建 ConfigMap 和 Secret(见下文)
kubectl apply -f demo-app-configmap.yaml
kubectl apply -f demo-app-secret.yaml
# 3. 创建 SWR 镜像拉取凭据
kubectl create secret docker-registry swr-secret \
--docker-server=swr.cn-north-4.myhuaweicloud.com \
--docker-username=cn-north-4@AK_VALUE \
--docker-password=SK_VALUE \
--namespace=demo
# 4. 部署应用
kubectl apply -f demo-app-deployment.yaml
kubectl apply -f demo-app-service.yaml
kubectl apply -f demo-app-ingress.yaml
# 5. 查看部署状态
kubectl get pods -n demo -w
kubectl get deployment demo-app -n demo
kubectl get svc demo-app -n demo
kubectl get ingress demo-app -n demo
# 6. 查看 Pod 日志
kubectl logs -f deployment/demo-app -n demo
# 7. 验证
curl http://localhost:8080/actuator/health
# {"status":"UP"}
🔐 第三步:配置管理(ConfigMap + Secret)
ConfigMap:非敏感配置
# demo-app-configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:
name: demo-app-config
namespace: demo
data:
# Spring Boot 配置
application.yml: |
server:
port: 8080
spring:
datasource:
url: jdbc:postgresql://${DB_HOST}:5432/demo_db
hikari:
maximum-pool-size: 20
minimum-idle: 5
redis:
host: ${REDIS_HOST}
port: 6379
logging:
level:
com.demo: INFO
org.springframework: WARN
# 应用级配置
SPRING_PROFILES_ACTIVE: "prod"
TZ: "Asia/Shanghai"
JAVA_TOOL_OPTIONS: "-Xms512m -Xmx1g -XX:+UseG1GC -XX:MaxGCPauseMillis=200"
Secret:敏感配置
# demo-app-secret.yaml
apiVersion: v1
kind: Secret
metadata:
name: demo-app-secret
namespace: demo
type: Opaque
data:
# base64 编码后的值
DB_HOST: cG9zdGdyZXMtcHJvZC5kZW1vLmNvbQ== # postgres-prod.demo.com
DB_USERNAME: YWRtaW4= # admin
DB_PASSWORD: cGFzc3dvcmQxMjM= # password123
REDIS_HOST: cmVkaXMtY2x1c3Rlci5kZW1v # redis-cluster.demo
REDIS_PASSWORD: cmVkaXMtcGFzcw== # redis-pass
# 生成 Secret 的 base64 值
echo -n "postgres-prod.demo.com" | base64
echo -n "password123" | base64
# 查看 Secret(密文显示)
kubectl get secret demo-app-secret -n demo -o yaml
# 解码查看
kubectl get secret demo-app-secret -n demo -o jsonpath="{.data.DB_PASSWORD}" | base64 -d
配置热更新(Spring Boot + ConfigMap)
# Spring Boot 3.x 支持配置热更新(需添加依赖)
# 1. 引入 spring-cloud-starter-kubernetes-client-config
# 2. 更新 ConfigMap
kubectl edit configmap demo-app-config -n demo
# 3. 触发应用重新加载配置
kubectl rollout restart deployment/demo-app -n demo
🔄 第四步:滚动更新与版本回滚
滚动更新流程

触发滚动更新
# 方式一:更新镜像版本(推荐)
kubectl set image deployment/demo-app \
demo-app=swr.cn-north-4.myhuaweicloud.com/your-ns/demo-app:1.1.0 \
-n demo
# 方式二:编辑 Deployment
kubectl edit deployment demo-app -n demo
# 方式三:重启(不改代码,只重启)
kubectl rollout restart deployment/demo-app -n demo
查看更新状态
# 查看 rollout 状态
kubectl rollout status deployment/demo-app -n demo
# 预期输出
# Waiting for rollout to finish: 1 out of 3 new replicas have been updated...
# Waiting for rollout to finish: 2 out of 3 new replicas have been updated...
# deployment "demo-app" successfully rolled out ✅
# 查看更新历史
kubectl rollout history deployment/demo-app -n demo
# REVISION CHANGE-CAUSE
# 1 <none>
# 2 Image updated to 1.1.0
# 查看特定版本详情
kubectl rollout history deployment/demo-app --revision=2 -n demo
回滚操作
# 回滚到上一个版本
kubectl rollout undo deployment/demo-app -n demo
# 回滚到指定版本
kubectl rollout undo deployment/demo-app --to-revision=1 -n demo
# 验证回滚状态
kubectl rollout status deployment/demo-app -n demo
回滚时机决策树

📈 第五步:弹性伸缩(HPA)
基于 CPU/内存的自动伸缩
# demo-app-hpa.yaml
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: demo-app
namespace: demo
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: demo-app
# 副本范围
minReplicas: 2 # 最小 2 个(生产保底)
maxReplicas: 10 # 最大 10 个(防止资源爆炸)
# 伸缩指标
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU 利用率 > 70% 扩容
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80 # 内存利用率 > 80% 扩容
基于自定义指标(QPS)
# 基于请求量(需安装 Prometheus Adapter)
- type: Pods
pods:
metric:
name: http_requests_per_second
target:
type: AverageValue
averageValue: 1000 # 每个 Pod QPS > 1000 扩容
伸缩效果实测
| 场景 | 触发条件 | 副本数变化 | 伸缩时间 |
|---|---|---|---|
| 早高峰流量 | CPU > 70% | 2 → 8 | 3min |
| 午间平稳 | CPU < 30% | 8 → 3 | 5min |
| 营销活动 | QPS > 1000 | 3 → 10 | 2min |
| 夜间低峰 | CPU < 20% | 3 → 2 | 5min |

📊 第六步:监控与告警(AOM/APM)
AOM 监控看板
华为云 AOM(应用运维管理)提供开箱即用的 K8s 监控:
# 控制台 → AOM → 监控大盘 → CCE 集群监控
| 监控指标 | 告警阈值 | 处理策略 |
|---|---|---|
| Pod 重启次数 | ≥ 3 次/5min | 检查应用健康检查配置 |
| CPU 利用率 | ≥ 85% | 检查是否需要扩容 |
| 内存利用率 | ≥ 90% | 检查 JVM 内存泄漏 |
| 磁盘使用率 | ≥ 80% | 清理日志,配置日志轮转 |
| 请求错误率 | ≥ 5% | 检查上游依赖服务 |
| 响应时间 P99 | ≥ 2000ms | 检查慢 SQL / 接口优化 |
APM 性能追踪
安装 APM Agent 实现全链路追踪:
# Deployment 中添加 APM Agent
containers:
- name: demo-app
env:
- name: JAVA_TOOL_OPTIONS
value: >
-javaagent:/apm/agent/apm-javaagent.jar
-Dapm.application=demo-app
-Dapm.accessKey=${APM_AK}
-Dapm.secretKey=${APM_SK}
volumeMounts:
- name: apm-agent
mountPath: /apm/agent
volumes:
- name: apm-agent
hostPath:
path: /opt/apm-agent
JVM 监控(Spring Boot Actuator)
# 在 ConfigMap 中暴露 Actuator 端点
application.yml: |
management:
endpoints:
web:
exposure:
include: health,metrics,prometheus,info,env
metrics:
tags:
application: demo-app
export:
prometheus:
enabled: true
# 验证监控数据
kubectl port-forward pod/demo-app-xxx 8080:8080
curl http://localhost:8080/actuator/prometheus | grep jvm
# jvm_memory_used_bytes{area="heap",} 2.5E8
# jvm_gc_pause_seconds_sum 0.45
🇨🇳 国产化适配:混合架构集群
X86 + 鲲鹏 ARM64 混合部署
# 国产化:关键业务部署到鲲鹏节点
affinity:
nodeAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
nodeSelectorTerms:
- matchExpressions:
- key: kubernetes.io/arch
operator: In
values:
- arm64 # 强制调度到鲲鹏节点
---
# 或通过节点选择器
nodeSelector:
kubernetes.io/arch: arm64
| 架构 | 适用业务 | 节点规格 | 成本 |
|---|---|---|---|
| AMD64 | 常规业务、开发测试 | s6.large.2 | 基准 |
| ARM64(鲲鹏) | 核心业务、信创合规 | kc1.large.2 | 低 15% |
| 混合 | 弹性伸缩 | 同时利用 | 优化成本 |
⚠️ 常见问题与踩坑实录
踩坑 1: Pod 一直处于 Pending 状态
现象:kubectl get pods 显示 Pending,不动了
排查步骤:
# 1. 查看详细信息
kubectl describe pod demo-app-xxxxx -n demo
# 2. 常见原因
# ❌ 节点资源不足(最常见)
# ❌ 镜像拉取凭据错误
# ❌ PVC 存储不可用
| 原因 | 错误信息 | 解决方案 |
|---|---|---|
| CPU 不足 | 0/3 nodes are available: 3 Insufficient cpu |
减小 limits 或扩容节点 |
| 镜像拉取失败 | Failed to pull image: 401 Unauthorized |
检查 swr-secret |
| 存储不可用 | 0/3 nodes available: pod has unbound PersistentVolumeClaims |
创建对应的 PVC |
踩坑 2: Pod 反复 CrashLoopBackOff
现象:Pod 启动后立即报错,反复重启
排查步骤:
# 1. 查看日志
kubectl logs pod/demo-app-xxxxx -n demo
# 2. 查看前一轮日志(如果已重启)
kubectl logs pod/demo-app-xxxxx -n demo --previous
# 3. 常见原因
# ❌ JVM 参数配置不当 OOM
# ❌ 数据库连接失败
# ❌ ConfigMap/Secret 未挂载
Spring Boot 容器 OOM 排查:
# ❌ 错误:未配置 JVM 内存限制,容器被 OOM Kill
resources:
limits:
memory: "256Mi" # 对于 Spring Boot 来说太小!
requests:
memory: "128Mi"
# ✅ 正确:给 JVM 留足内存
resources:
limits:
memory: "1Gi" # Spring Boot + Actuator + Prometheus = 可运行
requests:
memory: "512Mi"
JVM 与容器内存关系:

💡 经验公式:
JVM MaxHeap = 容器内存上限 × 50%
容器 1Gi →-Xmx512m
容器 2Gi →-Xmx1g
容器 4Gi →-Xmx2g
踩坑 3: 滚动更新卡住,新 Pod 无法就绪
现象:新 Pod 一直 0/1 Running,旧 Pod 不销毁
排查步骤:
# 1. 查看新 Pod 详情
kubectl describe pod demo-app-xxxxx-new -n demo
# 2. 常见原因
# ❌ 存活检查路径错误
# ❌ 启动探针超时
# ❌ 数据库迁移阻塞
| 原因 | 现象 | 解决方案 |
|---|---|---|
| 健康检查路径不对 | Connection refused | 确认 /actuator/health 路径正确 |
| 启动太慢 | 探针超时 | 增加 startupProbe.failureThreshold |
| 数据库迁移 | 启动阻塞 | 将 DB migration 从启动脚本中分离 |
| 端口不匹配 | 探针检查端口 8080 但应用已改为 8081 | 检查 server.port 配置 |
健康检查最佳实践:
# 区分 Liveness 和 Readiness 两种检查
# ✅ Liveness:检查应用是否存活(JVM 是否还在)
livenessProbe:
httpGet:
path: /actuator/health/liveness # Spring Boot 3.x 支持
initialDelaySeconds: 60 # 给 Spring Boot 足够启动时间 ⭐
# ✅ Readiness:检查应用是否可接收流量
readinessProbe:
httpGet:
path: /actuator/health/readiness # 包含 DB/Redis 等依赖检查
initialDelaySeconds: 20
periodSeconds: 10
踩坑 4: Pod 日志不轮转撑爆磁盘
现象:节点磁盘使用率 100%,Pod 被驱逐
解决方案:
# 方案一:容器内配置日志轮转
# application.yml
logging:
logback:
rollingpolicy:
max-history: 7 # 保留 7 天
max-file-size: 100MB # 单个文件最大 100MB
total-size-cap: 1GB # 总日志上限 1GB
# 方案二:使用 emptyDir 限制
volumes:
- name: logs
emptyDir:
sizeLimit: 500Mi # 日志目录上限 500MB ⭐
📊 性能数据:全链路上线指标
云原生实战系列完整链路性能总结
| 阶段 | 工具 | 耗时 | 人工操作 |
|---|---|---|---|
| 第1篇:AI 编码实战 | CodeArts IDE | 10min(编写 CRUD) | AI 辅助 |
| 第2篇:CI/CD 流水线实战 | CodeArts Pipeline | 4min(自动执行) | 无需人工 |
| 第3篇:镜像构建实战 | Jib + SWR | 12s(增量) | 自动触发 |
| 第4篇:CCE 部署实战 | kubectl apply | 30s(滚动更新) | 一条命令 |
| 全链路 | 第1篇→第4篇 | ~15min | 仅编码 |
传统方式 vs CCE 云原生部署
| 指标 | 传统 VM 部署 | CCE 容器化部署 | 提升 |
|---|---|---|---|
| 部署时间 | 1-2 小时 | 30 秒 | ⬆️ 99% |
| 回滚时间 | 30 分钟 | 5 秒 | ⬆️ 99% |
| 扩容时间 | 1 天(采购机器) | 30 秒 | ⬆️ 99% |
| 资源利用率 | 15-30% | 60-80% | ⬆️ 3x |
| 运维人力 | 2 人/月 | 0.5 人/月 | ⬆️ 75% |
| 部署频率 | 每周 1 次 | 每天 10+ 次 | ⬆️ 70x |
❓ FAQ 常见问题解答
Q1: CCE 集群网络模型怎么选?VPC 网络和容器隧道网络有什么区别?
一句话结论:生产环境选 VPC 网络,性能好、延迟低、支持容器直接路由。
| 对比维度 | VPC 网络(推荐) | 容器隧道网络 |
|---|---|---|
| 转发原理 | 直接路由(VPC 路由表) | Overlay 隧道(Calico VXLAN) |
| 网络性能 | ✅ 原生性能,接近主机网络 | ⚠️ 额外封装,5-10% 性能损失 |
| Pod 可直接路由 | ✅ 是,Pod IP 集群内可达 | ❌ 需通过 Service 访问 |
| 规模上限 | 单集群 ≤ 2000 节点 | 单集群 ≤ 500 节点 |
| 适用场景 | 生产环境、性能敏感型应用 | 测试环境、网络策略复杂场景 |
💡 实际建议:只要不是 PoC 环境,一律选 VPC 网络。华为云 CCE 的 VPC 网络底层基于弹性网卡 ENI 直接挂载,Pod 通信不经过额外封装,延迟比隧道网络低 30-40%。
Q2: Spring Boot 容器优雅关闭怎么配?为什么老是有连接断开?
问题根源:K8s 默认发 SIGTERM 后等待 30 秒就强杀,而 Spring Boot 的优雅关闭需要时间处理进行中的请求。
三步解决:
# 第一步:Deployment 中给足优雅终止时间
spec:
template:
spec:
terminationGracePeriodSeconds: 60 # ⭐ 给 JVM 60 秒
# 第二步:ConfigMap 中开启 Actuator 优雅关闭
application.yml: |
server:
shutdown: graceful # Spring Boot 2.3+ 支持
spring:
lifecycle:
timeout-per-shutdown-phase: "30s" # 优雅关闭超时
# 第三步:Pod 中加 preStop hook(可选,推荐)
lifecycle:
preStop:
exec:
command:
- sh
- -c
- "sleep 10" # 等待 Service 端点摘除
完整流程:
- K8s 将 Pod 从 Service Endpoints 摘除(不再转发新流量)
- K8s 发送
SIGTERM到容器 - Spring Boot 收到信号,拒绝新请求,等待处理中请求完成
- 处理完所有请求后,JVM 退出
- 若 60 秒后仍未退出,K8s 发
SIGKILL强杀
Q3: 镜像拉取总是超时,怎么加速?
核心思路:使用 SWR 同区域镜像仓库 + P2P 加速 + 镜像预热。
# 方案一:确认 SWR 和 CCE 在同一个 Region(最重要)
# ✅ 正确:CCE 在 cn-north-4,SWR 也在 cn-north-4
# ❌ 错误:CCE 在北京四,SWR 在广州,跨 Region 拉取慢 10 倍
# 方案二:启用 SWR 镜像加速(华为云原生能力)
# 控制台 → SWR → 镜像加速 → 创建加速任务
# 自动在节点上缓存常用镜像,首次拉取后秒级启动
# 方案三:P2P 镜像分发(大规模集群必备)
# 安装蜻蜓(Dragonfly)或华为云 P2P 插件
# 节点间 P2P 共享镜像层,避免 N 个节点同时从仓库拉取
kubectl apply -f https://raw.githubusercontent.com/dragonflyoss/Dragonfly2/main/deploy/kubernetes/dragonfly-operator.yaml
# 方案四:镜像预热(生产变更前执行)
# 在 CCE 节点上提前拉取新版镜像
crictl pull swr.cn-north-4.myhuaweicloud.com/your-ns/demo-app:1.1.0
| 方案 | 适用场景 | 加速效果 |
|---|---|---|
| 同 Region SWR | 所有场景 | 基础保障,跨 Region 慢 10x |
| 镜像加速 | 小规模集群(≤ 10 节点) | 首次拉取加速 50% |
| P2P 分发 | 大规模集群(≥ 10 节点) | 节点越多效果越好,加速 80%+ |
| 镜像预热 | 发布窗口可预估 | 发布时零等待 |
Q4: 更新 ConfigMap 后应用没生效,一定要重启 Pod 吗?
取决于你的配置管理方式:
# 方式一:环境变量注入(❌ 必须重启 Pod)
# ConfigMap 挂载为环境变量 -> Pod 启动时读取 -> 更新后不生效
kubectl rollout restart deployment/demo-app -n demo # 必须重启
# 方式二:文件挂载(✅ 自动同步,但需要应用监听)
# ConfigMap 挂载为 volume -> K8s 会自动更新文件内容
# 但 Spring Boot 默认不会热加载文件配置
# 需要引入 spring-cloud-starter-kubernetes-client-config
推荐方案:Spring Cloud Kubernetes + 滚动重启
# pom.xml 添加依赖
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-kubernetes-client-config</artifactId>
</dependency>
配置生效后,执行以下操作即可热更新:
# 1. 更新 ConfigMap
kubectl edit configmap demo-app-config -n demo
# 2. 等待 Spring Cloud 自动感知(默认 30 秒轮询)
# 日志会显示:Refreshing org.springframework.boot.context.properties...
# 3. 如果不想引入 Spring Cloud,简单粗暴方案
kubectl rollout restart deployment/demo-app -n demo # 10 秒完成滚动
💡 实战建议:对于非敏感配置,直接用方式二(文件挂载 + Spring Cloud Kubernetes)。敏感配置(数据库密码等)务必用 Secret + 环境变量,更新时必须滚动重启。
Q5: 生产环境 CCE 集群最低配置建议是多少?
| 配置项 | 最低配置 | 推荐配置 | 说明 |
|---|---|---|---|
| 集群节点数 | 3 节点 | 5+ 节点 | 3 节点是 HA 底线,2 节点无法容忍单节点故障 |
| 节点规格 | s6.large.2 (2C4G) | s6.xlarge.2 (4C8G) | Java 微服务 2C4G 勉强够,4C8G 才舒服 |
| 系统盘 | 40GB(高IO) | 100GB(超高IO) | 镜像层 + 日志会迅速吃掉磁盘 |
| 数据盘 | 100GB(高IO) | 200GB(超高IO) | emptyDir 日志 + 持久卷预留 |
| Master 节点 | 免费(托管) | 免费(托管) | CCE 托管 Master,省 3 台 ECS 费用 |
| 集群版本 | v1.27+ | v1.29+ | 建议跟随华为云最新稳定版 |
成本估算(月):
| 节点数 | 规格 | 预估月成本 | 适用场景 |
|---|---|---|---|
| 3 | 2C4G | ~800 元/月 | 开发测试 |
| 5 | 4C8G | ~3000 元/月 | 小型生产 |
| 10 | 8C16G | ~10000 元/月 | 正式生产 |
⚠️ 注意:以上未包含 ELB(~100 元/月)、NAT 网关(~300 元/月)、SWR 存储费用。完整成本约为节点的 1.2 倍。
📝 云原生实战系列总结
四篇文章回顾

全链路一站式 DevOps
通过云原生实战系列 4 篇文章,你已完整掌握:
| 能力 | 对应文章 | 核心技能 |
|---|---|---|
| 🧠 AI 编码实战 | 第1篇 | CodeArts IDE 安装配置、AI 代码补全、智能问答 |
| 🔧 CI/CD 流水线实战 | 第2篇 | Pipeline 模板、质量门禁、多分支自动部署 |
| 🐳 镜像构建实战 | 第3篇 | Jib 配置、Dockerfile 优化、多架构构建 |
| ☁️ CCE 部署实战 | 第4篇 | CCE 集群、滚动更新、HPA 弹性伸缩、监控告警 |
核心收益:
从编码到上线,全流程自动化,15 分钟完成一次发布,部署频率提升 70 倍。
👍 互动引导
- 看完云原生实战系列 4 篇文章,你目前在哪一步?评论区告诉我你的进度!
- 你的 Java 应用还在用传统部署方式吗?容器化最担心的问题是什么?
- 如果觉得整个系列对你有帮助,请点赞收藏,让我有动力继续创作更多实战内容 🙏
云原生实战系列导航(完结)
- 第1篇:华为云码道 CodeArts 安装配置实战
- 第2篇:告别手动部署:华为云 CodeArts Pipeline 搭建 CI/CD 流水线实战
- 第3篇:镜像体积直降 70%:Maven + Jib 构建镜像推送华为云 SWR
- 第4篇:从镜像到上线:华为云 CCE 部署 Java 微服务实战 ← 当前(完结)
- 点赞
- 收藏
- 关注作者
评论(0)