从镜像到上线:华为云 CCE 部署 Java 微服务全流程实战

举报
行者·全栈架构师 发表于 2026/06/21 22:30:17 2026/06/21
【摘要】 从创建 CCE 集群开始,依次完成 Deployment/Service/Ingress 配置、滚动更新、弹性伸缩(HPA)、ConfigMap 配置管理、AOM 监控看板搭建。基于前3篇产出的镜像,上线运行完整的 Java 微服务。包含 4 组 Deployment 模板和 3 个部署踩坑记录。

本文由华为云开发者社区博主原创,遵循华为云社区内容发布规范。

💬 互动:你在华为云 CCE 上部署微服务时遇到最大的挑战是什么?弹性伸缩效果如何?评论区聊聊你的实战经验!

🎯 系列全链路收官

004-cce-deployment-guide_diagram_1.png

经过 (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 整体架构设计

004-cce-deployment-guide_diagram_2.png

🔧 第一步:创建 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

🔄 第四步:滚动更新与版本回滚

滚动更新流程

004-cce-deployment-guide_diagram_3.png

触发滚动更新

# 方式一:更新镜像版本(推荐)
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

回滚时机决策树

004-cce-deployment-guide_diagram_4.png

📈 第五步:弹性伸缩(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

004-cce-deployment-guide_diagram_5.png

📊 第六步:监控与告警(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 与容器内存关系

004-cce-deployment-guide_diagram_6.png

💡 经验公式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 端点摘除

完整流程

  1. K8s 将 Pod 从 Service Endpoints 摘除(不再转发新流量)
  2. K8s 发送 SIGTERM 到容器
  3. Spring Boot 收到信号,拒绝新请求,等待处理中请求完成
  4. 处理完所有请求后,JVM 退出
  5. 若 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 倍

📝 云原生实战系列总结

四篇文章回顾

004-cce-deployment-guide_diagram_7.png

全链路一站式 DevOps

通过云原生实战系列 4 篇文章,你已完整掌握:

能力 对应文章 核心技能
🧠 AI 编码实战 第1篇 CodeArts IDE 安装配置、AI 代码补全、智能问答
🔧 CI/CD 流水线实战 第2篇 Pipeline 模板、质量门禁、多分支自动部署
🐳 镜像构建实战 第3篇 Jib 配置、Dockerfile 优化、多架构构建
☁️ CCE 部署实战 第4篇 CCE 集群、滚动更新、HPA 弹性伸缩、监控告警

核心收益

从编码到上线,全流程自动化,15 分钟完成一次发布,部署频率提升 70 倍。


👍 互动引导

  1. 看完云原生实战系列 4 篇文章,你目前在哪一步?评论区告诉我你的进度!
  2. 你的 Java 应用还在用传统部署方式吗?容器化最担心的问题是什么?
  3. 如果觉得整个系列对你有帮助,请点赞收藏,让我有动力继续创作更多实战内容 🙏

云原生实战系列导航(完结)

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。