首页 > 其他分享 >从传统应用到云原生部署

从传统应用到云原生部署

时间:2025-01-08 14:32:23浏览次数:3  
标签:原生 name 部署 spring app boot 应用 mysql my

将传统的 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 监控资源使用和应用状态。

总结:通过该案例,我们完成了从传统应用到云原生部署的全流程,将 Docker、Helm 和 Operator 技术整合,构建了高效、可靠的 Kubernetes 部署体系。

标签:原生,name,部署,spring,app,boot,应用,mysql,my
From: https://blog.csdn.net/qq_51149892/article/details/144984349

相关文章

  • 应用质数和模算法
    生成RSA加密密钥密钥生成时先选择两个素数p和q,计算他们的乘积n=p*q,RSA的安全性是基于从n推导出p和q是很困难的,p和q越大,在给定n推到p和q的值越难,简单逻辑如下:1、选择两个大的素数2、计算n和phi(欧拉商函数)3、选择一个公共指数e4、计算私有指数d5、使用公钥加密信息6、使用私......
  • K8S部署
    参考网站【Linux】Ubuntu部署K8S集群-图文并茂(超详细)-CSDN博客1、机器准备(Ubuntu)1.1、机器配置机器名称内存处理器(核心)硬盘网络适配器k8s-master2GB450GNATk8s-node12GB450GNATk8s-node22GB450GNAT1.2、系统配置相关调整1.2.1配置root用户登......
  • 【解密三大AI:感知、增强与生成智能的未来】探讨Perceptive AI、Enhancive AI与Generat
    【解密三大AI:感知、增强与生成智能的未来】探讨PerceptiveAI、EnhanciveAI与GenerativeAI的核心概念、应用及未来影响(二)【解密三大AI:感知、增强与生成智能的未来】探讨PerceptiveAI、EnhanciveAI与GenerativeAI的核心概念、应用及未来影响(二)文章目录【解密三大A......
  • SpringBoot汽车服务系统p79hp(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表用户,汽车类型,汽车信息,汽车品牌,汽车颜色开题报告内容一、研究背景与意义随着汽车保有量的持续增长,消费者对汽车服务的需求日益多样化与个性化。然而,传统汽车......
  • SpringBoot企业员工自助管理系统01ncs(程序+源码+数据库+调试部署+开发环境)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表员工,考勤信息,工作审批,费用报销,办公资源开题报告内容一、课题背景与意义随着信息技术的飞速发展,企业对于内部管理的信息化需求日益增强。传统的人工管理方式......
  • Python的Tkinter库创建了一个图形用户界面(GUI)应用程序,实现了一个简单的薪资计算系统
    importtkinterastkfromtkinter.fontimportFontfromtkinterimportmessageboxclassPayrollSystem:def__init__(self,root):self.root=rootroot.config(bg='#83a7de')self.mainframe=tk.Frame(root,bg='#8......
  • JuiceFS 详解:一款为云原生设计的高性能分布式文件系统
    JuiceFS详解:一款为云原生设计的高性能分布式文件系统1.什么是JuiceFS?JuiceFS(JuicedFileSystem)是一款高性能、POSIX兼容的云原生分布式文件系统。它采用对象存储作为底层存储,支持多种元数据引擎,如Redis、MySQL、PostgreSQL等,通过强大的缓存机制提供快速的数据访问,具有......
  • [软件工具使用记录] windows离线ollama部署本地模型并配置continue实现离线代码补全
    qwen2.5coder发布之后,觉得差不多可以实现离线模型辅助编程了,所以尝试在公司内网部署模型,配合vsocde插件continue实现代码提示、聊天功能。目前使用qwen2.5coder的32b模型,体验上和gpt-4o差不多(都稀碎),适用于编写脚本,查一些简单问题,例如flask如何把变量传到前端,准确率还可以,但是补全......
  • docker compose 部署mysql8的踩坑
    DockerCompose模板(SpringBoot+mysql+redis+rabbitmq):注:需要将application.yml中的host替换为容器名称services:backend:container_name:textgenbuild:context:.dockerfile:Dockerfilerestart:on-failurevolumes:-t......
  • 原生的Three.js Cesium.js的 开源案例 已获近1000Star
    纯原生threecesium案例由于前端得发展,three.js和cesium.js越来越被越来越多得前端接触到,由于其学习路线比较复杂,且官网案例覆盖不全,因此在今年我们共同搭建了一个免费得three和cesium案例学习平台,未来将免费逐步的更新案例。主要侧重于开发者的技术交流......