ithuang
ithuang
发布于 2026-06-06 / 3 阅读
0

开源电商微服务 K8s 生产级部署

开源电商微服务 K8s 生产级部署方案,共 17 个 YAML 文件,完整覆盖你要求的 10 个核心知识点。


一、项目架构设计

基于开源电商项目(mall / 7d-mall-microservice 架构简化),我设计了如下微服务架构:

┌─────────────────────────────────────────────────────────────┐
│                        Internet                              │
└──────────────┬──────────────────────────────────────────────┘
               │
        ┌──────▼──────┐
        │   Ingress    │  ← 知识点3:七层路由、SSL终止、域名分发
        │  Controller    │
        └──────┬──────┘
               │
    ┌──────────┼──────────┐
    │          │          │
┌───▼───┐ ┌───▼───┐ ┌───▼────┐
│shop.  │ │api.   │ │api.    │
│ecom.  │ │ecom.  │ │ecom.   │
│com    │ │/user  │ │/product│
└───┬───┘ └───┬───┘ └───┬────┘
    │         │         │
┌───▼─────────▼─────────▼────┐
│    Gateway Service (2副本)  │  ← 统一入口、鉴权、路由
└───┬─────────┬─────────┬────┘
    │         │         │
┌───▼───┐ ┌───▼───┐ ┌───▼────┐
│ User  │ │Product│ │ Order  │
│Service│ │Service│ │Service │
│ 3副本 │ │ 3副本 │ │ 3副本  │
│ +HPA  │ │ +HPA  │ │ +HPA   │
└───┬───┘ └───┬───┘ └───┬────┘
    │         │         │
┌───▼─────────┴─────────▼────┐
│  MySQL (StatefulSet+PV)    │  ← 知识点5:数据持久化
│  Redis (Deployment+PVC)     │
│  RabbitMQ (StatefulSet)    │
└─────────────────────────────┘

二、完整部署文件包

我已生成全部生产级 YAML,按执行顺序编号:

文件覆盖知识点说明
01-namespace.yaml-创建 ecommerce 命名空间
02-harbor-secret.yaml7. Harbor私有仓库拉取认证
03-configmap.yaml4. ConfigMap非敏感配置集中管理
04-secret.yaml4. Secret密码、JWT密钥等敏感数据
05-storage.yaml5. PV/PVCStorageClass + 本地PV
06-mysql.yaml1. Pod生命周期 + 5. PV/PVCStatefulSet + 探针 + 优雅终止
07-redis.yaml5. PV/PVC缓存持久化
08-rabbitmq.yaml5. PV/PVC消息队列
09-user-service.yaml1. Pod生命周期 + 2. Deployment滚动更新 + 6. HPA用户服务完整配置
10-product-service.yaml同上商品服务
11-order-service.yaml同上订单服务
12-gateway.yaml2. Deployment滚动更新网关服务
13-ingress.yaml3. Service与Ingress七层路由、HTTPS、限流
14-frontend.yaml2. Deployment前端页面
15-servicemonitor.yaml8. Prometheus+Grafana自动发现监控目标
16-loki-promtail.yaml9. EFK/Loki日志采集 DaemonSet
17-troubleshoot.sh10. 故障排查一键排查脚本

下载全部部署文件: k8s-ecommerce 部署包


三、按知识点拆解实战

1. Pod 生命周期(06-mysql.yaml、09-user-service.yaml)

原理应用:

  • PostStart/PreStop:MySQL 容器配置了 preStop 钩子,先 sleep 10 秒让连接排空,再执行 mysqladmin shutdown,避免强制 Kill 导致数据损坏。
  • 探针体系:
    • livenessProbe:连续 3 次失败则重启容器(自愈)
    • readinessProbe:未就绪时不接收流量(防止流量打入正在启动的 Pod)

关键配置:

lifecycle:
  preStop:
    exec:
      command: ["/bin/sh", "-c", "sleep 10 && mysqladmin -u root -p${MYSQL_ROOT_PASSWORD} shutdown"]
livenessProbe:
  httpGet:
    path: /actuator/health/liveness
    port: 8080
  initialDelaySeconds: 60
  periodSeconds: 10
  failureThreshold: 3
readinessProbe:
  httpGet:
    path: /actuator/health/readiness
    port: 8080
  initialDelaySeconds: 30
  periodSeconds: 5

2. Deployment 滚动更新与回滚(09-11 业务服务)

原理应用:

  • maxUnavailable: 0:确保更新过程中零停机,先起新 Pod 再删旧 Pod
  • maxSurge: 1:更新时最多多出 1 个 Pod,控制资源突增

实战命令:

# 1. 首次部署
kubectl apply -f 09-user-service.yaml

# 2. 镜像版本升级(滚动更新)
kubectl set image deployment/user-service \
  user-service=harbor.company.com/ecommerce/user-service:v1.1.0 \
  -n ecommerce

# 3. 观察滚动过程
kubectl rollout status deployment/user-service -n ecommerce

# 4. 查看历史版本
kubectl rollout history deployment/user-service -n ecommerce

# 5. 发现异常,立即回滚
kubectl rollout undo deployment/user-service -n ecommerce
# 或回滚到指定版本
kubectl rollout undo deployment/user-service --to-revision=2 -n ecommerce

3. Service 与 Ingress(09-14 + 13-ingress.yaml)

四层 Service(ClusterIP):

  • 每个微服务都有 ClusterIP Service,供集群内部通过 DNS 调用:
    • user-service.ecommerce.svc.cluster.local
    • product-service.ecommerce.svc.cluster.local

七层 Ingress:

  • 域名 api.ecommerce.com 统一入口
  • 路径 /api/user → user-service
  • 路径 /api/product → product-service
  • 域名 shop.ecommerce.com → 前端页面
  • 配置 SSL 证书自动签发(cert-manager)和请求限流

4. ConfigMap / Secret(03、04)

ConfigMap(非敏感):

  • 数据库地址、Redis 地址、JVM 参数、日志级别
  • 修改配置无需重新打镜像,直接改 ConfigMap 后滚动重启即可

Secret(敏感):

  • 数据库密码、JWT 签名密钥、RabbitMQ 密码
  • 使用 stringData 自动 Base64 编码,避免明文提交
  • 通过 valueFrom.secretKeyRef 注入容器环境变量

最佳实践:

# 修改配置后热更新(需应用支持动态刷新,或滚动重启)
kubectl edit configmap ecommerce-config -n ecommerce
kubectl rollout restart deployment/user-service -n ecommerce

5. PV / PVC 存储(05、06、07、08)

架构设计:

  • MySQL 使用 StatefulSet + volumeClaimTemplates,每个 Pod 有独立 PVC,数据与 Pod 生命周期解耦
  • Redis 开启 AOF 持久化,挂载 PVC 防止重启丢数据
  • RabbitMQ 消息队列数据持久化

关键流程:

  1. 创建 StorageClass(本地测试用 no-provisioner,生产用 aws-ebs/ceph-rbd)
  2. 创建 PersistentVolume(预先分配存储)
  3. StatefulSet 通过 volumeClaimTemplates 自动创建 PVC 并绑定 PV
  4. Pod 重启后,PVC 重新挂载原数据

6. HPA 自动扩容(09、10、11)

配置亮点:

  • 基于 CPU 70% + 内存 80% 双指标扩容
  • scaleDown.stabilizationWindowSeconds: 300:缩容冷却 5 分钟,防止流量毛刺导致反复扩缩
  • Order 服务配置 maxReplicas: 30,应对秒杀场景

验证命令:

# 查看 HPA 状态
kubectl get hpa -n ecommerce

# 模拟压测(安装 hey 工具)
hey -z 5m -c 100 https://api.ecommerce.com/api/user/list

# 观察 Pod 自动扩容
watch kubectl get pods -n ecommerce

7. Harbor 私有仓库(02、09-14)

实现方式:

  1. 在 Harbor 创建 ecommerce 项目,上传镜像

  2. 生成 docker-registry 类型的 Secret:

    kubectl create secret docker-registry harbor-secret \
      --docker-server=harbor.company.com \
      --docker-username=admin \
      --docker-password=Harbor12345 \
      --namespace=ecommerce
    
  3. 在每个 Deployment 的 spec.imagePullSecrets 中引用

  4. 镜像地址格式:harbor.company.com/ecommerce/user-service:v1.0.0

进阶: 可绑定 ServiceAccount 自动注入,避免每个 YAML 重复写。


8. Prometheus + Grafana 监控(15-servicemonitor.yaml)

部署前提:

helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace

自动发现原理:

  • 业务 Pod 带 prometheus.io/scrape: "true" 注解
  • ServiceMonitor 通过 Label Selector 自动匹配 Service
  • Prometheus 每 15 秒抓取 /actuator/prometheus 端点

监控指标:

  • JVM 内存、GC 次数、线程数
  • HTTP 请求 QPS、延迟、错误率
  • 自定义业务指标:订单量、支付成功率

Grafana 面板:

  • 导入 JVM Micrometer 模板(ID:4701)
  • 导入 K8s 集群资源模板(ID:315)

9. EFK / Loki 日志平台(16-loki-promtail.yaml)

架构选择:PLG(Promtail + Loki + Grafana)

  • 比 EFK 轻量,存储成本降低 80%
  • 日志标签与 K8s 标签一致,方便联动查询

部署方式:

helm install loki grafana/loki-stack \
  --namespace logging --set grafana.enabled=true

Promtail 配置:

  • DaemonSet 部署在每个 Node,采集 /var/log/containers/*.log
  • 自动提取 Pod 名、Namespace、容器名作为标签

Grafana 查询示例:

{namespace="ecommerce", app="order-service"} |= "ERROR"
{namespace="ecommerce", pod_name=~"order-.*"} |= "timeout"

10. K8s 故障排查(17-troubleshoot.sh)

我已为你准备了一键排查脚本,覆盖 5 大经典故障场景:

故障现象排查命令根因修复方案
CrashLoopBackOffkubectl logs --previous应用启动报错、依赖缺失查看崩溃前日志,修复代码或配置
ImagePullBackOffkubectl describe pod镜像不存在、Harbor 认证失败确认镜像标签、检查 imagePullSecret
Pendingkubectl describe pod资源不足、节点污点、PVC 未绑定扩容节点、清理资源、检查 StorageClass
OOMKilledkubectl describe pod内存 Limit 过低、内存泄漏调高 limits.memory 或排查内存泄漏
Evictedkubectl get pod节点磁盘/内存压力清理节点日志/镜像,或扩容集群

一键执行:

chmod +x 17-troubleshoot.sh
./17-troubleshoot.sh

四、完整部署执行流程

前置准备

# 1. 准备 K8s 集群(1.26+)
# 2. 安装 Ingress Controller
kubectl apply -f https://raw.githubusercontent.com/kubernetes/ingress-nginx/controller-v1.8.2/deploy/static/provider/cloud/deploy.yaml

# 3. 安装 Metrics Server(HPA 依赖)
kubectl apply -f https://github.com/kubernetes-sigs/metrics-server/releases/latest/download/components.yaml

# 4. 安装 cert-manager(Ingress TLS 依赖)
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml

# 5. 安装 Prometheus + Grafana
helm install kube-prometheus-stack prometheus-community/kube-prometheus-stack \
  --namespace monitoring --create-namespace

# 6. 安装 Loki + Promtail
helm install loki grafana/loki-stack --namespace logging --create-namespace

部署电商系统

# 进入部署目录
cd k8s-ecommerce

# 按顺序执行(注意修改 harbor.company.com 为你的仓库地址)
kubectl apply -f 01-namespace.yaml
kubectl apply -f 02-harbor-secret.yaml
kubectl apply -f 03-configmap.yaml
kubectl apply -f 04-secret.yaml
kubectl apply -f 05-storage.yaml
kubectl apply -f 06-mysql.yaml
kubectl apply -f 07-redis.yaml
kubectl apply -f 08-rabbitmq.yaml
kubectl apply -f 09-user-service.yaml
kubectl apply -f 10-product-service.yaml
kubectl apply -f 11-order-service.yaml
kubectl apply -f 12-gateway.yaml
kubectl apply -f 13-ingress.yaml
kubectl apply -f 14-frontend.yaml
kubectl apply -f 15-servicemonitor.yaml
kubectl apply -f 16-loki-promtail.yaml

验证部署

# 查看所有 Pod 状态
kubectl get pods -n ecommerce

# 查看 HPA
kubectl get hpa -n ecommerce

# 查看 Ingress
kubectl get ingress -n ecommerce

# 查看 PV/PVC
kubectl get pv,pvc -n ecommerce

# 压测验证 HPA(需要安装 hey)
hey -z 3m -c 50 https://api.ecommerce.com/api/product/list

五、镜像构建说明(补充)

如果你需要构建业务镜像,可参考以下 Dockerfile(以 Spring Boot 为例):

# 多阶段构建
FROM eclipse-temurin:17-jdk-alpine as builder
WORKDIR /app
COPY . .
RUN ./mvnw clean package -DskipTests

FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
COPY --from=builder /app/target/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

构建并推送到 Harbor:

docker build -t harbor.company.com/ecommerce/user-service:v1.0.0 .
docker push harbor.company.com/ecommerce/user-service:v1.0.0

这套方案完整串联了 10 个 K8s 核心知识点,从基础设施层(存储、网络)到应用层(微服务部署、弹性伸缩),再到可观测层(监控、日志、故障排查),形成闭环。你可以直接下载 YAML 包,修改仓库地址和域名后即可在生产环境部署。