基于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会对容器做健康检查发现,如果正常,则分发流量过去。对应的业务流程图如下:
根据业务情况,要解决如下几个问题:
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命令进行模拟测试,注册第一个服务如下:
etcdctl set /service_sgin/subdomain/service1 "www.service1.com" etcdctl set /service_sgin/upstream/service1/server1 192.168.1.1
其中service1是对应业务名称,"www.service1.com"是域名,192.168.1.1对应是server,先看下注册后的结果:
然后我再继续注册第二个服务,对应命令如下:
etcdctl set /service_sgin/subdomain/service2 "www.service2.com page.service2.com" etcdctl set /service_sgin/upstream/service2/server1 192.168.1.2
注册后配置文件截图如下:
要的就是这个效果,另外加了一个默认的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 -s reload" #配置文件没问题后的reload
/etc/confd/templates/nginx.conf.tmpl
user root; worker_processes auto; worker_cpu_affinity auto; pid logs/nginx.pid; #error_log logs/error.log; #error_log logs/error.log notice; #error_log logs/error.log info; #error_log_bind 192.168.1.31; worker_rlimit_nofile 512000; events { use epoll; worker_connections 20480; } http { include mime.types; default_type application/octet-stream; resolver 127.0.0.1 valid=10m; sendfile on; keepalive_timeout 65s; proxy_next_upstream error timeout; proxy_buffering on; proxy_buffer_size 8k; proxy_buffers 32 4k; ######################对应upstream的模板部分################ {{range $sub := ls "/subdomain"}} upstream {{base $sub}} { {{$subdir := printf "/upstream/%s/*" $sub}}{{range getvs $subdir}} server ``.``; `end` keepalive_timeout 65s; } `end` ############################################################# server { listen 80 backlog=65535 default; server_name localhost; location / { rewrite ^/(.*)$ http://www.sina.cn redirect; } } #####################对应server的模板部分#################### {{range gets "/subdomain/*"}} server { listen 80; server_name ``.`Value`; location / { proxy_pass http://{{base .Key}}; proxy_redirect off; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-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的权限,主要是通过用户、规则来管理的,将用户和规则对应起来就是用户的权限,默认安装后是不开启权限的,整理后相关的权限操作如下:
用户管理:
etcdctl user add root:123 #加root用户,开启权限必须先加 etcdctl auth enable #权限管理开启 etcdctl --username root:123 user list #查看用户 etcdctl --username root:123 user remove test_user #删除用户
role规则管理:
etcdctl --username root:123 role add test_role etcdctl --username root:123 role grant --path "/*" --rw test_role #加权限 etcdctl --username root:123 role revoke --path "/*" --write test_role #减权限 etcdctl --username root:123 role remove test_role etcdctl --username root:123 role list etcdctl --username root:123 role get test_role
用户规则管理:
etcdctl --username root:123 user add test_user:123 etcdctl --username root:123 user grant --roles test_role test_user #加规则 etcdctl --username root:123 user revoke --roles test_role test_user #减规则 etcdctl --username root:123 user get test_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 --name etcd152 --data-dir /data1/etcd \ --initial-advertise-peer-urls http://10.211.103.152:2380 \ --listen-peer-urls http://0.0.0.0:2380 \ --listen-client-urls http://0.0.0.0:2379 \ --advertise-client-urls http://10.211.103.152:2379 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster etcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380 \ --initial-cluster-state new &
10.211.103.153服务器:
#/bin/sh #writer:gaolixu /usr/local/etcd/etcd --name etcd153 --data-dir /data1/etcd \ --initial-advertise-peer-urls http://10.211.103.153:2380 \ --listen-peer-urls http://0.0.0.0:2380 \ --listen-client-urls http://0.0.0.0:2379 \ --advertise-client-urls http://10.211.103.153:2379 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster etcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380 \ --initial-cluster-state new &
10.211.103.154服务器:
#/bin/sh #writer:gaolixu /usr/local/etcd/etcd --name etcd154 --data-dir /data1/etcd \ --initial-advertise-peer-urls http://10.211.103.154:2380 \ --listen-peer-urls http://0.0.0.0:2380 \ --listen-client-urls http://0.0.0.0:2379 \ --advertise-client-urls http://10.211.103.154:2379 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster etcd152=http://10.211.103.152:2380,etcd153=http://10.211.103.153:2380,etcd154=http://10.211.103.154:2380 \ --initial-cluster-state new &
启动后可以看到集群成员和健康情况如下:
添加、删除etcd集群节点操作:
比如添加10.211.103.151节点
etcdctl member add etcd151 http://10.211.103.151:2380
执行命令后会有提示,然后再151上编写如下脚本etcdadd.sh:
#/bin/sh #writer:gaolixu /usr/local/etcd/etcd --name etcd151 --data-dir /data1/etcd \ --initial-advertise-peer-urls http://10.211.103.151:2380 \ --listen-peer-urls http://0.0.0.0:2380 \ --listen-client-urls http://0.0.0.0:2379 \ --advertise-client-urls http://10.211.103.151:2379 \ --initial-cluster-token etcd-cluster-1 \ --initial-cluster etcd153=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-state existing &
删除节点的话执行如下命令:
etcdctl member remove cf5e47596c46611a #通过etcdctl member list 查看到id
后附2:etcd的api 2和api 3的转换及confd的使用转换
1、etcd通过环境变量的调整来修改
export ETCDCTL_API=2 #api2版本 export ETCDCTL_API=3 #api3版本
2、confd通过监控时的参数修改
下载二进制文件直接使用: https://github.com/bacongobbler/confd/releases
-backend etcdv3 即 etcd api v3 -backend etcd 即 etcd api v2
自建个人原创站运维网咖社(www.net-add.com),新的博文会在网咖社更新,欢迎浏览。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
提高 SharePoint 页面访问速度之应用池预加载
之前我的一篇文章给大家粗略的讲了一下关于 IIS应用池回收给 SharePoint 带来的访问速度的提升, 详见 http://horse87.blog.51cto.com/2633686/1895153 前几天和几位MVP一起又讨论学习了一下关于IIS应用池的回收问题,今天来给大家再铺开来讲一讲。 简单来说,我么服务器IIS中的应用程序池,可以看做是一个网站的资源边界,当网站要与系统资源发生交互的时候,实际上会通过应用程序池,再由池子去请求系统资源,分配给网站,一个网站所能使用到的系统资源可以通过池子来进行控制。 我们大家可以这样理解,网站本身是静态存在的,但是应用池是动态的。 池子里面包括了:网站所占用的进程,内存虚拟地址,会话状态等,这些内容都是保存在池子里面。通过应用池可以对一个网站进行合理的资源管控。比如,当一个网站的CPU使用达到了某个峰值,内存使用达到了某个峰值,或者到了某个请求数,就把这个应用池进行回收。 我们其实可以稍微屡一下思路,当我们访问一个网站的时候,实际上是去访问了一个IIS的网站集,这个时候IIS会通知这个池子,“现在有人来 访问你了”,然后池子会启动一个W...
- 下一篇
Mysql 慢日志分析工具Mysqldumpslow
mysqldumpslow是mysql自带的用来分析慢查询的工具,当然不止这一种工具,还有percona-toolkit是percona公司出的一组命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql相关任务,包含以下内容: 检查master和slave数据一致性/记录有效的归档/服务器信息汇总/分析和统计日志,为了省事这块使用mysqldumpslow命令做分析。 需要开启mysql的慢查询日志,否则无法进行统计分析,开启mysql慢查询日志需要在mysql的配置文件中进行如下配置: slow_query_log=1#定义超过1秒的查询计数到变量Slow_queries slow-query-log-file=mysql-slow.log long_query_time=1 -s,是order的顺序 al 平均锁定时间 ar 平均返回记录时间 at 平均查询时间(默认) c 计数 l 锁定时间 r 返回记录 t 查询时间 -t,是top n的意思,即为返回前面多少条的数据 -g,后边可以写一个正则匹配模式,大小写不敏感的 例: 按照平均查询时间进行排序,...
相关文章
文章评论
共有0条评论来说两句吧...