Skip to content

Spring Cloud Kubernetes

1. Kubernetes 集成概述

1.1 为什么使用 Kubernetes

  • 原生服务发现
  • 自动扩缩容
  • 滚动更新
  • 配置管理
  • 健康检查

1.2 Spring Cloud Kubernetes 功能

功能说明
服务发现使用 Kubernetes Service
配置管理使用 ConfigMap 和 Secret
负载均衡使用 Kubernetes Service
健康检查使用 Kubernetes 探针

2. 快速入门

2.1 添加依赖

xml
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client-config</artifactId>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-kubernetes-client-loadbalancer</artifactId>
</dependency>

2.2 启用服务发现

java
@SpringBootApplication
@EnableDiscoveryClient
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

2.3 配置

yaml
spring:
  application:
    name: user-service
  cloud:
    kubernetes:
      discovery:
        enabled: true
        all-namespaces: false
      config:
        enabled: true
        name: ${spring.application.name}
        namespace: default
      secrets:
        enabled: true
        name: ${spring.application.name}-secrets
        namespace: default

3. 服务发现

3.1 Kubernetes Service 配置

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

3.2 使用服务发现

java
@Service
public class OrderClient {
    
    private final DiscoveryClient discoveryClient;
    private final RestTemplate restTemplate;
    
    public Order getOrder(Long id) {
        List<ServiceInstance> instances = 
            discoveryClient.getInstances("order-service");
        
        if (instances.isEmpty()) {
            throw new RuntimeException("No available order service");
        }
        
        ServiceInstance instance = instances.get(0);
        String url = instance.getUri() + "/api/orders/" + id;
        
        return restTemplate.getForObject(url, Order.class);
    }
}

3.3 使用 LoadBalancer

java
@Configuration
public class RestTemplateConfig {
    
    @Bean
    @LoadBalanced
    public RestTemplate restTemplate() {
        return new RestTemplate();
    }
}

@Service
public class OrderClient {
    
    private final RestTemplate restTemplate;
    
    public Order getOrder(Long id) {
        return restTemplate.getForObject(
            "http://order-service/api/orders/" + id, 
            Order.class
        );
    }
}

4. ConfigMap 配置

4.1 创建 ConfigMap

yaml
apiVersion: v1
kind: ConfigMap
metadata:
  name: user-service
  namespace: default
data:
  application.yaml: |
    spring:
      datasource:
        url: jdbc:mysql://mysql:3306/userdb
        username: root
    app:
      config:
        name: user-service
        max-connections: 100

4.2 加载 ConfigMap

yaml
spring:
  cloud:
    kubernetes:
      config:
        enabled: true
        name: user-service
        namespace: default
        sources:
          - name: user-service
          - name: common-config

4.3 动态刷新

java
@RestController
@RefreshScope
public class ConfigController {
    
    @Value("${app.config.name}")
    private String configName;
    
    @Value("${app.config.max-connections:100}")
    private int maxConnections;
    
    @GetMapping("/config")
    public Map<String, Object> getConfig() {
        return Map.of(
            "configName", configName,
            "maxConnections", maxConnections
        );
    }
}

5. Secret 管理

5.1 创建 Secret

yaml
apiVersion: v1
kind: Secret
metadata:
  name: user-service-secrets
  namespace: default
type: Opaque
stringData:
  database-password: mypassword
  api-key: myapikey

5.2 加载 Secret

yaml
spring:
  cloud:
    kubernetes:
      secrets:
        enabled: true
        name: user-service-secrets
        namespace: default
        sources:
          - name: user-service-secrets

5.3 使用 Secret

yaml
spring:
  datasource:
    password: ${database-password}
  security:
    api-key: ${api-key}

6. 健康检查

6.1 探针配置

yaml
management:
  endpoint:
    health:
      probes:
        enabled: true
  health:
    livenessstate:
      enabled: true
    readinessstate:
      enabled: true

6.2 Kubernetes 探针

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
spec:
  template:
    spec:
      containers:
      - name: user-service
        image: user-service:latest
        ports:
        - containerPort: 8080
        livenessProbe:
          httpGet:
            path: /actuator/health/liveness
            port: 8080
          initialDelaySeconds: 30
          periodSeconds: 10
        readinessProbe:
          httpGet:
            path: /actuator/health/readiness
            port: 8080
          initialDelaySeconds: 10
          periodSeconds: 5

7. 部署配置

7.1 Deployment

yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: user-service
  labels:
    app: user-service
spec:
  replicas: 3
  selector:
    matchLabels:
      app: user-service
  template:
    metadata:
      labels:
        app: user-service
    spec:
      containers:
      - name: user-service
        image: myregistry/user-service:latest
        ports:
        - containerPort: 8080
        env:
        - name: SPRING_PROFILES_ACTIVE
          value: "k8s"
        - name: SPRING_DATASOURCE_PASSWORD
          valueFrom:
            secretKeyRef:
              name: user-service-secrets
              key: database-password
        resources:
          requests:
            memory: "512Mi"
            cpu: "250m"
          limits:
            memory: "1Gi"
            cpu: "500m"
        volumeMounts:
        - name: config
          mountPath: /config
          readOnly: true
      volumes:
      - name: config
        configMap:
          name: user-service

7.2 Service

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

7.3 Ingress

yaml
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  name: user-service-ingress
  annotations:
    nginx.ingress.kubernetes.io/rewrite-target: /
spec:
  rules:
  - host: api.example.com
    http:
      paths:
      - path: /users
        pathType: Prefix
        backend:
          service:
            name: user-service
            port:
              number: 80

8. 小结

本章学习了 Spring Cloud Kubernetes 的核心内容:

内容要点
服务发现Kubernetes Service
ConfigMap配置管理、动态刷新
Secret敏感信息管理
健康检查Liveness、Readiness 探针
部署Deployment、Service、Ingress

下一章将学习实战项目开发。