云原生下,所有非容器化的应用系统都要思考,是继续将就还是讲究。个人感觉云原生下,很多很多的技术标准及规约将重新被定义,重新定义会将分布式应用各个环节重新标准化,对依赖做到更透明,低侵入甚至是无侵入。 回到主题,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的模板文件,模板文件常用函数有
base
,get
,gets
,lsdir
,json
等。具体可参考templates.md
confd 是非常实用的,除此之前它还支持定时-interval(默认值是600秒)、-watch 让 confd 支持动态监听等。