将传统的 Spring Boot 应用程序迁移到 Kubernetes,结合 Docker、Helm 和 Operator 实现自动化管理。
一、传统应用的容器化
背景:
假设我们有一个 Spring Boot 应用,使用 MySQL 作为数据库,部署在传统的虚拟机环境中。
目标:
将应用容器化。
在 Kubernetes 中实现可扩展性和高可用性。
一:为应用构建 Docker 镜像
1. 编写 Dockerfile:
FROM openjdk:11-jdk-slim
WORKDIR /app
COPY target/my-app.jar my-app.jar
ENTRYPOINT ["java", "-jar", "my-app.jar"]
2. 构建镜像:
mvn clean package
docker build -t my-repo/spring-boot-app:1.0 .
3. 推送镜像:
docker push my-repo/spring-boot-app:1.0
步骤 2:编写 Kubernetes YAML 文件
1. Deployment 和 Service:
apiVersion: apps/v1
kind: Deployment
metadata:
name: spring-boot-app
spec:
replicas: 3
selector:
matchLabels:
app: spring-boot-app
template:
metadata:
labels:
app: spring-boot-app
spec:
containers:
- name: app
image: my-repo/spring-boot-app:1.0
ports:
- containerPort: 8080
env:
- name: SPRING_DATASOURCE_URL
value: jdbc:mysql://mysql-service:3306/mydb
---
apiVersion: v1
kind: Service
metadata:
name: spring-boot-service
spec:
selector:
app: spring-boot-app
ports:
- protocol: TCP
port: 80
targetPort: 8080
type: ClusterIP
2. mysql 配置
apiVersion: apps/v1
kind: Deployment
metadata:
name: mysql
spec:
replicas: 1
selector:
matchLabels:
app: mysql
template:
metadata:
labels:
app: mysql
spec:
containers:
- name: mysql
image: mysql:5.7
ports:
- containerPort: 3306
env:
- name: MYSQL_ROOT_PASSWORD
value: rootpassword
- name: MYSQL_DATABASE
value: mydb
- name: MYSQL_USER
value: user
- name: MYSQL_PASSWORD
value: password
---
apiVersion: v1
kind: Service
metadata:
name: mysql-service
spec:
selector:
app: mysql
ports:
- protocol: TCP
port: 3306
targetPort: 3306
type: ClusterIP
步骤 3:使用 Helm 简化部署
1. 创建 Helm Chart: 目录结构:
my-chart/
├── Chart.yaml
├── values.yaml
├── templates/
│ ├── deployment.yaml
│ ├── service.yaml
2. 编写 values.yaml:
replicaCount: 3
image:
repository: my-repo/spring-boot-app
tag: 1.0
mysql:
host: mysql-service
port: 3306
database: mydb
user: user
password: password
3. 部署应用
helm install my-app ./my-chart
二. 使用 Operator 实现自动化管理
1. 开发自定义 Operator:
使用 Operator SDK 定义 CRD 和控制器逻辑,自动管理 Spring Boot 和 MySQL 的关系。例如:
- 动态调整副本数。
- 检测数据库连接并重启应用。
2. 部署 Operator:
构建并部署到 Kubernetes 集群:
make docker-build docker-push IMG=my-repo/spring-boot-operator:v1
make deploy IMG=my-repo/spring-boot-operator:v1
三. 增强安全性与高可用性
1. 安全性:
- 使用 Kubernetes Secrets 存储数据库密码。
- 配置 Pod 安全上下文:
securityContext:
runAsUser: 1000
runAsGroup: 3000
fsGroup: 2000
2.高可用性:
- 在不同的节点上分布副本:
affinity:
podAntiAffinity:
requiredDuringSchedulingIgnoredDuringExecution:
- labelSelector:
matchLabels:
app: spring-boot-app
topologyKey: "kubernetes.io/hostname"
- 配置 Horizontal Pod Autoscaler (HPA):
kubectl autoscale deployment spring-boot-app --cpu-percent=50 --min=3 --max=10
四. 日志与监控
1. 日志管理:
将日志输出到 Fluentd 或 ELK Stack:
volumeMounts:
- name: log-volume
mountPath: /var/log/app
2. 监控:
使用 Prometheus 和 Grafana 监控资源使用和应用状态。
标签:原生,name,部署,spring,app,boot,应用,mysql,my From: https://blog.csdn.net/qq_51149892/article/details/144984349
总结:通过该案例,我们完成了从传统应用到云原生部署的全流程,将 Docker、Helm 和 Operator 技术整合,构建了高效、可靠的 Kubernetes 部署体系。