当前位置: 首页 > article >正文

Kubernetes 部署 Spring Boot 应用:从入门到生产实践

Kubernetes 部署 Spring Boot 应用从入门到生产实践别叫我大神叫我 Alex 就好。一、引言大家好我是 Alex。Kubernetes 已经成为云原生应用部署的事实标准而 Spring Boot 是 Java 微服务开发的首选框架。今天我想和大家分享一下如何在 Kubernetes 上部署和管理 Spring Boot 应用的最佳实践。二、容器化 Spring Boot 应用1. 优化 Dockerfile# 多阶段构建 FROM eclipse-temurin:21-jdk-alpine AS builder WORKDIR /app COPY .mvn/ .mvn COPY mvnw pom.xml ./ RUN ./mvnw dependency:go-offline COPY src ./src RUN ./mvnw clean package -DskipTests # 运行阶段 FROM eclipse-temurin:21-jre-alpine WORKDIR /app # 创建非 root 用户 RUN addgroup -S spring adduser -S spring -G spring USER spring:spring # 复制 jar 文件 COPY --frombuilder /app/target/*.jar app.jar # 健康检查 HEALTHCHECK --interval30s --timeout3s --start-period60s --retries3 \ CMD wget --no-verbose --tries1 --spider http://localhost:8080/actuator/health || exit 1 EXPOSE 8080 ENTRYPOINT [java, -XX:UseContainerSupport, -XX:MaxRAMPercentage75.0, -jar, app.jar]2. 构建配置!-- pom.xml 中的 Spring Boot Maven 插件配置 -- plugin groupIdorg.springframework.boot/groupId artifactIdspring-boot-maven-plugin/artifactId configuration image nameregistry.example.com/myapp:${project.version}/name builderpaketobuildpacks/builder-jammy-base:latest/builder /image layers enabledtrue/enabled /layers /configuration /plugin三、Kubernetes 部署配置1. Deployment 配置apiVersion: apps/v1 kind: Deployment metadata: name: spring-boot-app labels: app: spring-boot-app spec: replicas: 3 strategy: type: RollingUpdate rollingUpdate: maxSurge: 1 maxUnavailable: 0 selector: matchLabels: app: spring-boot-app template: metadata: labels: app: spring-boot-app spec: containers: - name: app image: registry.example.com/myapp:1.0.0 imagePullPolicy: Always ports: - containerPort: 8080 name: http env: - name: SPRING_PROFILES_ACTIVE value: kubernetes - name: JAVA_OPTS value: -XX:UseG1GC -XX:MaxRAMPercentage75.0 -XX:InitialRAMPercentage50.0 - name: SERVER_PORT value: 8080 - name: MANAGEMENT_SERVER_PORT value: 8081 resources: requests: memory: 512Mi cpu: 500m limits: memory: 1Gi cpu: 1000m livenessProbe: httpGet: path: /actuator/health/liveness port: 8081 initialDelaySeconds: 60 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 3 readinessProbe: httpGet: path: /actuator/health/readiness port: 8081 initialDelaySeconds: 30 periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 3 startupProbe: httpGet: path: /actuator/health/liveness port: 8081 initialDelaySeconds: 10 periodSeconds: 5 timeoutSeconds: 3 failureThreshold: 30 volumeMounts: - name: tmp mountPath: /tmp volumes: - name: tmp emptyDir: {} securityContext: runAsNonRoot: true runAsUser: 1000 fsGroup: 10002. Service 配置apiVersion: v1 kind: Service metadata: name: spring-boot-app labels: app: spring-boot-app spec: type: ClusterIP ports: - port: 80 targetPort: 8080 protocol: TCP name: http - port: 8081 targetPort: 8081 protocol: TCP name: management selector: app: spring-boot-app3. Ingress 配置apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: spring-boot-app annotations: nginx.ingress.kubernetes.io/rewrite-target: / nginx.ingress.kubernetes.io/ssl-redirect: true nginx.ingress.kubernetes.io/proxy-body-size: 10m nginx.ingress.kubernetes.io/rate-limit: 100 spec: ingressClassName: nginx tls: - hosts: - api.example.com secretName: api-tls-secret rules: - host: api.example.com http: paths: - path: / pathType: Prefix backend: service: name: spring-boot-app port: number: 80四、配置管理1. ConfigMap 配置apiVersion: v1 kind: ConfigMap metadata: name: spring-boot-config data: application-kubernetes.yml: | server: port: 8080 management: server: port: 8081 endpoints: web: exposure: include: health,info,metrics,prometheus endpoint: health: probes: enabled: true show-details: always spring: datasource: url: jdbc:postgresql://postgres:5432/mydb hikari: maximum-pool-size: 10 minimum-idle: 5 redis: host: redis port: 6379 kafka: bootstrap-servers: kafka:90922. Secret 配置apiVersion: v1 kind: Secret metadata: name: spring-boot-secrets type: Opaque stringData: DB_USERNAME: dbuser DB_PASSWORD: dbpassword REDIS_PASSWORD: redispassword JWT_SECRET: your-jwt-secret-key3. 环境变量注入# 在 Deployment 中引用 ConfigMap 和 Secret env: - name: SPRING_CONFIG_LOCATION value: classpath:/,file:/config/ - name: DB_USERNAME valueFrom: secretKeyRef: name: spring-boot-secrets key: DB_USERNAME - name: DB_PASSWORD valueFrom: secretKeyRef: name: spring-boot-secrets key: DB_PASSWORD volumeMounts: - name: config mountPath: /config volumes: - name: config configMap: name: spring-boot-config五、水平自动扩缩容apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: spring-boot-app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: spring-boot-app minReplicas: 3 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 - type: Resource resource: name: memory target: type: Utilization averageUtilization: 80 behavior: scaleUp: stabilizationWindowSeconds: 60 policies: - type: Percent value: 100 periodSeconds: 60 scaleDown: stabilizationWindowSeconds: 300 policies: - type: Percent value: 10 periodSeconds: 60六、监控与日志1. Prometheus ServiceMonitorapiVersion: monitoring.coreos.com/v1 kind: ServiceMonitor metadata: name: spring-boot-app-metrics labels: release: prometheus spec: selector: matchLabels: app: spring-boot-app endpoints: - port: management path: /actuator/prometheus interval: 30s2. 日志收集配置apiVersion: v1 kind: ConfigMap metadata: name: fluent-bit-config data: fluent-bit.conf: | [INPUT] Name tail Path /var/log/containers/spring-boot-app*.log Parser docker Tag kube.* Refresh_Interval 5 [FILTER] Name kubernetes Match kube.* Kube_URL https://kubernetes.default.svc:443 Kube_CA_File /var/run/secrets/kubernetes.io/serviceaccount/ca.crt Kube_Token_File /var/run/secrets/kubernetes.io/serviceaccount/token [OUTPUT] Name es Match * Host elasticsearch Port 9200 Index spring-boot-logs Type _doc七、CI/CD 集成1. GitLab CI 配置stages: - build - test - package - deploy variables: MAVEN_OPTS: -Dmaven.repo.local.m2/repository DOCKER_REGISTRY: registry.example.com IMAGE_NAME: $DOCKER_REGISTRY/myapp build: stage: build image: eclipse-temurin:21-jdk script: - ./mvnw compile cache: paths: - .m2/repository test: stage: test image: eclipse-temurin:21-jdk script: - ./mvnw test artifacts: reports: junit: target/surefire-reports/*.xml package: stage: package image: docker:24 services: - docker:24-dind script: - docker build -t $IMAGE_NAME:$CI_COMMIT_SHA -t $IMAGE_NAME:latest . - docker push $IMAGE_NAME:$CI_COMMIT_SHA - docker push $IMAGE_NAME:latest deploy: stage: deploy image: bitnami/kubectl:latest script: - kubectl set image deployment/spring-boot-app app$IMAGE_NAME:$CI_COMMIT_SHA - kubectl rollout status deployment/spring-boot-app only: - main八、生产环境最佳实践1. 资源管理始终设置资源请求和限制使用垂直 Pod 自动扩缩容VPA优化资源分配监控资源使用情况及时调整配置2. 安全加固使用非 root 用户运行容器启用安全上下文SecurityContext使用 NetworkPolicy 限制网络访问定期扫描镜像漏洞3. 高可用配置配置 Pod 反亲和性确保 Pod 分布在不同节点使用 PodDisruptionBudget 保证最小可用副本数配置多区域部署提高容灾能力affinity: podAntiAffinity: preferredDuringSchedulingIgnoredDuringExecution: - weight: 100 podAffinityTerm: labelSelector: matchExpressions: - key: app operator: In values: - spring-boot-app topologyKey: kubernetes.io/hostname九、总结Kubernetes 为 Spring Boot 应用提供了强大的部署和管理能力。通过合理的配置和最佳实践我们可以构建出高可用、可扩展、易维护的云原生应用。这其实可以更优雅一点。希望这篇文章能帮助大家更好地在 Kubernetes 上部署 Spring Boot 应用。如果你有任何问题欢迎在评论区留言。关于作者我是 Alex一个在 CSDN 写 Java 架构思考的暖男。喜欢手冲咖啡养了一只叫Java的拉布拉多。如果我的文章对你有帮助欢迎关注我一起探讨 Java 技术的优雅之道。

相关文章:

Kubernetes 部署 Spring Boot 应用:从入门到生产实践

Kubernetes 部署 Spring Boot 应用:从入门到生产实践 别叫我大神,叫我 Alex 就好。 一、引言 大家好,我是 Alex。Kubernetes 已经成为云原生应用部署的事实标准,而 Spring Boot 是 Java 微服务开发的首选框架。今天,我…...

Python数据类配置模式详解

在现代Python应用开发中,配置管理是一个关键环节。今天我们来深入分析一个优雅的配置管理实现,它展示了如何将环境变量配置与数据类完美结合。 核心概念 让我们先看一个典型的配置类实现: from __future__ import annotations import os from…...

深入理解Python @dataclass:从基础到高级用法

Python 3.7引入了dataclass装饰器,这是一个强大的工具,能够显著减少数据类的样板代码。本文将详细介绍dataclass的各种用法,特别是如何正确处理可变默认值和类型注解。 什么是dataclass dataclass是位于dataclasses模块中的装饰器&#xff0c…...

手把手教你用RFSoC ZU47DR的DAC/ADC:从单音信号到1200MHz宽带调制的避坑实践

手把手教你用RFSoC ZU47DR的DAC/ADC:从单音信号到1200MHz宽带调制的避坑实践 当一块开发板的价格抵得上半辆家用轿车时,每个操作步骤都值得反复推敲。这就是RFSoC ZU47DR给我的第一印象——强大到令人兴奋,复杂到让人却步。作为赛灵思第三代射…...

jEasyUI 显示海量数据

jEasyUI 显示海量数据 引言 随着互联网技术的飞速发展,大数据时代已经到来。在众多前端框架中,jEasyUI以其简洁、易用、功能强大等特点,受到了广大开发者的喜爱。本文将深入探讨jEasyUI在显示海量数据方面的应用,帮助开发者更好地应对大数据挑战。 jEasyUI简介 jEasyUI…...

Matlab仿真研究:三机并联风光混合储能并网系统的建模与控制策略实现

Matlab仿真三机并联风光混合储能并网系统,风光储并网,微电网系统,光伏电池模型,永磁同步风机,电压电流控制,PQ控制 波形正确,结构完整有参考文献,详情见图片 三机并联风光混合储能并…...

基于Yolov5的钢轨表面缺陷检测:数据集与含训练好的模型

基于yolov5的钢轨表面缺陷检测 数据集含训练好的模型一、项目概述 本项目基于YOLOv5 7.0版本构建,专注于钢轨表面缺陷检测任务,提供了完整的模型训练、推理、导出及性能评估工具链。项目包含47个核心文件,涵盖数据加载、模型构建、训练优化、…...

永磁同步电机参数辨识全解析:从原理到代码实现

永磁同步电机参数辨识 提供原理图、PCB和BOM表及文档说明 永磁同步电机参数辨识 包括初始位置检测,编码器零点位置、方向辨识; 包括电机极对数、电阻、电感、磁链、反电势常数、编码器零位等 包括源C代码,代码详细注释文档,可见…...

基于VSC控制的400kW光伏并网发电厂模型

基于VSC控制的400kW光伏并网发电厂模型simulink模型各模块清晰明白,非常适用于新手入门学习大家好!今天我要和大家分享一个关于光伏并网发电厂模型的Simulink仿真项目。这个模型基于电压源式开关(VSC)控制,非常适合400…...

AI时代程序员必看!揭秘Harness Engineerin

当AI智能体开始批量编写代码,程序员会失业吗?OpenAI的一个实验给出了惊人答案:在一次实验中,3名工程师配合1500个AI智能体,竟在5个月内完成了100万行代码的产品开发——人类一行代码都没写!但背后真正的秘密…...

MTKClient技术内幕:从硬件交互到场景落地的深度探索

MTKClient技术内幕:从硬件交互到场景落地的深度探索 【免费下载链接】mtkclient MTK reverse engineering and flash tool 项目地址: https://gitcode.com/gh_mirrors/mt/mtkclient 一、技术原理解析:MTKClient如何与硬件对话 MTKClient的核心能…...

华泰证券2027届校招启动|提前批+国际管培+金融科技,三个专场一次说清

导读很多同学还在等“春招后半场捡漏”,但现实已经变了。头部企业的优质岗位,正在通过提前批 专项项目提前锁定人选。如果你现在才开始准备,很可能连入场资格都拿不到。这次华泰证券的校招,就是一个非常典型的信号:提…...

算法分析与设计

欢迎来到我的软考中级——软件设计师备考合集。这里不只是一份简单的知识点堆砌,而是我在备考征途中,对庞杂知识体系进行深度梳理与内化的结晶。 面对浩瀚的考纲,从计算机组成原理的底层逻辑,到操作系统的进程调度;从数…...

集成学习完全指南:从AdaBoost到随机森林,揭秘为什么一群“弱鸡”能吊打“学霸”

在机器学习领域,单个模型的表现往往受限于其固有的偏差(Bias)和方差(Variance)问题——这就好比一位再厉害的学霸,也难免有自己的知识盲区。集成学习(Ensemble Learning)正是为解决这…...

AppML 参考手册

AppML 参考手册 引言 AppML(Application Markup Language)是一种用于创建移动应用程序的标记语言。它提供了一种简单、高效的方式来定义应用程序的结构和功能。本手册旨在为开发者提供关于AppML的全面指南,包括其基本概念、语法规则、常用元素以及最佳实践。 AppML 概述 …...

**TEE加持下的安全编程实践:基于Rust的可信执行环境开发实战**在现代软件系统日益复杂的今天

TEE加持下的安全编程实践:基于Rust的可信执行环境开发实战 在现代软件系统日益复杂的今天,数据隐私与运行时安全已成为开发者不可回避的核心挑战。传统的沙箱机制和用户权限控制早已无法满足对敏感计算场景(如金融交易、生物识别、AI推理&…...

计算机毕业设计:Python地铁运营可视化平台 Django框架 数据分析 可视化 大数据 机器学习 深度学习(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

03_Elasticsearch知识体系之QueryDSL全文搜索过滤聚合实战

03_Elasticsearch知识体系之QueryDSL全文搜索过滤聚合实战 Elasticsearch知识体系 基础概念层数据存储层查询语言层【本文:Query DSL】搜索能力层数据处理层集群架构层开发集成层AI增强层行业应用层 关键词: Elasticsearch、Query DSL、match、term、boo…...

计算机毕业设计:Python汽车数据可视化分析平台 Django框架 可视化 线性回归 数据分析 机器学习 深度学习 AI 大模型(建议收藏)✅

博主介绍:✌全网粉丝50W,前互联网大厂软件研发、集结硕博英豪成立软件开发工作室,专注于计算机相关专业项目实战6年之久,累计开发项目作品上万套。凭借丰富的经验与专业实力,已帮助成千上万的学生顺利毕业,…...

前端TypeScript吐槽:别再让你的代码变成类型地狱!

前端TypeScript吐槽:别再让你的代码变成类型地狱! 毒舌时刻 前端TypeScript就像安全套——用对了能保护你,用错了会让你难受。TypeScript、tsconfig、类型定义... 一堆TypeScript工具让你晕头转向,结果你的代码要么类型定义复杂得…...

告别OBS!用JavaCV+FFmpeg在Windows上搭建个人直播推流服务器(含Nginx配置)

用JavaCVFFmpeg构建Windows直播推流服务器的全栈指南 直播技术正在从专业领域向个人开发者渗透,但传统方案如OBS往往过于笨重且缺乏定制性。本文将带你用JavaCVFFmpegNginx搭建一套轻量级直播推流服务器,实现从视频采集、编码推流到服务端分发的完整链路…...

HFSS新手避坑指南:手把手教你调出2.45GHz的侧馈矩形微带天线

HFSS实战:2.45GHz侧馈矩形微带天线设计全流程解析 第一次打开HFSS时,看着满屏的参数和复杂的界面,我完全不知道从哪里下手。天线理论课上那些公式在仿真软件里变成了一个个需要设置的数值,而最让人崩溃的是——明明按照教科书参数…...

Rancher国内网络卡脖子?手把手教你配置私有镜像仓库(避坑RKE2 registries.yaml)

Rancher国内网络优化实战:私有镜像仓库配置全指南 引言 对于国内Kubernetes从业者来说,Rancher无疑是一款强大的集群管理工具。但在实际部署过程中,许多团队都遇到过因网络问题导致镜像拉取失败的困扰。想象一下,当你正准备部署一…...

OAK-D-S2/FFC系列深度校准实战:从原理到提升精度的几个关键技巧

OAK-D-S2/FFC系列深度校准实战:从原理到提升精度的几个关键技巧 深度相机校准是计算机视觉领域的一项基础但至关重要的技术。对于OAK-D-S2和FFC系列这样的高性能设备,校准质量直接决定了深度图的精度和可靠性。本文将带您深入理解校准背后的数学原理&am…...

终极指南:3步快速修复Visual C++运行库,让Windows告别DLL错误

终极指南:3步快速修复Visual C运行库,让Windows告别DLL错误 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist Visual C运行库是Windows系统…...

Maven父子工程搭建:微服务项目模块化架构基础

Maven父子工程搭建:微服务项目模块化架构基础 一、为什么需要Maven父子工程? 在单体应用向微服务架构演进的过程中,项目规模会迅速膨胀。想象一个电商系统,包含用户中心、商品服务、订单服务、支付服务、库存服务等数十个模块—…...

微服务七大核心组件详解:搞懂架构运行底层逻辑

从实战视角拆解微服务架构的"五脏六腑",掌握每个组件的设计哲学与落地细节一、为什么需要这七大组件? 微服务架构的本质是分布式系统的工程化实践。当单体应用拆分为数十个甚至上百个独立服务后,我们面临的核心挑战:挑战…...

2009 Text 1

2009 Text 1...

2007 Text 3

2007 Text 3...

MATLAB频谱分析:从fft到fftshift的实战解读

1. 为什么我们需要频谱分析? 想象一下你正在调试一段音频,听到里面有奇怪的嗡嗡声。作为工程师,你不仅想知道"有杂音",更想知道这个杂音具体是哪个频率成分。这就是频谱分析的用武之地——它像是一把声音的显微镜&#…...