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: default3. 服务发现
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: ClusterIP3.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: 1004.2 加载 ConfigMap
yaml
spring:
cloud:
kubernetes:
config:
enabled: true
name: user-service
namespace: default
sources:
- name: user-service
- name: common-config4.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: myapikey5.2 加载 Secret
yaml
spring:
cloud:
kubernetes:
secrets:
enabled: true
name: user-service-secrets
namespace: default
sources:
- name: user-service-secrets5.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: true6.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: 57. 部署配置
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-service7.2 Service
yaml
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- port: 80
targetPort: 8080
type: ClusterIP7.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: 808. 小结
本章学习了 Spring Cloud Kubernetes 的核心内容:
| 内容 | 要点 |
|---|---|
| 服务发现 | Kubernetes Service |
| ConfigMap | 配置管理、动态刷新 |
| Secret | 敏感信息管理 |
| 健康检查 | Liveness、Readiness 探针 |
| 部署 | Deployment、Service、Ingress |
下一章将学习实战项目开发。