开源电商微服务 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.yaml | 7. Harbor | 私有仓库拉取认证 |
03-configmap.yaml | 4. ConfigMap | 非敏感配置集中管理 |
04-secret.yaml | 4. Secret | 密码、JWT密钥等敏感数据 |
05-storage.yaml | 5. PV/PVC | StorageClass + 本地PV |
06-mysql.yaml | 1. Pod生命周期 + 5. PV/PVC | StatefulSet + 探针 + 优雅终止 |
07-redis.yaml | 5. PV/PVC | 缓存持久化 |
08-rabbitmq.yaml | 5. PV/PVC | 消息队列 |
09-user-service.yaml | 1. Pod生命周期 + 2. Deployment滚动更新 + 6. HPA | 用户服务完整配置 |
10-product-service.yaml | 同上 | 商品服务 |
11-order-service.yaml | 同上 | 订单服务 |
12-gateway.yaml | 2. Deployment滚动更新 | 网关服务 |
13-ingress.yaml | 3. Service与Ingress | 七层路由、HTTPS、限流 |
14-frontend.yaml | 2. Deployment | 前端页面 |
15-servicemonitor.yaml | 8. Prometheus+Grafana | 自动发现监控目标 |
16-loki-promtail.yaml | 9. EFK/Loki | 日志采集 DaemonSet |
17-troubleshoot.sh | 10. 故障排查 | 一键排查脚本 |
下载全部部署文件: 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 再删旧 PodmaxSurge: 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):
- 每个微服务都有
ClusterIPService,供集群内部通过 DNS 调用:user-service.ecommerce.svc.cluster.localproduct-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 消息队列数据持久化
关键流程:
- 创建
StorageClass(本地测试用no-provisioner,生产用aws-ebs/ceph-rbd) - 创建
PersistentVolume(预先分配存储) - StatefulSet 通过
volumeClaimTemplates自动创建 PVC 并绑定 PV - 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)
实现方式:
-
在 Harbor 创建
ecommerce项目,上传镜像 -
生成
docker-registry类型的 Secret:kubectl create secret docker-registry harbor-secret \ --docker-server=harbor.company.com \ --docker-username=admin \ --docker-password=Harbor12345 \ --namespace=ecommerce -
在每个 Deployment 的
spec.imagePullSecrets中引用 -
镜像地址格式:
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 大经典故障场景:
| 故障现象 | 排查命令 | 根因 | 修复方案 |
|---|---|---|---|
| CrashLoopBackOff | kubectl logs --previous | 应用启动报错、依赖缺失 | 查看崩溃前日志,修复代码或配置 |
| ImagePullBackOff | kubectl describe pod | 镜像不存在、Harbor 认证失败 | 确认镜像标签、检查 imagePullSecret |
| Pending | kubectl describe pod | 资源不足、节点污点、PVC 未绑定 | 扩容节点、清理资源、检查 StorageClass |
| OOMKilled | kubectl describe pod | 内存 Limit 过低、内存泄漏 | 调高 limits.memory 或排查内存泄漏 |
| Evicted | kubectl 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 包,修改仓库地址和域名后即可在生产环境部署。