以前在管理项目的配置文件时,通常一个项目下会维护多个环境下的配置,比如:
- bootstrap.yml,启动引导配置文件;
- application.yml,公共配置文件;
- application-dev.yml,开发环境相关配置文件;
- application-stg.yml,测试环境相关配置文件;
- application-prd.yml,生产环境相关配置文件;
然后通过配置spring.profile.active
来指定哪个环境的配置文件生效。这种方式存在以下缺点:
- 应用和配置高度耦合;
- 修改配置必须重新打包发布,繁琐且耗时长;
- 不同环境之间的配置容易搞混淆,存在把开发、测试环境相关的配置带上生产的风险;
- 密钥相关的敏感信息(即使加密)都在配置文件中,存在泄露的风险;
因此,我们需要使用k8s容器环境下的配置文件管理的方式来解决以上的这些问题。
一、本地配置管理
本地的配置文件只保留一个bootstrap.yml
,且里面只有应用基本信息、注册中心和配置中心的信息(这里推荐使用Nacos),其它的配置信息全部保存到远端的配置中心里面。
# 应用基本信息配置
server:
port: 8080
# Spring应用基本信息配置
spring:
application:
# 应用名称
name: myapp
profiles:
# 环境配置,对nacos上的配置文件有效,比如对应myapp-dev.yaml中的dev,非必须
active: dev
main:
allow-bean-definition-overriding: true
cloud:
nacos:
discovery:
# 服务注册地址
server-addr: ***
# 命名空间的ID
namespace: aaa
# group来区分开发、测试及生产环境
group: dev
config:
# 配置中心地址
server-addr: ***
# 命名空间的ID
namespace: aaa
# group来区分开发、测试及生产环境
group: dev
# 配置文件格式
file-extension: yaml
该配置文件仅在开发环境生效,供开发人员进行开发联调时使用,测试及生产环境都不需要该配置文件,因此需要在maven打包时将该文件排除在外。
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>${maven-plugin.version}</version>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jar-plugin</artifactId>
<version>${maven-jar-plugin.version}</version>
<configuration>
<excludes>
<!-- 相对于打包后的class路径 -->
<!-- 排除开发环境的配置文件,nacos的配置存在pod的configmap中,其它配置存在nacos中 -->
<exclude>**/bootstrap.yml</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
二、使用配置中心
nacos集成了注册中心和配置中心的功能,首先需要为项目创建一个命名空间,一个命名空间对应一个项目,这里使用如上bootstrap.yml
中的aaa
;
关于注册中心,本地项目启动后,会自动注册到nacos的aaa命名空间下的dev分组中;
关于配置中心,我们需要先自行创建,命名规则为{spring.application.name}-{spring.profiles.active}.{spring.cloud.nacos.config.file-extension}
,对应上面的bootstrap.yml
中的内容就是myapp-dev.yaml
,再加上我们配置的分组是dev,所以项目启动后,就会去nacos上的aaa命名空间下dev分组中找myapp-dev.yaml
进行加载。
三、容器配置管理
如上是开发环境的配置文件管理方式,测试和生产环境我们就需要使用K8s中的configmap来代替本地的bootstrap.yml
,实现jar包中没有应用配置文件的目标。
3.1 Rancher环境的操作
-
进入项目空间后,选择资源中的配置映射,选择添加一个新的配置映射,填写内容如下:
- 名称:自定义填写内容;
- 命名空间:选择需要生效的命名空间,需要和将要使用该配置的应用在同一个命名空间下;
- 配置映射键:配置文件的名称,这里建议使用
bootstrap.yml
,也可以是别的自定义名称; - 配置映射值:如上配置文件中的全部内容粘贴进去就行;
- 可以在下面继续添加其它配置文件,最后点击保存;
-
在当前项目空间下,选择资源中的工作负载,点击新建部署服务或者升级已经存在的工作负载,相关联的填写内容如下:
- 数据卷新增一个“配置映射卷”;
- 卷名、默认模式均保持默认;
- 配置映射名选择上一步创建配置映射时的自定义名称;
- 项目选择所有键或者指定的键,这里的键就是指一个配置文件;
- 容器路径,指容器中配置文件的存放路径,这里自定义为
/config
; - 子路径保持为空;
- 入口命令,需要指定configmap中的配置文件启动:
java -jar -Dfile.encoding=utf-8 -Dspring.config.location=/config/bootstrap.yml myapp.jar
以上配置好了之后,检查下pod的状态和启动日志,应该可以正常使用了。
3.2 腾讯云环境的操作
-
进入测试集群中后,在配置管理里面找到ConfigMap,选择对应的命名空间,即需要使用Configmap的项目中,选择新建,填写内容如下:
-
名称:自定义填写内容;
-
命名空间:选择需要生效的命名空间,需要和将要使用该配置的应用在同一个命名空间下;
-
变量名:配置文件的名称,这里建议使用
bootstrap.yml
,也可以是别的自定义名称; -
变量值:如上配置文件中的全部内容粘贴进去就行;需要注意的是,如果是同一集群内跨namespace访问,配置形式如下:
# 服务注册地址:pod名称.namespace名称:端口号 server-addr: podname.namespace:port
-
-
选择新建workload,填写关键内容如下:
- 数据卷选择“使用ConfigMap”,名称自定义,选择配置项选择如上创建的配置名称,并指定使用全部键还是指定的键;
- 挂载点第一个选择自定义的数据卷名称,第二个选择挂载目录,即你想把配置文件放在容器中的什么路径下,第三个选择默认的subpath,第四个填写你的配置文件名称,第五个保持默认读写;
- 高级设置里面需要输入启动命令,指定使用configmap的配置文件进行启动,比如:
java -jar -Dfile.encoding=utf-8 -Dspring.config.location=/config/bootstrap.yml myapp.jar
,需要注意的是,每一个命令需要一个单独的输入框,不能写在一个输入框里面;
以上配置好了之后,检查下pod的状态和启动日志,应该可以正常使用了。
网友评论