服务器技术

 首页 > 服务器技术 > Linux > docker服务confd安装配置学习教程

docker服务confd安装配置学习教程

分享到:
【字体:
导读:
          Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化. confd: confd通过读取配置(支持e...

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.

confd:confd通过读取配置(支持etcd,consul,环境变量),通过go的模板,生成最终的配置文件.

安装:安装和etcd一样,非常方便,已经提供了64位的可执行程序,下载下来之后直接放到PATH中(/usr/local/bin)即可(别忘了+x).

haproxy配置生成:

confd配置文件默认在/etc/confd中,可以通过参数-confdir指定,目录中包含两个子目录,分别是:conf.d templates.

confd会先读取conf.d目录中的配置文件(toml格式),然后根据文件指定的模板路径去渲染模板,基于之前配置的etcd集群,读取/services/web中的目录和key,结构为:

  1. /services/web/$DOMAIN/$HOST/ip 
  2.                           |-port 

其中DOMAIN表示注册应用的域名,HOST表示注册机器的主机名,首先创建confd配置文件,代码如下:

  1. [template]   
  2. src = "haproxy.cfg.tmpl"   
  3. dest = "/home/babydragon/haproxy/haproxy.cfg"   
  4. keys = [   
  5. "/services/web",   
  6. ]   
  7. #reload_cmd = "/etc/init.d/haproxy reload" 

现在只测试模板生成,所以不关注检查、重启等命令,配置模板名称、目标路径和获取的key即可,着重看下模板变动部分,前面就是写死的一些haproxy的标准配置,如日志等,代码如下:

  1. frontend webin 
  2. bind :80 
  3.  
  4. {{$domains := lsdir "/services/web"}} 
  5. {{range $domain := $domains}} 
  6. acl is_{{$domain}} hdr(host) -i {{$domain}} 
  7. {{end}} 
  8.  
  9. {{range $domain := $domains}} 
  10. use_backend {{$domain}}_cluster if is_{{$domain}} 
  11. {{end}} 
  12.  
  13. {{range $domain := $domains}} 
  14. backend {{$domain}}_cluster 
  15. cookie SERVERID insert indirect nocache 
  16. {{$domain_dir := printf "/services/web/%s" $domain}}{{range $host := lsdir $domain_dir}} 
  17. server {{base $host}} {{$ip_key := printf "/services/web/%s/%s/ip" $domain $host}}{{getv $ip_key}}:{{$port_key := printf "/services/web/%s/%s/port" $domain $host}}{{getv $port_key}} cookie {{base $host}} check 
  18. {{end}} 
  19. {{end}} 

这里主要有两个循环,第一个循环所有的域名,第一个循环每一个域名下的所有主机,haproxy需要通过设置acl的方式来进行按照域名做负载均衡,因此首先循环域名,为每个域名创建一个acl规则和一个规则的使用.

下面再通过一个循环,创建没个域名对应的后段,confd模板详细文档可以参考github上的文档,大致的意思是通过lsdir获取当前目录下的所有子目录,第一层子目录为域名,根据域名即可生成acl规则、规则使用、后端名称等数据.

再重新通过瓶装域名目录,对域名目录执行lsdir,读取目录下的每个主机名,创建后端的server条目,一个域名下的负载均衡后段服务器,同时获取挂在这个目录下的属性键值对(这里只有ip和port),创建完模板和配置之后,先构造一些测试数据,代码如下:

  1. etcdctl mkdir /services/web 
  2. etcdctl mkdir /services/web/a.abc.com 
  3. etcdctl mkdir /services/web/b.abc.com 
  4. etcdctl mkdir /services/web/a.abc.com/server1 
  5. etcdctl mkdir /services/web/a.abc.com/server2 
  6. etcdctl mkdir /services/web/b.abc.com/server1 
  7. etcdctl set /services/web/a.abc.com/server1/ip 10.0.0.1 
  8. etcdctl set /services/web/a.abc.com/server1/port 10000 
  9. etcdctl set /services/web/a.abc.com/server2/port 10001 
  10. etcdctl set /services/web/a.abc.com/server2/ip 10.0.0.1 
  11. etcdctl set /services/web/b.abc.com/server1/ip 10.0.0.2 
  12. etcdctl set /services/web/b.abc.com/server1/port 12345 

这里模拟三个容器,其中两个作为域名a.abc.com运行容器,一个作为b.abc.com容器,然后执行confd,检查生成的配置文件,代码如下:

confd -confdir ./confd -onetime -backend etcd -node 127.0.0.1:4001

刚才那段模板渲染后为如下代码:

  1. frontend webin 
  2.     bind :80
  3.  
  4.     acl is_a.abc.com hdr(host) -i a.abc.com 
  5.  
  6.     acl is_b.abc.com hdr(host) -i b.abc.com 
  7.  
  8.     use_backend a.abc.com_cluster if is_a.abc.com 
  9.  
  10.     use_backend b.abc.com_cluster if is_b.abc.com  
  11.  
  12. backend a.abc.com_cluster 
  13.     cookie SERVERID insert indirect nocache 
  14.  
  15.     server server1 10.0.0.1:10000 cookie server1 check 
  16.  
  17.     server server2 10.0.0.1:10001 cookie server2 check 
  18. //phpfensi.com 
  19.  
  20. backend b.abc.com_cluster 
  21.     cookie SERVERID insert indirect nocache 
  22.  
  23.     server server1 10.0.0.2:12345 cookie server1 check
  24.  
  25. No Comments
  26.  

 

      上一篇:CentOS 6.4安装配置LNMP服务器Nginx+PHP+MySQL 下一篇:linux下svn的co如何排除目录
    分享到:
    CentOS 6.4安装配置LNMP服务器Nginx+PHP+...
    这篇文章主要介绍了CentOS 6.4下配置LNMP服务器的详细步骤,需要的朋友可以参考下 准备篇 1、配置防火墙,开启80端口、3306端口 vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT #允许80端口通过防火墙 -A INPUT -m state --state NEW -m tcp -p tcp --dport 3...
    linux下svn的co如何排除目录
    本文我们来记录一下linux下svn的co命令排除目录的方法,或许你也用得着,感兴趣的朋友可以看看,某些原因想在svn co的时候排除某些目录,可以绕个圈子,分三步来完成. co外层目录:svn checkout --depth empty $URL [$LOCATION] 完成之后,会有一个只包含空目录的根目录. 设置忽略目录: cd $LOCATION  --...
    •         php迷,一个php技术的分享社区,专属您自己的技术摘抄本、收藏夹。
    • 在这里……