云原生下的应用系统配置变更管理:confd

云原生下,所有非容器化的应用系统都要思考,是继续将就还是讲究。个人感觉云原生下,很多很多的技术标准及规约将重新被定义,重新定义会将分布式应用各个环节重新标准化,对依赖做到更透明,低侵入甚至是无侵入。 回到主题,confd是阿里的Nacos 作者推荐的工具,对于大型的复杂的应用系统,特别实用,它提供配置变更的自动下发,及时生效。

它解决的痛点

  • 配置管理变得繁琐
  • 配置项越来越多
  • 修改后需要重新上线

比如,我们玩docker+spring cloud的技术栈时,应用提供方的ip列表是在Eureka中,而运维又不得不将ip列表再配置到nginx的upstream中,如果要对Eureka中某台应用做下线处理,多复杂啊(肯定还要修改配置)

它的实现原理

一般而言大多主流应用系统获取配置方式是监听config-server地址,由config-server将配置推送到应用系统中,比如zooKeeper。这个过程中会出现一些问题:

  • 配置推送这事不可控,配置项推多了应用系统内存占用高、推勤了应用系统cpu更高,每次技术峰会上都在吐槽zooKeeper的坑
  • 应用系统要配合改造,如果是非java语言你就入坑

既然被动不可控,主动拉取是不是更加靠谱呢?confd提供了一种新的集成思路,它认为通过第三方(自己)来读取变更的配置,把配置就应该落盘到文件级,通过对比来确认变更(基于template生成新的stage_file,对比dest_file,有变更则更新dest_file并执行cmd命令),目的通过文件与应用系统间交换,同时可以通过管理文件的内容,来处理版本间升级与回退。

基本用法演示

wget https://github.com/kelseyhightower/confd/releases/download/v0.16.0/confd-0.16.0-linux-amd64
mv confd-0.16.0-linux-amd64 /usr/local/bin/confd
chmod +x /usr/local/bin/confd
# 是否安装成功
confd --help

#1.confd 配置文件默认在 /etc/confd 中,可以通过参数 -confdir 指定。目录中包含两个子目录:conf.d和templates
mkdir -p /etc/confd/{conf.d,templates}

#2.配置文件(conf.d)
vim /etc/confd/conf.d/nginx.toml
#内容如下
[template]
src = " nginx.conf.tmpl"
dest = "/usr/local/nginx/conf/nginx.conf"
keys = [
"/nginx/conf",
]
check_cmd = "/usr/local/nginx/sbin/nginx -t -c {{.src}}"
reload_cmd = "/usr/local/nginx/sbin/nginx -s reload"

#3.创建模版文件(templates)
#拷贝nginx 原始的配置
cp /usr/local/nginx/conf/nginx.conf /etc/confd/templates/nginx.conf.tmpl
vim /etc/confd/templates/nginx.conf.tmpl
#增加对应内容
{{$data := json (getv "/nginx/conf")}}
{{range $data.blackList}}
  deny {{.}};
{{end}}

#4.在etcdv3中创建数据
etcdctl --endpoints=$endpoints put /nginx/conf '{"blackList":"10.0.1.104","10.0.1.103"]}'

#5.启动confd的服务
#如果以daemon模式运行
confd -watch -backend etcdv3 -node http://172.16.5.4:12379 &
#以onetime模式运行为例
confd -onetime -backend etcdv3 -node http://172.16.5.4:12379

conf.d

confd的配置文件是TOML格式的文件,主要包含配置的生成逻辑,例如模板源,后端存储对应的keys,命令执行等。

必要参数

  • dest (string) - The target file.
  • keys (array of strings) - An array of keys.
  • src (string) - The relative path of a configuration template.

可选参数:

  • gid (int) - The gid that should own the file. Defaults to the effective gid.
  • mode (string) - The permission mode of the file.
  • uid (int) - The uid that should own the file. Defaults to the effective uid.
  • reload_cmd (string) - The command to reload config.
  • check_cmd (string) - The command to check config. Use {{.src}} to reference the rendered source template.
  • prefix (string) - The string to prefix to keys.

templates

即基于不同组件的配置,修改为符合 Golang text templates的模板文件,模板文件常用函数有basegetgetslsdirjson等。具体可参考templates.md

confd 是非常实用的,除此之前它还支持定时-interval(默认值是600秒)、-watch 让 confd 支持动态监听等。

你可能感兴趣的:(#,docker,k8s)