从零搭建云原生微服务:K8s+Docker+Spring Cloud全流程指南

Kuber***es + Docker + Spring Cloud 微服务架构详解

技术栈概述

Kuber***es(K8s)、Docker 和 Spring Cloud 共同构成了现代云原生微服务架构的核心技术栈:

  1. Docker:轻量级容器化技术,将应用及其依赖打包成标准化的镜像
  2. Kuber***es:容器编排系统,自动化部署、扩展和管理容器化应用
  3. Spring Cloud:微服务开发框架,提供服务发现、配置管理、断路器等功能

组件协同工作流程

1. 开发阶段

  • 使用 Spring Boot 开发微服务应用
  • 通过 Spring Cloud 实现服务注册(Eureka/Nacos)、配置中心(Config Server)、API网关(Zuul/Gateway)
  • 编写 Dockerfile 将应用打包为容器镜像
  • 示例 Dockerfile:
    FROM openjdk:11-jre
    COPY target/my-service.jar /app.jar
    EXPOSE 8080
    ENTRYPOINT ["java","-jar","/app.jar"]
    

2. 部署阶段

  • 将 Docker 镜像推送到镜像仓库(如 Docker Hub、Harbor)
  • 编写 Kuber***es 部署描述文件(YAML)
  • 示例 deployment.yaml:
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: user-service
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: user-service
      template:
        metadata:
          labels:
            app: user-service
        spec:
          containers:
          - name: user-service
            image: my-repo/user-service:1.0.0
            ports:
            - containerPort: 8080
    

3. 运行阶段

  • Kuber***es 集群根据配置自动调度容器
  • 服务通过 Service 对象暴露
  • 示例 service.yaml:
    apiVersion: v1
    kind: Service
    metadata:
      name: user-service
    spec:
      selector:
        app: user-service
      ports:
      - protocol: TCP
        port: 80
        targetPort: 8080
    

典型应用场景

电商系统微服务架构

  1. 商品服务:Spring Cloud + MySQL
  2. 订单服务:Spring Cloud + Redis
  3. 支付服务:Spring Cloud + RabbitMQ
  4. 用户服务:Spring Cloud + MongoDB

所有服务通过 Kuber***es Ingress 对外提供统一入口,内部通过服务网格(Istio/Linkerd)实现服务间通信。

最佳实践

  1. 容器化最佳实践

    • 使用多阶段构建减小镜像体积
    • 设置合理的资源限制(CPU/Memory)
    • 使用非root用户运行容器
  2. Kuber***es 部署策略

    • 蓝绿部署
    • 金丝雀发布
    • 滚动更新
  3. Spring Cloud 集成

    • 使用 Kuber***es Service Discovery 替代 Eureka
    • 通过 ConfigMap/Secret 管理配置
    • 实现健康检查端点与K8s探针集成

监控与运维

  1. 监控方案

    • Prometheus + Grafana 监控集群和微服务指标
    • ELK 收集日志
    • SkyWalking 实现分布式追踪
  2. 自动扩展

    apiVersion: autoscaling/v2
    kind: HorizontalPodAutoscaler
    metadata:
      name: user-service-hpa
    spec:
      scaleTargetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: user-service
      minReplicas: 2
      maxReplicas: 10
      metrics:
      - type: Resource
        resource:
          name: cpu
          target:
            type: Utilization
            averageUtilization: 50
    

这套技术组合为构建高可用、可扩展的云原生应用提供了完整解决方案,已被众多企业采用作为其数字化转型的技术基础。

1. 环境准备与工具安装

1.1 开发环境配置

  • 操作系统要求:推荐使用Linux(Ubuntu 20.04+)或MacOS,Windows用户建议使用WSL2
  • JDK安装:OpenJDK 11或17,配置JAVA_HOME环境变量
  • 开发工具:IntelliJ IDEA Ultimate(含K8s插件)或VS Code(需安装Docker、K8s扩展)

1.2 核心工具安装

  1. Docker Desktop

    • 配置镜像加速器(阿里云/腾讯云镜像源)
    • 启用Kuber***es功能(内存建议分配4GB以上)
    • 示例命令验证安装:docker run hello-world
  2. Minikube或Kind

    • 单节点K8s集群方案,适合本地开发
    • Minikube安装:brew install minikube(Mac)或choco install minikube(Windows)
    • 启动集群:minikube start --driver=docker --memory=4g
  3. kubectl

    • K8s命令行工具,版本需与集群匹配
    • 安装:curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl"

2. Spring Cloud微服务开发

2.1 项目初始化

# 使用Spring Initializr创建项目
curl https://start.spring.io/starter.zip \
  -d dependencies=web,actuator,cloud-starter-kuber***es \
  -d type=maven-project \
  -d language=java \
  -d bootVersion=2.7.0 \
  -d groupId=***.example \
  -d artifactId=user-service \
  -o user-service.zip

2.2 关键组件集成

  1. 服务注册与发现

    • 集成Spring Cloud Kuber***es Discovery
    @EnableDiscoveryClient
    @SpringBootApplication
    public class UserServiceApplication {
        public static void main(String[] args) {
            SpringApplication.run(UserServiceApplication.class, args);
        }
    }
    

  2. 配置中心

    • 使用ConfigMap存储不同环境配置
    apiVersion: v1
    kind: ConfigMap
    metadata:
      name: user-service-config
    data:
      application.properties: |
        server.port=8080
        spring.datasource.url=jdbc:mysql://mysql-service:3306/userdb
    

  3. API网关

    • Spring Cloud Gateway配置示例
    spring:
      cloud:
        gateway:
          routes:
          - id: user-service
            uri: lb://user-service
            predicates:
            - Path=/api/users/**
            filters:
            - StripPrefix=1
    

3. Docker容器化

3.1 多阶段构建Dockerfile

# 构建阶段
FROM maven:3.8.6-jdk-11 AS build
WORKDIR /app
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package -DskipTests

# 运行阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/*.jar ./app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "app.jar"]

3.2 镜像优化实践

  1. 使用.dockerignore排除无关文件
  2. 选择合适的基础镜像(如distroless Java)
  3. 设置非root用户运行
    RUN addgroup --system javauser && adduser --system --ingroup javauser javauser
    USER javauser
    

4. Kuber***es部署

4.1 基础资源定义

  1. Deployment示例

    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: user-service
    spec:
      replicas: 3
      selector:
        matchLabels:
          app: user-service
      template:
        metadata:
          labels:
            app: user-service
        spec:
          containers:
          - name: user-service
            image: registry.example.***/user-service:1.0.0
            ports:
            - containerPort: 8080
            readinessProbe:
              httpGet:
                path: /actuator/health
                port: 8080
              initialDelaySeconds: 30
              periodSeconds: 10
    

  2. Service暴露

    apiVersion: v1
    kind: Service
    metadata:
      name: user-service
    spec:
      selector:
        app: user-service
      ports:
        - protocol: TCP
          port: 80
          targetPort: 8080
      type: ClusterIP
    

4.2 高级部署策略

  1. 蓝绿部署

    kubectl apply -f user-service-blue.yaml
    kubectl patch svc user-service -p '{"spec":{"selector":{"version":"blue"}}}'
    

  2. 金丝雀发布

    apiVersion: flagger.app/v1beta1
    kind: Canary
    metadata:
      name: user-service
    spec:
      targetRef:
        apiVersion: apps/v1
        kind: Deployment
        name: user-service
      service:
        port: 8080
      analysis:
        interval: 1m
        threshold: 5
        maxWeight: 50
        stepWeight: 10
    

5. 监控与运维

5.1 可观测性方案

  1. Prometheus+Grafana

    • 使用ServiceMonitor采集指标
    apiVersion: monitoring.coreos.***/v1
    kind: ServiceMonitor
    metadata:
      name: user-service-monitor
    spec:
      endpoints:
      - port: http
        path: /actuator/prometheus
      selector:
        matchLabels:
          app: user-service
    

  2. ELK日志收集

    • Filebeat DaemonSet配置示例
    - type: container
      paths:
        - /var/log/containers/*user-service*.log
      processors:
        - add_kuber***es_metadata:
            host: ${NODE_NAME}
    

5.2 自动扩缩容

apiVersion: autoscaling/v2beta2
kind: HorizontalPodAutoscaler
metadata:
  name: user-service-hpa
spec:
  scaleTargetRef:
    apiVersion: apps/v1
    kind: Deployment
    name: user-service
  minReplicas: 2
  maxReplicas: 10
  metrics:
  - type: Resource
    resource:
      name: cpu
      target:
        type: Utilization
        averageUtilization: 70

6. CI/CD流水线示例

6.1 GitHub Actions工作流

name: Build and Deploy
on: [push]
jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v2
    - name: Set up JDK
      uses: actions/setup-java@v1
      with:
        java-version: '11'
    - name: Build with Maven
      run: mvn package -DskipTests
    - name: Login to Docker Hub
      uses: docker/login-action@v1
      with:
        username: ${{ secrets.DOCKER_HUB_USERNAME }}
        password: ${{ secrets.DOCKER_HUB_TOKEN }}
    - name: Build and push
      uses: docker/build-push-action@v2
      with:
        push: true
        tags: user-registry/user-service:${{ github.sha }}
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
    - uses: azure/setup-kubectl@v1
    - name: Deploy to Kuber***es
      run: |
        kubectl config set-cluster k8s-cluster --server=${{ secrets.K8S_SERVER }}
        kubectl config set-credentials ci-user --token=${{ secrets.K8S_TOKEN }}
        kubectl set image deployment/user-service user-service=user-registry/user-service:${{ github.sha }}
转载请说明出处内容投诉
CSS教程网 » 从零搭建云原生微服务:K8s+Docker+Spring Cloud全流程指南

发表评论

欢迎 访客 发表评论

一个令你着迷的主题!

查看演示 官网购买