使用 ConfigMaps 优化 Spring Boot 的配置管理:环境变量或卷挂载
高效的配置管理:本文阐述了在 Spring Boot 应用程序中进行有效管理配置的方法,强调使用 Kubernetes ConfigMaps 来存储应用程序的属性。
与 Kubernetes 的无缝集成:概述了无缝集成技术,展示了 Spring Boot 应用程序如何在 Kubernetes 部署中以环境变量或卷挂载的方式访问 ConfigMap 数据。
简化的部署过程:通过实际用例和代码样例,本文简化了部署过程,允许开发人员在 Kubernetes 环境中有效地管理和部署他们的 Spring Boot 应用。
选择配置注入方法:该过程将会指导你根据具体的用例需求,选择将 ConfigMap 数据注入到 Spring Boot 应用程序的恰当方法,即通过环境变量或者卷挂载。
增强的可扩展性和灵活性:通过利用 ConfigMaps,开发人员可以轻松地更新应用程序的配置,而无需重新构建或重新部署应用程序,从而增强了可扩展性和灵活性。
在快节奏的云原生开发领域,Spring Boot 凭借其敏捷性和简洁的工作流成为了广受欢迎的框架。然而,高效的配置管理依然是影响部署效率和持续维护的关键因素。传统上,复杂的配置会被固化在应用程序的代码中或者通过外部文件来进行管理,这给 Kubernetes 这样的环境带来了挑战,因为在这些环境中,适应性是关键。
本文是释放 ConfigMaps 潜力的入口,ConfigMaps 是 Kubernetes 中的一项特性,能够为 Spring Boot 应用程序提供配置策略。通过将配置与容器镜像分离,ConfigMaps 提供了许多收益,包括简化部署、动态更新、强化安全性和简化维护。
在本文的旅程中,我们将探索在 Spring Boot 应用程序中使用 ConfigMaps 的两种主要方式,即分别将它们作为环境变量和卷来使用。在读完本文后,你将能够自信地驾驭 Kubernetes 的配置功能。
本文也可以作为在 Spring Boot 应用程序中管理配置的路线图。它深入探讨了如何将 ConfigMaps 集成到 Spring Boot 应用程序中,为开发人员提供所需的敏捷性和洞察力,以应对 Kubernetes 环境中的配置挑战。
过去,开发人员通常在应用程序代码中嵌入配置细节,或者依赖于与部署制品(artifact)打包在一起的外部化属性文件。虽然这种方式在静态环境中很好用,但是在 Kubernetes 中却很难行之有效。
要开发一个在 Kubernetes 中利用 ConfigMaps 的 Spring Boot 应用程序,以便于为 Spring Boot 应用程序解耦配置策略,我们需要如下的前提条件:
→ Spring Boot 的基础知识:熟练使用 Spring Boot 框架开发应用程序。
→ Java 开发工具包(JDK):在开发机器上安装 JDK。较新版本的 Spring Boot 通常需要 Java 17 或更高版本。
→ Spring Boot 项目搭建:使用推荐的构建工具,如 Maven 或 Gradle,并使用 Spring Initializr 建立 Spring Boot 项目。
→ Kubernetes 集群访问:建立一个 Kubernetes 集群,以便于部署和测试应用程序,我推荐使用 minikube start。
→ kubectl 命令行工具:安装 Kubernetes 命令行工具kubectl
,以便与 Kubernetes 集群进行交互。
→ Kubernetes 配置文件:了解如何编写用于部署应用程序、服务和 ConfigMaps 的 Kubernetes 配置文件(YAML 或 JSON)。
→ ConfigMap 的知识:了解 Kubernetes 中的 ConfigMaps,以及如何使用它来实现配置数据与应用程序代码的分离存储。
→ Spring Boot 中的配置处理:了解 Spring Boot 应用程序如何从环境变量或外部配置文件中动态读取配置属性。
→ Docker 的知识:了解 Docker 容器,因为 Spring Boot 应用程序通常会作为容器化的应用部署在 Kubernetes 中。
→ IDE(集成开发环境):使用 IntelliJ IDEA、Eclipse 或 Visual Studio Code 等 IDE 进行 Java 开发。
在 Kubernetes 环境中配置 Spring Boot 应用程序是一项独特的挑战,尤其是跨不同部署环境处理多阶段的配置数据时更是如此。本文提供了使用 Kubernetes ConfigMaps 存储应用程序属性源的高效配置策略。我们将会讨论两种主要的方法,即将 ConfigMaps 加载为环境变量或卷挂载,并阐述每种方法的优势和注意事项。通过实际的样例和真实的使用场景,你将会发现如何利用 ConfigMaps 来增强 Kubernetes 部署中的应用程序可移植性、可扩展性和可维护性。
在 Kubernetes 中,ConfigMaps 用作存储 Spring Boot 应用程序所使用的配置数据的存储库,这有效地将敏感数据与容器镜像代码分离开来。对于 Kubernetes 环境中的 Spring Boot 应用程序,ConfigMaps 能够让开发人员将配置参数实现外部化,这涵盖了属性文件和环境变量,从而简化管理,并且能够在无需代码变更的情况下调整设置。
尽管 Kubernetes 是容器化应用和云原生开发领域的事实标准,但是高效的配置管理对 Spring Boot 应用程序至关重要。传统上,开发人员会直接在应用程序代码中嵌入配置细节,或依赖与部署包捆绑在一切的外部属性文件。虽然这些方法有其优点,但是它们在灵活性和敏捷性方面带来了挑战,尤其是在 Kubernetes 环境中。
你可以将 ConfigMaps 视为一个中心化的存储库,存储 Spring Boot 应用程序所需的配置数据,而无需关心部署环境是什么样子的。ConfigMaps 具有键 - 值存储的功能,专门用来保存 Kubernetes 集群中应用程序可访问的配置详情。这种将配置与容器镜像解耦的方式具有很多的优点:
易于部署:ConfigMaps 消除了在容器镜像中嵌入配置或管理外部属性文件的麻烦。这种方式加快了部署,减少了镜像大小,并提高了敏捷性。
动态配置:ConfigMaps 允许在不改变代码库的前提下对配置值进行即时调整。这种能力有利于扩展、环境适应和 A/B 测试。
解耦配置与代码:通过将配置细节与应用程序代码分离开来,ConfigMaps 可以使代码更为整洁,提升可维护性,让开发人员更容易地理解代码。
强化安全性:ConfigMaps 为敏感信息提供了一个安全的区域,保护 Kubernetes 集群内像数据库凭证或 API 秘钥这样的数据。通过这种简单直接的方式,ConfigMaps 为简化部署、动态更新以及更安全、更可维护的应用程序铺平了道路。
数据库连接:与数据库连接相关的配置参数(如数据库 URL、凭证和连接池设置)可以存储在 ConfigMaps 中。然后,应用程序就可以使用这些配置建立与数据库的连接。
日志级别:ConfigMaps 可以包括日志级别(
TRACE
、DEBUG
、INFO
、WARN
、ERROR
和FATAL
)、日志文件的位置和日志输出格式的设置。通过调整这些配置,开发人员可以控制 Spring Boot 应用程序的日志及其位置。环境变量:ConfigMaps 可以定义注入到 Spring Boot 应用程序运行时的环境变量,运行时可以访问这些环境变量,从而根据提所供的配置自定义其行为。这些环境变量包括 Spring profile、服务器端口、上下文路径、运行时环境和内存设置。
属性文件:ConfigMaps 可以存储
application.properties
或application.yml
文件,其中包含了代表 Spring Boot 应用程序配置的键 - 值对。这些文件可以加载到 Spring Boot 的应用上下文中,允许应用程序读取和使用这些配置数据。特性开关:ConfigMaps 可以包含特性开关的设置,允许开发人员动态启用或禁用应用程序中特定的功能。这样就能实现灵活的特性管理,而无需重新部署应用程序。
支持 Profile:加载某个活跃 Spring Boot profile 的特定配置。
热重载:当 ConfigMap 发生变更时,自动重新加载配置,无需重新启动应用程序。
消息队列配置:使用 Kubernetes 中的 ConfigMaps 为 Spring Boot 应用程序进行存储和管理的另一个重要方面是消息队列的配置。这方面的样例包括队列、主题名称、代理连接 URL、重新投递策略、并发、扩展配置、事务类型、交付模式和安全性。通过在 ConfigMaps 中存储队列配置,在 Kubernetes 中运行的 Spring Boot 应用程序可以轻松地适应消息基础设施或需求的变更,而无需修改代码。
总而言之,ConfigMaps 提供了一种机制,用来管理部署在 Kubernetes 环境中的 Spring Boot 应用程序的不同组件之间的配置数据。Spring Boot 应用程序可以根据存储在 Kubernetes ConfigMaps 中的配置动态调整其行为,从而提高灵活性、可扩展性并简化管理。
使用 ConfigMaps 配置在 Kubernetes 上运行的 Spring Boot 应用程序主要有两种方式,第一种方式是将 ConfigMaps 作为环境变量加载到 Spring Boot 应用程序中,第二种方式是将 ConfigMaps 作为卷挂载到 Spring Boot 应用程序中。在对 ConfigMap 进行更改时,卷加载可以实现配置的热重载。
将 ConfigMaps 作为环境变量加载到 Spring Boot 应用程序中是在 Kubernetes 环境中管理配置数据的最佳实践。下面将通过手把手的指南来说明如何将 ConfigMap 中的SPRING_APPLICATION_JSON
作为环境变量来加载 Spring Boot 配置的:
创建 Spring Boot 应用程序:像以往一样开发 Spring Boot 应用程序,包括定义应用属性或 YAML 配置文件(参考代码)。
让 Spring Boot 应用程序为 Kubernetes 做好准备:确保将 Spring Boot 应用程序配置为从环境变量读取配置属性。我们可以使用 Spring Boot 内置的环境变量替换支持来实现这一点。
定义 ConfigMap YAML 文件:ConfigMap YAML 包含了我们要注入到 Spring Boot 应用程序的 JSON 配置。我们可以使用 YAML 文件创建 ConfigMap。如下是一个 ConfigMap 的 YAML 定义样例:
configmap.yml
创建 ConfigMap 对象:执行kubectl apply -f config.yml
命令,在 Kubernetes 集群中创建 ConfigMap 对象。我们可以单独部署它们,也可以将其作为同一部署清单 YML 的一部分进行部署。
将 ConfigMaps 作为环境变量进行加载:配置 Kubernetes 部署 YAML 文件,将 ConfigMaps(config.yml
)作为 Spring Boot 应用程序的环境变量进行挂载。这可以通过在容器规范的env
区域引用 ConfigMap 的键来实现。下面是一个部署清单的样例:
deployment.yml
在 Spring Boot 中访问 ConfigMap 数据:在 Spring Boot 应用程序中,通过环境变量访问 ConfigMaps 提供的数据。Spring Boot 会自动将环境变量加载到其Environment
对象中,以便于我们通过编程的方式访问它们。Spring Boot 中的SPRING_APPLICATION_JSON
环境变量允许我们提供内联的 JSON 来配置 Spring Boot 应用。当 Spring Boot 启动时,它会查找该环境变量,如果存在的话,则会解析 JSON 内容并将其与 Spring Boot 应用程序现有的配置进行合并。
当 Spring Boot 应用程序启动并探测到带有 JSON 内容的SPRING_APPLICATION_JSON
环境变量时,它将覆盖相应的数据源 URL、用户名和密码属性。
启动 Spring Boot 应用:部署创建后,Kubernetes 会将 ConfigMap 中的环境变量注入到 Spring Boot 应用程序的 Pod 中。Spring Boot 应用程序会自动获取这些环境变量,并使用它们来配置自己。这就是所有的内容!现在,Spring Boot 应用程序已经配置为从SPRING_APPLICATION_JSON
环境变量加载其配置,而该环境变量来自 Kubernetes 中的 ConfigMap。这样就可以动态管理 Spring Boot 应用程序的配置,而无需修改其代码。
使用环境变量的完整 ConfigMaps 应用程序可在此 GitHub仓库 中找到。
在 Kubernetes 环境中管理配置数据的另一种做法就是将 ConfigMaps 作为 Kubernetes 中的卷加载到 Spring Boot 应用程序中。
下面将通过手把手的指南来实现在 Kubernetes 中使用卷挂载加载 Spring Boot 配置:
创建 ConfigMap:在 Kubernetes 中创建一个 ConfigMap,其中包含 Spring Boot 应用程序所需的配置数据。我们可以使用 YAML 配置创建 ConfigMap:
configmap.yml
将 ConfigMap 挂载为卷:修改 Kubernetes 部署配置 YAML 文件,将 ConfigMap 作为卷挂载到运行 Spring Boot 应用程序的 Pod 中。我们需要声明应用程序希望在何处查找配置文件的挂载路径。
deployment.yml
更新 Spring Boot 应用程序:配置 Spring Boot 应用程序,以便于从挂载的卷路径读取配置文件。我们需要相应地调整应用程序属性 YML 文件的位置。
部署应用程序:使用更新后的部署配置将 Spring Boot 应用程序部署到 Kubernetes 中。确保在与应用程序运行相同的命名空间中创建 ConfigMap。例如:namespace: dev
验证配置:验证 Spring Boot 应用程序是否能够从挂载的卷中访问配置数据。你可以进入正在运行的 Pod 并检查挂载的卷,以确保配置文件存在。
测试 ConfigMap 更新:使用kubectl
命令或通过更新 ConfigMap YAML 配置来更改 ConfigMap 数据。验证更改是否能够体现在运行的 Spring Boot 应用程序中,而无需重新部署或更改代码。
这种方法允许在容器镜像之外管理应用程序的配置,使部署更加动态化、更易于更新。
ConfigMaps 是版本化的,因此可以跟踪它的更改并在需要时进行回滚。
这种将配置与容器映像解耦的方式可带来多种好处使用卷挂载的完整 ConfigMaps 应用程序可在此 GitHub仓库 中找到。
使用 ConfigMaps 作为环境变量,我们可以获得很多好处,从而增强 Kubernetes 环境中 Spring Boot 应用程序的配置管理。通过将配置从容器镜像中抽取出来,我们构建了一个无缝更新的部署环境,并且能够通过版本管理轻松跟踪变更。这种解耦提供了大量优势,包括简化部署、降低错误的风险和提高可维护性。
此外,这种方法还能鼓励开发人员采用敏捷实践,促进快速迭代,并在组织内部推广 DevOps 文化。虽然它可能不是放之四海而皆准的解决方案,尤其是对于复杂的配置需求而言更是如此,但是,将 ConfigMaps 作为环境变量所带来的广泛用途和简便性使其成为 Kubernetes 武器库中一个强大的工具。
结合 Kubernetes 管理 ConfigMaps 和 Secrets 的原生功能,开发人员可以自主使用某个框架来确保 Spring Boot 应用程序针对云原生环境的最佳配置。通过遵循配置管理的最佳实践,包括战略性地利用 ConfigMaps 作为环境变量,开发人员可以构建具备韧性、可扩展和可维护的应用程序,在 Kubernetes 部署中游刃有余。从本质上讲,ConfigMaps 为更敏捷、更高效的配置管理方法铺平了道路,为在动态的云原生开发领域取得成功奠定了基础。
Naveen Pujaris,Naveen Pujaris 是 J.B. Hunt Transport Services 的专家软件工程师和云架构师,在为运输与物流行业开发和部署软件应用程序方面拥有九年以上的工作经验。Naveen 的核心能力包括使用 Redhat Fuse 和 Apache Camel 提供集成解决方案,以及使用 Java、Spring Boot、Camel 和 Kafka 创建微服务。他已在 Docker、Kubernetes、Google Cloud Platform 和 Azure 等各种云平台上成功实现了这些技术。他热衷于使用敏捷方法论、代码审查、设计模式和 OOAD 开发高效、高可重用和可维护的软件应用程序。
查看英文原文:
Optimizing Spring Boot Config Management with ConfigMaps: Environment Variables or Volume Mounts (https://www.infoq.com/articles/config-maps-with-spring-boot/)
声明:本文由 InfoQ 翻译,未经许可禁止转载。
德国再次拥抱Linux:数万系统从windows迁出,能否避开二十年前的“坑”?
七年毫无成果,2.5 亿澳元打了水漂!澳大利亚证券交易所得到的教训:企业区块链从来都没有任何意义
远离硅谷、不靠风投!18人团队逆势搞出超人气数据库,CTO 一人5年多写了15万行代码
中国软件行业被指“全军覆没”;微软 Copilot GPTs 宣布停服;苹果股价暴涨,“一夜飙升”1.56万亿!| Q资讯
微信扫码关注该文公众号作者