news 2026/2/13 7:24:38

Kubernetes电商微服务项目部署实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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.01.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
关键配置解析:
  1. hostNetwork: true:使用主机网络模式,简化网络配置,适合初学者

  2. imagePullPolicy

    • Always:每次创建Pod都重新拉取镜像(默认)

    • IfNotPresent:宿主机不存在时才拉取

    • Never:只使用本地镜像

  3. 环境变量配置:通过环境变量传递应用配置

  4. 数据卷挂载:将日志目录挂载到主机路径,便于日志收集

3.2 部署执行与验证

bash

# 应用Deployment配置 kubectl apply -f tulingmall-product-deployment.yaml # 查看部署状态 kubectl get pods -l app=tulingmall-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.tuling.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:\Windows\System32\drivers\etc\hosts # 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/tulingmall-member:0.0.5": rpc error: code = Unknown desc = Error response from daemon: pull access denied

解决方案

  1. 确保已创建正确的镜像拉取Secret

  2. 在Deployment中正确引用Secret

  3. 验证镜像仓库地址、用户名、密码是否正确

bash

# 重新创建Secret kubectl create secret docker-registry myregistrykey \ --docker-server=registry.cn-hangzhou.aliyuncs.com \ --docker-username=wolf666 \ --docker-password=正确密码 # 验证Deployment配置 kubectl get deployment tulingmall-member-deployment -o yaml | grep imagePullSecrets

8.2 服务无法访问

排查步骤

  1. 检查Pod状态:kubectl get pods

  2. 检查Service选择器是否匹配Pod标签

  3. 检查网络策略和防火墙规则

  4. 查看Pod日志:kubectl logs [pod-name]

8.3 配置文件不生效

排查步骤

  1. 验证ConfigMap是否正确创建

  2. 检查环境变量名称是否匹配应用配置

  3. 查看应用启动日志确认配置加载

  4. 确保配置文件的格式正确

8.4 资源不足

现象:Pod处于Pending状态

解决方案

  1. 检查节点资源使用情况:kubectl describe nodes

  2. 调整Pod的资源请求和限制

  3. 清理不需要的资源或扩展集群


九、部署总结与最佳实践

9.1 部署流程总结

  1. 镜像准备:构建、打标签、推送镜像到仓库

  2. 密钥配置:创建镜像拉取Secret

  3. 部署服务:创建Deployment和Service

  4. 网络配置:配置Ingress实现外部访问

  5. 中间件集成:通过Endpoint连接外部服务

  6. 验证测试:检查服务状态和功能

9.2 最佳实践建议

  1. 版本控制:所有YAML文件纳入版本控制系统

  2. 环境分离:开发、测试、生产环境使用不同配置

  3. 监控告警:部署Prometheus监控和告警规则

  4. 日志收集:使用EFK或ELK栈集中管理日志

  5. 持续部署:集成CI/CD流水线自动化部署

  6. 备份策略:定期备份重要数据和配置

9.3 后续优化方向

  1. 服务网格:引入Istio实现更细粒度的流量管理

  2. 自动扩缩容:配置HPA基于指标自动调整副本数

  3. 金丝雀发布:实现渐进式发布降低风险

  4. 安全加固:配置网络策略、RBAC、Pod安全策略

  5. 性能优化:调整JVM参数、数据库连接池等配置

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/2/12 4:49:18

格雷码:为什么只在异步FIFO里混得开?

数据从一个时钟域传到另一个时钟域,时序稍微对不上,就会采到不确定的亚稳态值。这在芯片里是大忌,可能导致整个系统逻辑错乱。格雷码的设计思路很直接:相邻两个数之间只变一位。十进制 二进制 格雷码3 011 0104 100 110 (只变最高位)5 …

作者头像 李华
网站建设 2026/2/13 6:13:47

实时手机检测镜像运维手册:Supervisor日志分析与故障自愈技巧

实时手机检测镜像运维手册:Supervisor日志分析与故障自愈技巧 1. 项目概述 1.1 系统简介 这是一个专为手机检测场景优化的轻量级AI系统,基于阿里巴巴达摩院的DAMO-YOLO模型和TinyNAS技术构建。系统采用"小、快、省"的设计理念,特…

作者头像 李华
网站建设 2026/2/12 8:06:41

RMBG-2.0在电商中的应用:商品图批量抠图实战分享

RMBG-2.0在电商中的应用:商品图批量抠图实战分享 电商运营中,一张干净、专业、背景透明的商品主图,往往就是转化率提升的关键一环。但现实是:每天要处理上百张不同光源、不同材质、不同边缘复杂度的产品图;美工人力有…

作者头像 李华
网站建设 2026/2/12 4:12:11

签名导出格式技术选型与决策指南

签名导出格式技术选型与决策指南 【免费下载链接】signature_pad HTML5 canvas based smooth signature drawing 项目地址: https://gitcode.com/gh_mirrors/si/signature_pad 你是否曾遇到在导出电子签名时纠结格式选择的困境?PNG与JPEG作为最常用的两种图片…

作者头像 李华
网站建设 2026/2/12 2:33:57

一键部署SDPose-Wholebody:视频人体姿态分析实战

一键部署SDPose-Wholebody:视频人体姿态分析实战 SDPose-Wholebody 是当前少有的支持133关键点全身姿态估计的开源模型,它不像传统姿态模型那样依赖密集标注数据,而是巧妙融合扩散模型先验与热力图回归机制,在复杂遮挡、多人重叠…

作者头像 李华