一、问题背景:EdgeX配置管理的痛点

EdgeX Foundry是面向物联网边缘计算的开源框架,很多人用它来做边缘设备的连接、数据采集之类的工作。但用久了会发现一个很麻烦的问题:EdgeX的各个服务都是独立的容器,每个容器里都有自己的配置文件,比如核心服务有自己的配置,设备服务也有自己的配置,这些配置文件分散在不同容器的不同目录里,改起来特别麻烦。比如要改一个日志级别,得一个个容器进去找对应的配置文件,改完还要重启容器;更头疼的是,改完之后很难追踪,比如这个服务之前改了什么、为什么改,完全没记录,要是出问题了根本没法回滚。要是同时部署好几个EdgeX集群,每个集群的配置都不一样,那混乱程度更是翻倍。

二、解决思路:用环境变量覆盖+配置中心实现统一管理

要解决这个问题,核心思路是把分散的配置“收”起来,让所有配置都能从一个地方统一管控,而不是散在各个容器里。具体分两步走:第一步是用环境变量覆盖容器里的默认配置,这样不用改容器里的配置文件,就能临时改配置;第二步是引入配置中心,把所有配置都存在配置中心里,EdgeX服务启动时从配置中心拉取配置,实现全局统一管理。

2.1 环境变量覆盖:不用改容器配置的临时修改

EdgeX的服务设计本身支持环境变量覆盖配置,这是容器化应用的常见设计逻辑。简单来说,就是每个配置项都有一个对应的环境变量,只要在启动容器时设置这个环境变量,容器启动后就会用环境变量的值替换配置文件里的默认值。

举个实际的例子,比如EdgeX的核心服务之一core-metadata,它的配置文件里有一个配置项是LOG_LEVEL,默认值是INFO,如果想把它改成DEBUG,不用进容器改配置文件,只要在启动容器时设置环境变量LOG_LEVEL=DEBUG就行。

2.1.1 具体操作示例

我们用Docker来启动core-metadata服务,先看原来的启动命令(没加环境变量的):

# 启动core-metadata容器,默认用配置文件里的INFO日志级别
docker run -d --name core-metadata edgexfoundry/core-metadata:3.0.0

现在要改成DEBUG级别,只要加一个环境变量就行:

# 启动core-metadata容器,设置LOG_LEVEL环境变量为DEBUG,覆盖配置文件的默认值
docker run -d --name core-metadata -e LOG_LEVEL=DEBUG edgexfoundry/core-metadata:3.0.0

如果要同时改多个配置项,比如还要改服务的端口,那可以加多个环境变量:

# 同时修改日志级别和服务端口,-e后面跟多个键值对
docker run -d --name core-metadata -e LOG_LEVEL=DEBUG -e SERVER_PORT=8081 edgexfoundry/core-metadata:3.0.0

2.1.2 环境变量覆盖的注意事项

不是所有配置项都能随便改环境变量,EdgeX的配置项和环境变量有固定的对应规则,一般是把配置项的路径转成大写,用下划线连接。比如配置文件里的Writable.LogLevel,对应的环境变量就是WRITABLE_LOG_LEVEL;如果是嵌套的配置,比如Service.Server.Port,对应的环境变量就是SERVICE_SERVER_PORT。另外,环境变量覆盖的优先级最高,只要设置了环境变量,就会完全替换配置文件里的对应值,所以改之前一定要确认配置项的作用,避免改了不该改的参数导致服务启动失败。

三、配置中心的引入:实现全局配置统一管理

环境变量覆盖适合临时改几个配置,但如果配置项很多,或者要同时管理多个EdgeX集群的配置,环境变量就不够用了——每个集群的每个服务都要单独写一堆环境变量,维护起来还是麻烦。这时候就需要引入配置中心,把所有配置都存在配置中心里,EdgeX服务启动时从配置中心拉取配置,这样所有配置都能在配置中心统一管理、修改、追踪。

3.1 配置中心的选择

配置中心有很多种,比如Nacos、Consul、Spring Cloud Config,这里我们选Nacos,因为它简单易用,对容器化应用支持好,而且EdgeX也支持对接Nacos。

3.2 具体实现步骤

3.2.1 启动Nacos配置中心

首先要启动Nacos,我们用Docker来启动Nacos,方便快速部署:

# 启动Nacos容器,用单机模式,端口8848
docker run -d --name nacos -p 8848:8848 -p 9848:9848 -p 9849:9849 -e MODE=standalone nacos/nacos-server:2.2.0

启动成功后,打开浏览器访问http://localhost:8848/nacos,账号密码都是nacos,就能进入Nacos的管理界面了。

3.2.2 在Nacos中添加EdgeX的配置

EdgeX的服务配置可以按服务分组,比如把core-metadata的配置放在一个分组里。我们先创建一个命名空间,比如叫edgex-config,然后在这个命名空间里创建一个配置,比如给core-metadata创建配置:

{
  "Writable": {
    "LogLevel": "DEBUG"
  },
  "Service": {
    "Server": {
      "Port": 8081
    }
  }
}

然后把这个配置的Data ID设为core-metadata,Group设为edgex-services,这样core-metadata服务启动时就能找到这个配置了。

3.2.3 启动EdgeX服务并对接Nacos

现在启动core-metadata服务,让它从Nacos拉取配置,需要设置几个环境变量来告诉服务Nacos的地址、命名空间等信息:

# 启动core-metadata,对接Nacos配置中心
docker run -d --name core-metadata \
  # 开启配置中心功能
  -e CONFIG_PROVIDER=nacos \
  # Nacos的地址
  -e NACOS_ADDR=localhost:8848 \
  # Nacos的命名空间ID(在Nacos管理界面的命名空间里可以看到)
  -e NACOS_NAMESPACE=your-namespace-id \
  # 配置的Group
  -e NACOS_GROUP=edgex-services \
  # 配置的Data ID
  -e NACOS_DATA_ID=core-metadata \
  edgexfoundry/core-metadata:3.0.0

这样启动后,core-metadata服务就会从Nacos拉取配置,而不是用容器里的默认配置了。如果要修改配置,只要在Nacos里修改对应的配置,然后重启服务(EdgeX支持配置热更新的话可以不用重启),就能生效。

3.3 多服务、多集群的配置管理

如果有多个EdgeX服务,比如core-datacore-metadatadevice-virtual,可以在Nacos里为每个服务创建对应的配置,然后每个服务启动时设置对应的环境变量,拉取自己的配置。如果有多个EdgeX集群,比如生产集群、测试集群,可以在Nacos里创建不同的命名空间,每个命名空间对应一个集群的配置,这样就能实现不同集群的配置隔离和统一管理。

四、应用场景、优缺点及注意事项

4.1 应用场景

这种方案适合所有使用EdgeX做边缘计算的场景,尤其是以下几种情况:

  1. 多服务、多集群的EdgeX部署:比如同时部署生产、测试、开发三个EdgeX集群,每个集群有十几个服务,配置统一管理能大幅减少维护工作量;
  2. 配置频繁修改的场景:比如测试时需要经常调整日志级别、端口、超时时间等参数,用配置中心统一修改比一个个改容器配置方便太多;
  3. 配置审计和追踪的场景:比如需要记录每个配置的修改历史、修改人、修改原因,配置中心能自动记录这些信息,方便排查问题。

4.2 技术优缺点

优点

  1. 配置集中管理:所有配置都在配置中心,不用再找各个容器的配置文件,改配置只要在配置中心操作,效率大幅提升;
  2. 配置可追踪:配置中心会记录每个配置的修改历史,谁改的、什么时候改的、改了什么,一目了然,出问题可以快速回滚;
  3. 适配多集群:不同集群的配置可以用不同的命名空间隔离,配置复用性高,比如两个集群的大部分配置相同,只要复制一份配置修改少量参数就行;
  4. 环境变量覆盖灵活:临时修改配置时,不用改配置中心的配置,只要设置环境变量就能覆盖,适合测试时的临时调整。

缺点

  1. 依赖配置中心:如果配置中心挂了,EdgeX服务可能无法启动或者无法获取配置,所以需要保证配置中心的高可用,比如用Nacos集群模式部署;
  2. 学习成本:需要学习配置中心的使用,比如Nacos的管理、权限控制、命名空间的使用等,对新手来说有一定门槛;
  3. 配置项对应规则:EdgeX的配置项和环境变量、配置中心的配置路径有固定的对应规则,改配置前要确认对应关系,避免配置不生效。

4.3 注意事项

  1. 配置中心的高可用:生产环境中不要用单机模式的配置中心,要部署成集群模式,避免单点故障;
  2. 配置权限控制:配置中心要设置合理的权限,比如普通开发人员只能查看配置,只有管理员才能修改配置,避免误改;
  3. 配置项的命名规范:在配置中心里给配置命名时要统一规范,比如按服务名、集群名、环境命名,方便查找和管理;
  4. 环境变量和配置中心的优先级:EdgeX中环境变量的优先级高于配置中心的配置,所以如果同时设置了环境变量和配置中心的配置,会以环境变量的值为准,这点要注意,避免配置冲突。

五、总结

EdgeX的配置管理问题,本质上是容器化应用分散配置的共性问题,用环境变量覆盖+配置中心的方案,能有效解决配置分散、难修改、难追踪的问题。环境变量覆盖适合临时调整配置,配置中心适合长期的、全局的配置管理,两者结合起来,能覆盖EdgeX配置管理的大部分场景。只要合理部署配置中心,规范配置管理流程,就能大幅提升EdgeX部署和维护的效率,减少配置混乱带来的问题。