一、项目概述与架构

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 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:\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/wolfmall-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 wolfmall-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参数、数据库连接池等配置

Logo

电商企业物流数字化转型必备!快递鸟 API 接口,72 小时快速完成物流系统集成。全流程实战1V1指导,营造开放的API技术生态圈。

更多推荐