译者 | 张卫滨
策划 | Tina
核心要点
引言
在快节奏的云原生开发领域,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 开发。
Spring Boot 应用程序中的 Kubernetes ConfigMap
在 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 集群中应用程序可访问的配置详情。这种将配置与容器镜像解耦的方式具有很多的优点:
Spring Boot 应用程序中 ConfigMaps 的各种组件
TRACE
、DEBUG
、INFO
、WARN
、ERROR
和FATAL
)、日志文件的位置和日志输出格式的设置。通过调整这些配置,开发人员可以控制 Spring Boot 应用程序的日志及其位置。application.properties
或application.yml
文件,其中包含了代表 Spring Boot 应用程序配置的键 - 值对。这些文件可以加载到 Spring Boot 的应用上下文中,允许应用程序读取和使用这些配置数据。总而言之,ConfigMaps 提供了一种机制,用来管理部署在 Kubernetes 环境中的 Spring Boot 应用程序的不同组件之间的配置数据。Spring Boot 应用程序可以根据存储在 Kubernetes ConfigMaps 中的配置动态调整其行为,从而提高灵活性、可扩展性并简化管理。
使用 ConfigMaps 配置在 Kubernetes 上运行的 Spring Boot 应用程序主要有两种方式,第一种方式是将 ConfigMaps 作为环境变量加载到 Spring Boot 应用程序中,第二种方式是将 ConfigMaps 作为卷挂载到 Spring Boot 应用程序中。在对 ConfigMap 进行更改时,卷加载可以实现配置的热重载。
第一种方式:将 ConfigMaps 作为环境变量加载到 Spring Boot 应用程序中
将 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仓库 中找到。
第二种方法:将 ConfigMaps 作为卷挂载到 Spring Boot 应用程序中
在 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 作为环境变量,我们可以获得很多好处,从而增强 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 翻译,未经许可禁止转载。