Kubernetes电商微服务项目部署实战指南
一、项目概述与架构
1.1 项目背景
本文以"商城"(Wolf Mall)电商项目为例,演示如何将传统的微服务架构完整迁移到Kubernetes平台。该项目采用典型的微服务架构,包含商品服务、订单服务、会员服务、购物车服务、网关服务等多个独立模块。
1.2 技术栈
-
容器编排:Kubernetes
-
服务注册与配置中心:Nacos
-
API网关:Spring Cloud Gateway
-
数据库:MySQL
-
镜像仓库:阿里云容器镜像服务
-
日志管理:主机路径挂载
1.3 部署架构图
text
客户端 → Ingress(Nginx) → Gateway服务 → 各业务微服务
↓
Nacos注册中心
↓
MySQL数据库
二、微服务镜像准备与推送
2.1 登录镜像仓库
在部署前,需要将所有微服务打包成Docker镜像并推送到私有镜像仓库:
bash
# 登录阿里云镜像仓库 docker login --username=fox666 registry.cn-hangzhou.aliyuncs.com
2.2 打标签与推送
为每个微服务镜像打标签并推送到仓库:
bash
# 以商品服务为例 docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/fox666/wolfmall-product:[镜像版本号] docker push registry.cn-hangzhou.aliyuncs.com/fox666/wolfmall-product:[镜像版本号]
版本号建议:使用语义化版本号,如1.0.0、1.0.1等,便于版本管理和回滚。
2.3 创建镜像拉取密钥
对于私有镜像仓库,需要在K8s中创建Secret用于拉取镜像:
bash
kubectl create secret docker-registry myregistrykey --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=wolf666 --docker-password=xxx
参数说明:
-
myregistrykey:密钥名称,可自定义 -
docker-server:镜像仓库地址 -
docker-username:仓库用户名 -
docker-password:仓库密码
三、微服务Deployment部署
3.1 商品服务部署配置
创建wolfmall-product-deployment.yaml文件:
yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wolfmall-product-deployment
labels:
app: wolfmall-product
spec:
replicas: 2 # 副本数,根据负载调整
selector:
matchLabels:
app: wolfmall-product
template:
metadata:
labels:
app: wolfmall-product
spec:
hostNetwork: true # 主机网络模式,初学者建议使用
imagePullSecrets:
- name: myregistrykey # 引用私有仓库密钥
containers:
- name: wolfmall-product
image: registry.cn-hangzhou.aliyuncs.com/fox666/wolfmall-product:0.0.5
imagePullPolicy: Always # 镜像拉取策略
ports:
- containerPort: 8866 # 容器内部端口
env:
- name: TZ
value: Asia/Shanghai # 时区设置
- name: spring.cloud.nacos.config.server-addr
value: 192.168.65.174:8848 # Nacos配置中心地址
- name: LOG_FILE
value: /var/logs # 日志文件路径
volumeMounts:
- mountPath: /var/logs
name: log-volume
volumes:
- name: log-volume
hostPath:
path: /mydata/k8s-app/wolfmall-product/logs
关键配置解析:
-
hostNetwork: true:使用主机网络模式,简化网络配置,适合初学者
-
imagePullPolicy:
-
Always:每次创建Pod都重新拉取镜像(默认) -
IfNotPresent:宿主机不存在时才拉取 -
Never:只使用本地镜像
-
-
环境变量配置:通过环境变量传递应用配置
-
数据卷挂载:将日志目录挂载到主机路径,便于日志收集
3.2 部署执行与验证
bash
# 应用Deployment配置 kubectl apply -f wolfmall-product-deployment.yaml # 查看部署状态 kubectl get pods -l app=wolfmall-product # 查看Pod详细信息 kubectl describe pod [pod名称]
3.3 其他微服务部署
采用相同模式部署其他微服务,主要区别在于服务名称、镜像标签和端口号:
认证中心服务(端口:9999)
yaml
# wolfmall-authcenter-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wolfmall-authcenter-deployment
spec:
replicas: 1
template:
spec:
containers:
- name: wolfmall-authcenter
image: registry.cn-hangzhou.aliyuncs.com/fox666/wolfmall-authcenter:0.0.5
ports:
- containerPort: 9999
env:
- name: spring.cloud.nacos.config.server-addr
value: 192.168.65.174:8848
网关服务(端口:8888)
yaml
# wolfmall-gateway-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wolfmall-gateway-deployment
spec:
replicas: 1
template:
spec:
containers:
- name: wolfmall-gateway
image: registry.cn-hangzhou.aliyuncs.com/fox666/wolfmall-gateway:0.0.5
ports:
- containerPort: 8888
env:
- name: spring.cloud.nacos.config.server-addr
value: 192.168.65.174:8848
订单服务(端口:8844)
yaml
# wolfmall-order-curr-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wolfmall-order-curr-deployment
spec:
replicas: 1
template:
spec:
containers:
- name: wolfmall-order-curr
image: registry.cn-hangzhou.aliyuncs.com/fox666/wolfmall-order-curr:0.0.5
ports:
- containerPort: 8844
购物车服务(端口:8855)
yaml
# wolfmall-cart-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wolfmall-cart-deployment
spec:
replicas: 1
template:
spec:
containers:
- name: wolfmall-cart
image: registry.cn-hangzhou.aliyuncs.com/wolf666/wolfmall-cart:0.0.5
ports:
- containerPort: 8855
唯一ID服务(端口:8833)
yaml
# wolfmall-unqid-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wolfmall-unqid-deployment
spec:
replicas: 1
template:
spec:
containers:
- name: wolfmall-unqid
image: registry.cn-hangzhou.aliyuncs.com/wolf666/wolfmall-unqid:0.0.5
ports:
- containerPort: 8833
会员服务(端口:8877)
yaml
# wolfmall-member-deployment.yaml
apiVersion: apps/v1
kind: Deployment
metadata:
name: wolfmall-member-deployment
spec:
replicas: 1
template:
spec:
containers:
- name: wolfmall-member
image: registry.cn-hangzhou.aliyuncs.com/wolf666/wolfmall-member:0.0.5
ports:
- containerPort: 8877
四、Service配置与暴露
4.1 商品服务Service配置
创建wolfmall-product-service.yaml:
yaml
apiVersion: v1
kind: Service
metadata:
name: wolfmall-product-service
spec:
type: NodePort # 节点端口类型,可通过节点IP访问
selector:
app: wolfmall-product # 选择器,匹配Pod标签
ports:
- name: http
protocol: TCP
port: 8866 # Service端口
targetPort: 8866 # Pod容器端口
4.2 部署与验证
bash
# 应用Service配置 kubectl apply -f wolfmall-product-service.yaml # 查看Service详情 kubectl describe svc wolfmall-product-service # 查看分配的NodePort kubectl get svc wolfmall-product-service
4.3 访问测试
通过NodePort访问商品服务:
bash
# 获取节点IP和端口
NODE_IP=192.168.65.180 # 实际节点IP
NODE_PORT=30997 # 分配的NodePort
# 访问商品查询接口
curl http://${NODE_IP}:${NODE_PORT}/pms/productInfo/27
4.4 其他服务Service配置
所有微服务的Service配置结构相似,只需修改名称、选择器和端口:
yaml
# 通用模板
apiVersion: v1
kind: Service
metadata:
name: [服务名]-service
spec:
type: NodePort
selector:
app: [服务名]
ports:
- name: http
protocol: TCP
port: [服务端口]
targetPort: [服务端口]
五、Ingress网关配置
5.1 Ingress Controller安装
首先确保集群已安装Ingress Nginx Controller:
bash
# 查看Ingress Controller状态 kubectl get pods -n ingress-nginx -o wide # 安装命令参考官方文档 # https://kubernetes.github.io/ingress-nginx/deploy/#quick-start
5.2 创建Ingress资源
创建wolfmall-gateway-ingress.yaml:
yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
name: wolfmall-gateway-ingress
spec:
ingressClassName: nginx # 指定Ingress Controller
rules:
- host: gateway.wolf.com # 自定义域名
http:
paths:
- path: /
pathType: Prefix
backend:
service:
name: wolfmall-gateway-service # 后端Service
port:
number: 8888 # Service端口
5.3 应用与验证
bash
# 应用Ingress配置 kubectl apply -f wolfmall-gateway-ingress.yaml # 查看Ingress状态 kubectl get ing # 查看Ingress详情 kubectl describe ing wolfmall-gateway-ingress
5.4 本地hosts配置
在客户端机器配置hosts,将域名指向Ingress Controller节点IP:
bash
# Windows系统:C:WindowsSystem32driversetchosts # Linux/Mac系统:/etc/hosts # 添加记录(IP为Ingress部署节点IP) 192.168.65.137 gateway.wolf.com
5.5 访问测试
配置完成后,通过域名访问网关服务:
bash
curl http://gateway.wolf.com
六、外部中间件集成
6.1 K8s DNS验证
首先验证集群DNS服务是否正常:
bash
# 运行测试容器 kubectl run curl --image=radial/busyboxplus:curl -it --rm # 进入容器后执行 nslookup kubernetes.default # 预期输出 # Server: 10.96.0.10 # Address 1: 10.96.0.10 kube-dns.kube-system.svc.cluster.local # Name: kubernetes.default # Address 1: 10.96.0.1 kubernetes.default.svc.cluster.local
6.2 MySQL外部访问配置
对于集群外部的MySQL,通过Endpoint和Service进行映射:
创建mysql-product.yaml:
yaml
# Service定义
apiVersion: v1
kind: Service
metadata:
name: mysql-product
spec:
ports:
- name: mysql-product
port: 3306
protocol: TCP
targetPort: 3306
type: NodePort
# Endpoint定义(指向外部MySQL)
apiVersion: v1
kind: Endpoints
metadata:
name: mysql-product
subsets:
- addresses:
- ip: 192.168.65.71 # 外部MySQL服务器IP
ports:
- name: mysql-product
port: 3306
protocol: TCP
6.3 部署与验证
bash
# 应用配置 kubectl apply -f mysql-product.yaml # 指定命名空间部署 kubectl apply -f mysql-product.yaml -n wolfmall # 测试连接 kubectl run mysql-test --image=mysql:8.0 -it --rm -- mysql -hmysql-product.wolfmall -uroot -p
6.4 Nacos外部访问配置
创建nacos-external.yaml:
yaml
# Service定义
apiVersion: v1
kind: Service
metadata:
name: nacos
spec:
ports:
- port: 8848
name: nacos
targetPort: 8848
- port: 9848
name: client-rpc
targetPort: 9848
- port: 9849
name: raft-rpc
targetPort: 9849
type: NodePort
# Endpoint定义
apiVersion: v1
kind: Endpoints
metadata:
name: nacos
subsets:
- addresses:
- ip: 192.168.65.174 # 外部Nacos服务器IP
ports:
- port: 8848
name: nacos
- port: 9848
name: client-rpc
- port: 9849
name: raft-rpc
6.5 微服务连接Nacos配置
在微服务Deployment中,修改Nacos连接地址为K8s Service域名:
yaml
env: - name: spring.cloud.nacos.config.server-addr value: nacos.default:8848 # 使用K8s Service名称
域名解析规则:
-
完整格式:
[service-name].[namespace].svc.cluster.local -
简写格式:
[service-name].[namespace] -
同命名空间可省略namespace:
[service-name]
七、生产环境优化配置
7.1 移除hostNetwork模式
生产环境建议使用标准的ClusterIP或NodePort模式:
yaml
# 修改Deployment配置
spec:
# hostNetwork: true # 注释或删除此行
containers:
- name: wolfmall-product
# 其他配置不变...
7.2 资源配置与限制
添加资源请求和限制,确保服务质量:
yaml
containers:
- name: wolfmall-product
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
7.3 健康检查配置
添加就绪和存活探针:
yaml
containers:
- name: wolfmall-product
livenessProbe:
httpGet:
path: /actuator/health
port: 8866
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health
port: 8866
initialDelaySeconds: 30
periodSeconds: 5
7.4 多环境配置管理
使用ConfigMap管理不同环境的配置:
yaml
# 创建ConfigMap
apiVersion: v1
kind: ConfigMap
metadata:
name: app-config
data:
application-prod.yaml: |
spring:
datasource:
url: jdbc:mysql://mysql-product:3306/wolfmall
application-dev.yaml: |
spring:
datasource:
url: jdbc:mysql://localhost:3306/wolfmall_dev
# 在Deployment中引用
containers:
- name: wolfmall-product
env:
- name: SPRING_PROFILES_ACTIVE
value: "prod"
volumeMounts:
- name: config-volume
mountPath: /app/config
volumes:
- name: config-volume
configMap:
name: app-config
八、常见问题与解决方案
8.1 镜像拉取失败
错误信息:
text
Failed to pull image "registry.cn-hangzhou.aliyuncs.com/fox666/wolfmall-member:0.0.5": rpc error: code = Unknown desc = Error response from daemon: pull access denied
解决方案:
-
确保已创建正确的镜像拉取Secret
-
在Deployment中正确引用Secret
-
验证镜像仓库地址、用户名、密码是否正确
bash
# 重新创建Secret kubectl create secret docker-registry myregistrykey --docker-server=registry.cn-hangzhou.aliyuncs.com --docker-username=wolf666 --docker-password=正确密码 # 验证Deployment配置 kubectl get deployment wolfmall-member-deployment -o yaml | grep imagePullSecrets
8.2 服务无法访问
排查步骤:
-
检查Pod状态:
kubectl get pods -
检查Service选择器是否匹配Pod标签
-
检查网络策略和防火墙规则
-
查看Pod日志:
kubectl logs [pod-name]
8.3 配置文件不生效
排查步骤:
-
验证ConfigMap是否正确创建
-
检查环境变量名称是否匹配应用配置
-
查看应用启动日志确认配置加载
-
确保配置文件的格式正确
8.4 资源不足
现象:Pod处于Pending状态
解决方案:
-
检查节点资源使用情况:
kubectl describe nodes -
调整Pod的资源请求和限制
-
清理不需要的资源或扩展集群
九、部署总结与最佳实践
9.1 部署流程总结
-
镜像准备:构建、打标签、推送镜像到仓库
-
密钥配置:创建镜像拉取Secret
-
部署服务:创建Deployment和Service
-
网络配置:配置Ingress实现外部访问
-
中间件集成:通过Endpoint连接外部服务
-
验证测试:检查服务状态和功能
9.2 最佳实践建议
-
版本控制:所有YAML文件纳入版本控制系统
-
环境分离:开发、测试、生产环境使用不同配置
-
监控告警:部署Prometheus监控和告警规则
-
日志收集:使用EFK或ELK栈集中管理日志
-
持续部署:集成CI/CD流水线自动化部署
-
备份策略:定期备份重要数据和配置
9.3 后续优化方向
-
服务网格:引入Istio实现更细粒度的流量管理
-
自动扩缩容:配置HPA基于指标自动调整副本数
-
金丝雀发布:实现渐进式发布降低风险
-
安全加固:配置网络策略、RBAC、Pod安全策略
-
性能优化:调整JVM参数、数据库连接池等配置









