基于etcd+confd通过nginx对docker服务混合注册发现详解

时间:2017-03-27 12:29 来源:武松娱乐整理 字体:[ ] 评论:
基于etcd+confd通过nginx对docker服务混合注册发现详解。先简单说下业务逻辑,etcd是一个分部式k/v存储系统,confd是一个对etcd的key或者目录做变化监控的软件,并配有相关语法,可以将变化的k/v处理后形成配置文件,nginx不用多说了,做docker容器的负载均衡流量调度。 在业务过程中,docker容器健康起来后,会通过接口向etcd注册相关k/v信息,confd检测到etcd的k/v变化后,立即触发程序通过模板形成新的nginx配置文件,先做离线语法测试,如果没问题就覆盖原配置,进而reload,测试不通过就不覆盖原配置,整个过程是安全可控的。在容器注册到nginx的upstream后,nginx会对容器做健康检查发现,如果正常,则分发流量过去。对应的业务流程图如下: wKioL1jR9SGwQOthAAF-cP-4rNY162.png 根据业务情况,要解决如下几个问题: 1、nginx负载均衡的混合注册,使得nginx可以混合负载多个业务; 2、不同机房如何在同一etcd集群上进行注册,如何规划; 3、confd更新频率如何周期可控制,k/v每有变化实时触发reload太敏感,况且每个容器要注册多个k/v,在整体注册完之前,是不需要reload的; 4、confd启动时如何关联多个etcd的地址,保证高可用; 5、权限问题如何处理,怎么做,如果任何人知道ip和端口就可以注册,那么服务就垮了。 一、nginx负载均衡的混合注册,使得nginx可以混合负载多个业务域名容器 先分析下nginx做负载均衡时的配置文件,分析后注册时的变化因子主要有3个,1是server_name的域名,2是upstream的名称,3是upstream里的server,这三个元素就决定了不同的注册服务。有了这个思路后,设计confd对应的nginx的模板文件,先简单说下confd,confd可以直接下载二进制包,不存在安装的问题,配置好path后直接使用命令,在使用中默认读取/etc/confd下的conf.d和templates下两个目录的配置,对应github是https://github.com/coreos/etcd,创建过程如下: mkdir-p/etc/confd/{conf.d,templates} 然后在conf.d下创建.toml配置文件,在templates下创建.tmpl模板文件。 根据nginx的3个元素去分析规划k/v规则,优化后发现注册一个服务要添加两个健值,并用etcdctl命令进行模拟测试,注册第一个服务如下: etcdctlset/service_sgin/subdomain/service1"www.service1.com" etcdctlset/service_sgin/upstream/service1/server1192.168.1.1 其中service1是对应业务名称,"www.service1.com"是域名,192.168.1.1对应是server,先看下注册后的结果: wKioL1jQ8mSzWC7rAABMApx55SI444.png 然后我再继续注册第二个服务,对应命令如下: etcdctlset/service_sgin/subdomain/service2"www.service2.compage.service2.com" etcdctlset/service_sgin/upstream/service2/server1192.168.1.2 注册后配置文件截图如下: wKioL1jQ8sax-P3qAACD4MWXxJs880.png 要的就是这个效果,另外加了一个默认的server,当过来没有符合业务的域名,直接302到某个业务地址,好了剖开看confd的两个概要配置如下: /etc/confd/conf.d/nginx.conf.toml [template] prefix="/service_sgin"#此配置对应etcd的默认目录 src="nginx.conf.tmpl"#对应templates下的模板文件 dest='/usr/local/nginx/conf/nginx.conf'#对应nginx的配置文件 owner="root" mode="0666" keys=[ "/upstream",#监控的键值目录 "/subdomain",#监控的键值目录 ] check_cmd="/usr/local/nginx/sbin/nginx-t-c{{.src}}"#检测到变化后的测试 reload_cmd="/usr/local/nginx/sbin/nginx-sreload"#配置文件没问题后的reload /etc/confd/templates/nginx.conf.tmpl userroot; worker_processesauto; worker_cpu_affinityauto; pidlogs/nginx.pid; #error_loglogs/error.log; #error_loglogs/error.lognotice; #error_loglogs/error.loginfo; #error_log_bind192.168.1.31; worker_rlimit_nofile512000; events{ useepoll; worker_connections20480; } http{ includemime.types; default_typeapplication/octet-stream; resolver127.0.0.1valid=10m; sendfileon; keepalive_timeout65s; proxy_next_upstreamerrortimeout; proxy_bufferingon; proxy_buffer_size8k; proxy_buffers324k; ######################对应upstream的模板部分################ {{range$sub:=ls"/subdomain"}} upstream{{base$sub}}{ {{$subdir:=printf"/upstream/%s/*"$sub}}{{rangegetvs$subdir}} server{{.}};{{end}} keepalive_timeout65s; } {{end}} ############################################################# server{ listen80backlog=65535default; server_namelocalhost; location/{ rewrite^/(.*)$http://www.sina.cnredirect; } } #####################对应server的模板部分#################### {{rangegets"/subdomain/*"}} server{ listen80; server_name{{.Value}}; location/{ proxy_passhttp://{{base.Key}}; proxy_redirectoff; proxy_set_headerHost$host; proxy_set_headerX-Real-IP$remote_addr; proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for; } } {{end}} } 二、不同机房如何在同一etcd集群上进行注册,如何规划 这个其实看起来复杂,实施起来非常简单,为了节省资源,不可能每个机房都对应建etcd集群,这个时候就可以复用etcd集群,比如北显和亦庄机房的注册,可以使用改变默认etcd键值目录来实现: prefix="/service_sgin_bx" prefix="/service_sgin_yz" 三、confd更新频率如何周期可控制,k/v每有变化实时触发reload太敏感,况且每个容器要注册多个k/v,在整体注册完之前,是不需要reload的 这个同样,看起来复杂,其实confd改一下模式就能实现,不要用watch模式,改而周期性去探测etcd的键值变化,比如说2秒探测一次,对应启动时的命令如下: ./confd-backend="etcd"-node=10.211.103.151:2379-interval=2 四、confd启动时如何关联多个etcd的地址,保证高可用 同样,只要修改下confd的启动命令即可,让confd监控更多node,我目前的etcd有3个node,全部监控进去如下: ./confd-backend="etcd"-node=10.211.103.151:2379-node=10.211.103.152:2379-node=10.211.103.153:2379-interval=2 五、权限问题的处理 对于权限有两种方式,一个是证书,一个是账号,业务本就跑到内网,再加之账号的配合是灵活迅速的,就从账号着手了,对于etcd的权限,主要是通过用户、规则来管理的,将用户和规则对应起来就是用户的权限,默认安装后是不开启权限的,整理后相关的权限操作如下: 用户管理: etcdctluseraddroot:123#加root用户,开启权限必须先加 etcdctlauthenable#权限管理开启 etcdctl--usernameroot:123userlist#查看用户 etcdctl--usernameroot:123userremovetest_user#删除用户 role规则管理: etcdctl--usernameroot:123roleaddtest_role etcdctl--usernameroot:123rolegrant--path"/*"--rwtest_role#加权限 etcdctl--usernameroot:123rolerevoke--path"/*"--writetest_role#减权限 etcdctl--usernameroot:123roleremovetest_role etcdctl--usernameroot:123rolelist etcdctl--usernameroot:123rolegettest_role 用户规则管理: etcdctl--usernameroot:123useraddtest_user:123 etcdctl--usernameroot:123usergrant--rolestest_roletest_user#加规则 etcdctl--usernameroot:123userrevoke--rolestest_roletest_user#减规则 etcdctl--usernameroot:123usergettest_user#查看某个用户下的规则   备注:1、guest用户的规则是guest,默认是全部权限; 2、confd是以访客guest身份监控k/v的,对应的规则就是guest;   后附:etcd的集群配置,扩容 假设初始化3台etcd分别是10.211.103.152、10.211.103.153、10.211.103.154,etcd下载下来就可以用,主要是如何配置启动,分别再三台机器上编写如下启动脚本etcdnew.sh,然后依次启动即可: 10.211.103.152服务器: #/bin/sh #writer:gaolixu /usr/local/etcd/etcd--nameetcd152--data-dir/data1/etcd\ --initial-advertise-peer-urlshttp://10.211.103.152:2380\ --listen-peer-urlshttp://0.0.0.0:2380\ --listen-client-urlshttp://0.0.0.0:2379\ --advertise-client-urlshttp://10.211.103.152:2379\ --initial-cluster-tokenetcd-cluster-1\ --initial-clusteretcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380\ --initial-cluster-statenew& 10.211.103.153服务器: #/bin/sh #writer:gaolixu /usr/local/etcd/etcd--nameetcd153--data-dir/data1/etcd\ --initial-advertise-peer-urlshttp://10.211.103.153:2380\ --listen-peer-urlshttp://0.0.0.0:2380\ --listen-client-urlshttp://0.0.0.0:2379\ --advertise-client-urlshttp://10.211.103.153:2379\ --initial-cluster-tokenetcd-cluster-1\ --initial-clusteretcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380\ --initial-cluster-statenew& 10.211.103.154服务器: #/bin/sh #writer:gaolixu /usr/local/etcd/etcd--nameetcd154--data-dir/data1/etcd\ --initial-advertise-peer-urlshttp://10.211.103.154:2380\ --listen-peer-urlshttp://0.0.0.0:2380\ --listen-client-urlshttp://0.0.0.0:2379\ --advertise-client-urlshttp://10.211.103.154:2379\ --initial-cluster-tokenetcd-cluster-1\ --initial-clusteretcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380\ --initial-cluster-statenew& 启动后可以看到集群成员和健康情况如下: wKioL1jR3JPyAj14AABQ_MYz7rs055.png 添加、删除etcd集群节点操作: 比如添加10.211.103.151节点 etcdctlmemberaddetcd151http://10.211.103.151:2380 执行命令后会有提示,然后再151上编写如下脚本etcdadd.sh: #/bin/sh #writer:gaolixu /usr/local/etcd/etcd--nameetcd151--data-dir/data1/etcd\ --initial-advertise-peer-urlshttp://10.211.103.151:2380\ --listen-peer-urlshttp://0.0.0.0:2380\ --listen-client-urlshttp://0.0.0.0:2379\ --advertise-client-urlshttp://10.211.103.151:2379\ --initial-cluster-tokenetcd-cluster-1\ --initial-clusteretcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380,etcd151=http://10.211.103.151:2380,etcd152=http://10.211.103.152:2380\ --initial-cluster-stateexisting& 删除节点的话执行如下命令: etcdctlmemberremovecf5e47596c46611a#通过etcdctlmemberlist查看到id
Top_arrow
武松娱乐注册