SpringBoot + Kubernetes + Helm:云原生微服务部署与弹性扩缩容实战
开篇:为什么我们需要云原生部署?
想象一下,你刚开发完一个SpringBoot微服务,兴奋地准备部署上线。结果发现,手动部署太麻烦,配置管理一团糟,高峰期服务器扛不住,低峰期又浪费资源。这就是传统部署方式的痛点。
云原生技术为我们提供了一套全新的解决方案:Kubernetes负责容器编排,Helm简化应用部署,配合SpringBoot的云原生特性,让微服务部署变得简单高效。
技术选型:为什么要选这三剑客?
SpringBoot:微服务的完美载体
SpringBoot以其开箱即用的特性,让开发者能快速构建微服务。结合Actuator监控、配置外置等功能,天然适合云原生环境。
Kubernetes:容器编排的事实标准
Kubernetes提供了强大的自动化部署、扩缩容、故障恢复能力。它让我们不再关心具体的服务器,而是关注应用本身。
Helm:Kubernetes的包管理器
如果说Kubernetes是操作系统,那Helm就是它的应用商店。通过Helm Chart,我们可以轻松管理复杂的Kubernetes部署配置。
实战:构建你的第一个云原生微服务
让我们通过一个用户管理服务来演示整个流程。
1. 创建SpringBoot应用
我们的示例应用是一个简单的用户管理系统,包含用户的基本CRUD操作:
@RestController
@RequestMapping("/api/users")
public class UserController {
private final UserService userService;
@GetMapping
public ResponseEntity<List<User>> getAllUsers() {
return ResponseEntity.ok(userService.getAllUsers());
}
@PostMapping
public ResponseEntity<User> createUser(@RequestBody User user) {
return ResponseEntity.ok(userService.createUser(user));
}
// 用于模拟负载,测试HPA
@GetMapping("/simulate-load")
public ResponseEntity<String> simulateLoad() {
userService.simulateLoad();
return ResponseEntity.ok("Load simulation completed");
}
}
2. 配置云原生就绪的应用
为了让应用更好地适应云原生环境,我们在配置中加入监控和健康检查:
server:
port: 8080
spring:
application:
name: k8s-helm-demo
datasource:
url: jdbc:h2:mem:testdb
driverClassName: org.h2.Driver
username: sa
password: password
# Actuator配置,提供健康检查和监控端点
management:
endpoints:
web:
exposure:
include: health,info,metrics,prometheus
endpoint:
health:
show-details: when-authorized
3. 制作Docker镜像
FROM openjdk:8-jre-alpine
WORKDIR /app
COPY target/k8s-helm-demo-0.0.1-SNAPSHOT.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
核心技术:Kubernetes部署配置详解
Deployment配置
Deployment确保指定数量的Pod副本始终运行:
apiVersion: apps/v1
kind: Deployment
metadata:
name: k8s-helm-demo-deployment
spec:
replicas: 2 # 初始副本数
selector:
matchLabels:
app: k8s-helm-demo
template:
metadata:
labels:
app: k8s-helm-demo
spec:
containers:
- name: k8s-helm-demo
image: k8s-helm-demo:latest
ports:
- containerPort: 8080
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
livenessProbe: # 存活探针
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe: # 就绪探针
httpGet:
path: /actuator/health
port: 8080
initialDelaySeconds: 30
periodSeconds: 5
Service配置
Service提供稳定的网络端点:
apiVersion: v1
kind: Service
metadata:
name: k8s-helm-demo-service
spec:
selector:
app: k8s-helm-demo
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: LoadBalancer # 外部可访问
关键特性:弹性扩缩容实现
Horizontal Pod Autoscaler (HPA)
这是实现弹性扩缩容的关键组件:
apiVersion: autoscaling/v2
kind: HorizontalPodAutoscaler
metadata:
name: k8s-helm-demo-hpa
spec:
scaleTargetRef:
apiVersion: apps/v1
kind: Deployment
name: k8s-helm-demo-deployment
minReplicas: 2 # 最小副本数
maxReplicas: 10 # 最大副本数
metrics:
- type: Resource
resource:
name: cpu
target:
type: Utilization
averageUtilization: 70 # CPU利用率超过70%时扩容
- type: Resource
resource:
name: memory
target:
type: Utilization
averageUtilization: 80 # 内存利用率超过80%时扩容
Helm Chart模板化部署
Helm通过模板化配置,实现了一次编写、多环境部署:
Chart.yaml
apiVersion: v2
name: k8s-helm-demo
description: A Helm chart for deploying SpringBoot application to Kubernetes
type: application
version: 0.1.0
appVersion: "1.0.0"
values.yaml(默认配置)
replicaCount: 2
image:
repository: k8s-helm-demo
pullPolicy: IfNotPresent
tag: ""
service:
type: LoadBalancer
port: 80
resources:
limits:
cpu: 500m
memory: 1Gi
requests:
cpu: 250m
memory: 512Mi
autoscaling:
enabled: true
minReplicas: 2
maxReplicas: 10
targetCPUUtilizationPercentage: 70
Deployment模板(deployment.yaml)
apiVersion: apps/v1
kind: Deployment
metadata:
name: {{ include "k8s-helm-demo.fullname" . }}
spec:
{{- if not .Values.autoscaling.enabled }}
replicas: {{ .Values.replicaCount }}
{{- end }}
selector:
matchLabels:
{{- include "k8s-helm-demo.selectorLabels" . | nindent 6 }}
template:
spec:
containers:
- name: {{ .Chart.Name }}
image: "{{ .Values.image.repository }}:{{ .Values.image.tag | default .Chart.AppVersion }}"
ports:
- name: http
containerPort: {{ .Values.app.serverPort }}
protocol: TCP
resources:
{{- toYaml .Values.resources | nindent 12 }}
部署实践:一键部署全流程
1. 构建和推送镜像
# 构建Docker镜像
docker build -t your-registry/k8s-helm-demo:v1.0.0 .
# 推送镜像
docker push your-registry/k8s-helm-demo:v1.0.0
2. 使用Helm部署
# 添加命名空间
kubectl create namespace my-app
# 部署应用
helm upgrade --install my-app ./helm-chart \
--namespace my-app \
--set image.repository=your-registry/k8s-helm-demo \
--set image.tag=v1.0.0
3. 验证部署
# 检查Pod状态
kubectl get pods -n my-app
# 检查HPA状态
kubectl get hpa -n my-app
# 查看服务
kubectl get svc -n my-app
测试弹性扩缩容
我们可以通过以下脚本来测试弹性扩缩容功能:
#!/bin/bash
NAMESPACE="my-app"
# 检查初始副本数
kubectl get deployment k8s-helm-demo -n $NAMESPACE
# 通过压测工具增加负载
ab -n 10000 -c 100 http://your-service-endpoint/api/users/simulate-load
# 监控HPA行为
kubectl get hpa -n $NAMESPACE -w
当CPU使用率超过阈值时,HPA会自动增加Pod副本数;当负载下降时,会自动减少副本数,实现真正的弹性伸缩。
最佳实践:生产环境部署建议
1. 资源限制设置
合理设置requests和limits,避免资源争抢:
resources:
requests:
memory: "512Mi"
cpu: "250m"
limits:
memory: "1Gi"
cpu: "500m"
2. 健康检查配置
确保应用健康检查的准确性和及时性:
livenessProbe:
httpGet:
path: /actuator/health/liveness
port: 8080
initialDelaySeconds: 60
periodSeconds: 10
readinessProbe:
httpGet:
path: /actuator/health/readiness
port: 8080
initialDelaySeconds: 30
periodSeconds: 5
3. 安全配置
使用安全上下文限制容器权限:
securityContext:
runAsNonRoot: true
runAsUser: 1000
readOnlyRootFilesystem: true
4. 高可用部署
使用Pod反亲和性确保Pod分散在不同节点:
affinity:
podAntiAffinity:
preferredDuringSchedulingIgnoredDuringExecution:
- weight: 100
podAffinityTerm:
labelSelector:
matchLabels:
app: k8s-helm-demo
topologyKey: kubernetes.io/hostname
总结
通过SpringBoot + Kubernetes + Helm的组合,我们构建了一个现代化的云原生微服务部署方案:
- 简化部署:Helm Chart将复杂的Kubernetes配置模板化,实现一键部署
- 弹性伸缩:HPA根据资源使用情况自动调整Pod数量,优化成本
- 高可用性:多副本部署和健康检查确保服务稳定运行
- 配置管理:ConfigMap和Secret分离配置与代码,支持多环境部署
- 监控可观测:集成Prometheus监控,实时掌握应用状态
这套方案不仅适用于中小型项目,也为大型企业的微服务架构提供了坚实的基础。随着云原生技术的不断发展,这种部署模式将成为标准实践。
如果你也在探索云原生技术,不妨试试这套方案,相信会给你带来不一样的体验!
标题:SpringBoot + Kubernetes + Helm:云原生微服务部署与弹性扩缩容实战
作者:jiangyi
地址:http://www.jiangyi.space/articles/2026/01/11/1768144803415.html
- 开篇:为什么我们需要云原生部署?
- 技术选型:为什么要选这三剑客?
- SpringBoot:微服务的完美载体
- Kubernetes:容器编排的事实标准
- Helm:Kubernetes的包管理器
- 实战:构建你的第一个云原生微服务
- 1. 创建SpringBoot应用
- 2. 配置云原生就绪的应用
- 3. 制作Docker镜像
- 核心技术:Kubernetes部署配置详解
- Deployment配置
- Service配置
- 关键特性:弹性扩缩容实现
- Horizontal Pod Autoscaler (HPA)
- Helm Chart模板化部署
- 部署实践:一键部署全流程
- 1. 构建和推送镜像
- 2. 使用Helm部署
- 3. 验证部署
- 测试弹性扩缩容
- 最佳实践:生产环境部署建议
- 1. 资源限制设置
- 2. 健康检查配置
- 3. 安全配置
- 4. 高可用部署
- 总结