一、项目概述与架构1.1 项目背景本文以商城Wolf Mall电商项目为例演示如何将传统的微服务架构完整迁移到Kubernetes平台。该项目采用典型的微服务架构包含商品服务、订单服务、会员服务、购物车服务、网关服务等多个独立模块。1.2 技术栈容器编排Kubernetes服务注册与配置中心NacosAPI网关Spring Cloud Gateway数据库MySQL镜像仓库阿里云容器镜像服务日志管理主机路径挂载1.3 部署架构图text客户端 → Ingress(Nginx) → Gateway服务 → 各业务微服务 ↓ Nacos注册中心 ↓ MySQL数据库二、微服务镜像准备与推送2.1 登录镜像仓库在部署前需要将所有微服务打包成Docker镜像并推送到私有镜像仓库bash# 登录阿里云镜像仓库 docker login --usernamefox666 registry.cn-hangzhou.aliyuncs.com2.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用于拉取镜像bashkubectl create secret docker-registry myregistrykey \ --docker-serverregistry.cn-hangzhou.aliyuncs.com \ --docker-usernamewolf666 \ --docker-passwordxxx参数说明myregistrykey密钥名称可自定义docker-server镜像仓库地址docker-username仓库用户名docker-password仓库密码三、微服务Deployment部署3.1 商品服务部署配置创建wolfmall-product-deployment.yaml文件yamlapiVersion: 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使用主机网络模式简化网络配置适合初学者imagePullPolicyAlways每次创建Pod都重新拉取镜像默认IfNotPresent宿主机不存在时才拉取Never只使用本地镜像环境变量配置通过环境变量传递应用配置数据卷挂载将日志目录挂载到主机路径便于日志收集3.2 部署执行与验证bash# 应用Deployment配置 kubectl apply -f tulingmall-product-deployment.yaml # 查看部署状态 kubectl get pods -l apptulingmall-product # 查看Pod详细信息 kubectl describe pod [pod名称]3.3 其他微服务部署采用相同模式部署其他微服务主要区别在于服务名称、镜像标签和端口号认证中心服务端口9999yaml# 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网关服务端口8888yaml# 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订单服务端口8844yaml# 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购物车服务端口8855yaml# 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服务端口8833yaml# 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会员服务端口8877yaml# 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.yamlyamlapiVersion: 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-service4.3 访问测试通过NodePort访问商品服务bash# 获取节点IP和端口 NODE_IP192.168.65.180 # 实际节点IP NODE_PORT30997 # 分配的NodePort # 访问商品查询接口 curl http://${NODE_IP}:${NODE_PORT}/pms/productInfo/274.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 Controllerbash# 查看Ingress Controller状态 kubectl get pods -n ingress-nginx -o wide # 安装命令参考官方文档 # https://kubernetes.github.io/ingress-nginx/deploy/#quick-start5.2 创建Ingress资源创建wolfmall-gateway-ingress.yamlyamlapiVersion: 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-ingress5.4 本地hosts配置在客户端机器配置hosts将域名指向Ingress Controller节点IPbash# Windows系统C:\Windows\System32\drivers\etc\hosts # Linux/Mac系统/etc/hosts # 添加记录IP为Ingress部署节点IP 192.168.65.137 gateway.wolf.com5.5 访问测试配置完成后通过域名访问网关服务bashcurl http://gateway.wolf.com六、外部中间件集成6.1 K8s DNS验证首先验证集群DNS服务是否正常bash# 运行测试容器 kubectl run curl --imageradial/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.local6.2 MySQL外部访问配置对于集群外部的MySQL通过Endpoint和Service进行映射创建mysql-product.yamlyaml# 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: TCP6.3 部署与验证bash# 应用配置 kubectl apply -f mysql-product.yaml # 指定命名空间部署 kubectl apply -f mysql-product.yaml -n wolfmall # 测试连接 kubectl run mysql-test --imagemysql:8.0 -it --rm \ -- mysql -hmysql-product.wolfmall -uroot -p6.4 Nacos外部访问配置创建nacos-external.yamlyaml# 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-rpc6.5 微服务连接Nacos配置在微服务Deployment中修改Nacos连接地址为K8s Service域名yamlenv: - 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 资源配置与限制添加资源请求和限制确保服务质量yamlcontainers: - name: wolfmall-product resources: requests: memory: 512Mi cpu: 250m limits: memory: 1Gi cpu: 500m7.3 健康检查配置添加就绪和存活探针yamlcontainers: - name: wolfmall-product livenessProbe: httpGet: path: /actuator/health port: 8866 initialDelaySeconds: 60 periodSeconds: 10 readinessProbe: httpGet: path: /actuator/health port: 8866 initialDelaySeconds: 30 periodSeconds: 57.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 镜像拉取失败错误信息textFailed 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解决方案确保已创建正确的镜像拉取Secret在Deployment中正确引用Secret验证镜像仓库地址、用户名、密码是否正确bash# 重新创建Secret kubectl create secret docker-registry myregistrykey \ --docker-serverregistry.cn-hangzhou.aliyuncs.com \ --docker-usernamewolf666 \ --docker-password正确密码 # 验证Deployment配置 kubectl get deployment tulingmall-member-deployment -o yaml | grep imagePullSecrets8.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参数、数据库连接池等配置