属性配置文件在任何应用程序中都很是重要。它们不只可让应用程序具有灵活性,还可以根据文件中配置的值产生不一样的功能。实际上,在staging、开发、测试、UAT或生产环境中,咱们都使用属性配置文件来驱动不一样的行为。html
一般状况下,属性配置文件会与代码一块儿打包,而且整个程序包都部署在执行环境中。这一方法中,若是你想更改任何配置(即使配置文件中也发生了更改),你须要从新发布代码。尽管这种方法行之有效,可是对于如今而言,效率仍是过低了。所以咱们须要一种外部化的配置。node
在本文中,我将阐述Kubernetes如何为容器提供外部化、灵活的配置以及可移植性。ConfigMap主要是为了让应用程序的配置和部署解耦,这一功能可让容器化应用程序具有可移植性。git
若是你对Spring Cloud的生态很熟悉,那么接下来你会发现ConfigMap与Spring Cloud server十分相似。这里有两种使用ConfigMap的方法:github
将ConfigMap做为一种环境变量spring
将ConfigMap挂载为文件浏览器
让咱们开始进行实践!咱们将使用一个简单的应用程序,基于Spring Boot、Docker和Kubernetes进行演示。springboot
在本例中,咱们将在Kubernetes中建立一个新的环境变量,并将其用于代码中。在Java中,能够经过System.getenv(String) API在代码中使用环境变量。在常规Java应用程序中,能够在J2EE应用程序容器(如Oracle WLS或IBM WAS)中设置环境变量,也能够在OS中设置环境变量。然而,在Kubernetes中状况并不相同。要使用环境变量,咱们必须根据literal建立配置映射。app
经过kubectl create configmap
命令,咱们建立了两个环境变量:app.name 和 app.desc。ide
咱们来了解一下这背后发生了什么。spring-boot
如今注意数据部分,在数据部分下,你会找到键值对。从技术上来讲,ConfigMap仅仅是键值存储。属性的名称是键,属性的值是值。应用程序的代码会要求你查找这些键值对。
为了在Java代码中使用此环境变量,咱们须要编写如下代码:
下面的代码段定义了两个K8s环境变量,分别为“ SPRING_BOOT_HELLO_WORLD_APP_NAME
”和“ SPRING_BOOT_HELLO_WORLD_DESC
”。这些变量将从ConfigMap app-env-config获取值。须要重点关注的是键。
属性配置文件能够在单个文件中保存不少个属性,以在不一样环境中运行应用程序。在Spring Boot应用程序中,属性保存在classpath下的application.properties文件中。咱们来看一下打包在应用程序jar包中的application.properties文件。
咱们正在使用命令kubectl create configmap从单个文件或从多个文件建立ConfigMap。
如今让咱们查看完整的代码。
在本节中,我将说明如何使用ConfigMap挂载文件之外部化配置。在此示例中,我将使用ConfigMap来外部化application.properties
文件。即便默认文件打包在jar中,也位于src / main / resources下。简单来讲,咱们将经过ConfigMap所提供的文件来覆盖默认文件。
第一步是从application.properties
建立ConfigMap。让咱们了解如何在K8s中存储此ConfigMap。
经过ConfigMap,咱们将挂载application.properties文件到K8s集群中,而且能够在应用程序中使用它。请注意,数据部分包含了application.properties的内容,键是文件名。
如今,为了覆盖默认配置文件,咱们须要(经过ConfigMap)将application.properties挂载到应用程序的classpath中。Spring Boot经过提供不一样的选项来提供这一功能。SpringApplication在如下位置从application.properties文件加载属性,并将它们添加到Spring Environment:
当前目录的/config 子目录
当前目录
classpath / config包
The classpath root
若是你想了解更多信息,能够查阅官方文档:
最简单,最好的方法是将application.properties挂载在“ / config”目录中。
仔细检查挂载路径,请注意ConfigMap的名称应与咱们在上面建立的app-file-configmap彻底相同,键为文件名。另外,请确保将volume mount配置的名称更改成volume配置的名称。
这段代码说明了如何在application.properties文件中定义属性。若是使用Spring推荐的标准方法的话,这十分简单。具体而言,就是使用@Value
注释将属性值注入到变量中。
如今,咱们能够继续进行ConfigMap示例应用程序了。咱们来看一下完整的代码段。
让咱们建立一个Docker镜像并将其上传到Dockerhub。在本例中,镜像名称是k8s-springboot-helloworld-configmap—app。
如下是K8S pod配置文件:
如今咱们使用NodePort服务类型建立服务,以即可以从K8S集群外部使用Welcome服务。
如今,让咱们把这些更改应用于K8S。
导航到浏览器并访问http://<minikube_ip>:<service_node_port>/welcome。在本例,应该是http:// 192.168.99.100:30880/welcome。
认真观察输出,返回的字符串是:
同时,检查代码中硬编码的环境变量的默认值,以及打包在jar中的application.properties的property默认值。你发现从ConfigMap中获取了环境变量和application.properties的值。
这个项目能够从个人Github中获取: