美文网首页
腾讯云及Rancher上微服务容器部署时配置与应用解耦方案

腾讯云及Rancher上微服务容器部署时配置与应用解耦方案

作者: 文景大大 | 来源:发表于2022-01-13 18:15 被阅读0次

以前在管理项目的配置文件时,通常一个项目下会维护多个环境下的配置,比如:

  • 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的状态和启动日志,应该可以正常使用了。

相关文章

网友评论

      本文标题:腾讯云及Rancher上微服务容器部署时配置与应用解耦方案

      本文链接:https://www.haomeiwen.com/subject/tnzncrtx.html