Kuber***es + Docker + Spring Cloud 微服务架构详解
技术栈概述
Kuber***es(K8s)、Docker 和 Spring Cloud 共同构成了现代云原生微服务架构的核心技术栈:
- Docker:轻量级容器化技术,将应用及其依赖打包成标准化的镜像
- Kuber***es:容器编排系统,自动化部署、扩展和管理容器化应用
- 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
典型应用场景
电商系统微服务架构
- 商品服务:Spring Cloud + MySQL
- 订单服务:Spring Cloud + Redis
- 支付服务:Spring Cloud + RabbitMQ
- 用户服务:Spring Cloud + MongoDB
所有服务通过 Kuber***es Ingress 对外提供统一入口,内部通过服务网格(Istio/Linkerd)实现服务间通信。
最佳实践
-
容器化最佳实践:
- 使用多阶段构建减小镜像体积
- 设置合理的资源限制(CPU/Memory)
- 使用非root用户运行容器
-
Kuber***es 部署策略:
- 蓝绿部署
- 金丝雀发布
- 滚动更新
-
Spring Cloud 集成:
- 使用 Kuber***es Service Discovery 替代 Eureka
- 通过 ConfigMap/Secret 管理配置
- 实现健康检查端点与K8s探针集成
监控与运维
-
监控方案:
- Prometheus + Grafana 监控集群和微服务指标
- ELK 收集日志
- SkyWalking 实现分布式追踪
-
自动扩展:
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 核心工具安装
-
Docker Desktop:
- 配置镜像加速器(阿里云/腾讯云镜像源)
- 启用Kuber***es功能(内存建议分配4GB以上)
- 示例命令验证安装:
docker run hello-world
-
Minikube或Kind:
- 单节点K8s集群方案,适合本地开发
- Minikube安装:
brew install minikube(Mac)或choco install minikube(Windows) - 启动集群:
minikube start --driver=docker --memory=4g
-
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 关键组件集成
-
服务注册与发现:
- 集成Spring Cloud Kuber***es Discovery
@EnableDiscoveryClient @SpringBootApplication public class UserServiceApplication { public static void main(String[] args) { SpringApplication.run(UserServiceApplication.class, args); } } -
配置中心:
- 使用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 -
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 镜像优化实践
- 使用
.dockerignore排除无关文件 - 选择合适的基础镜像(如distroless Java)
- 设置非root用户运行
RUN addgroup --system javauser && adduser --system --ingroup javauser javauser USER javauser
4. Kuber***es部署
4.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 -
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 高级部署策略
-
蓝绿部署:
kubectl apply -f user-service-blue.yaml kubectl patch svc user-service -p '{"spec":{"selector":{"version":"blue"}}}' -
金丝雀发布:
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 可观测性方案
-
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 -
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 }}