docker服务发现——confd

本文涉及的产品
.cn 域名,1个 12个月
简介: confd confd通过读取配置(支持etcd,consul,环境变量),通过go的模板,生成最终的配置文件。 安装 安装和etcd一样,非常方便,已经提供了64位的可执行程序,下载下来之后直接放到PATH中(/usr/local/bin)即可(别忘了+x)。 haproxy配置生成 c

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。结构为:


/services/web/$DOMAIN/$HOST/ip
                          |-port

其中DOMAIN表示注册应用的域名,HOST表示注册机器的主机名。

首先创建confd配置文件:


[template]  
src = "haproxy.cfg.tmpl"  
dest = "/home/babydragon/haproxy/haproxy.cfg"  
keys = [  
"/services/web",  
]  
#reload_cmd = "/etc/init.d/haproxy reload"

现在只测试模板生成,所以不关注检查、重启等命令,配置模板名称、目标路径和获取的key即可。

着重看下模板变动部分(前面就是写死的一些haproxy的标准配置,如日志等)


frontend webin
bind :80

{{$domains := lsdir "/services/web"}}
{{range $domain := $domains}}
acl is_{{$domain}} hdr(host) -i {{$domain}}
{{end}}

{{range $domain := $domains}}
use_backend {{$domain}}_cluster if is_{{$domain}}
{{end}}

{{range $domain := $domains}}
backend {{$domain}}_cluster
cookie SERVERID insert indirect nocache
{{$domain_dir := printf "/services/web/%s" $domain}}{{range $host := lsdir $domain_dir}}
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
{{end}}
{{end}}

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

confd模板详细文档可以参考github上的文档
大致的意思是通过lsdir获取当前目录下的所有子目录。第一层子目录为域名,根据域名即可生成acl规则、规则使用、后端名称等数据。
再重新通过瓶装域名目录,对域名目录执行lsdir,读取目录下的每个主机名,创建后端的server条目(一个域名下的负载均衡后段服务器),
同时获取挂在这个目录下的属性键值对(这里只有ip和port)。

创建完模板和配置之后,先构造一些测试数据:


etcdctl mkdir /services/web
etcdctl mkdir /services/web/a.abc.com
etcdctl mkdir /services/web/b.abc.com
etcdctl mkdir /services/web/a.abc.com/server1
etcdctl mkdir /services/web/a.abc.com/server2
etcdctl mkdir /services/web/b.abc.com/server1
etcdctl set /services/web/a.abc.com/server1/ip 10.0.0.1
etcdctl set /services/web/a.abc.com/server1/port 10000
etcdctl set /services/web/a.abc.com/server2/port 10001
etcdctl set /services/web/a.abc.com/server2/ip 10.0.0.1
etcdctl set /services/web/b.abc.com/server1/ip 10.0.0.2
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

刚才那段模板渲染后为:


frontend webin
    bind :80



    acl is_a.abc.com hdr(host) -i a.abc.com

    acl is_b.abc.com hdr(host) -i b.abc.com



    use_backend a.abc.com_cluster if is_a.abc.com

    use_backend b.abc.com_cluster if is_b.abc.com



backend a.abc.com_cluster
    cookie SERVERID insert indirect nocache

    server server1 10.0.0.1:10000 cookie server1 check

    server server2 10.0.0.1:10001 cookie server2 check


backend b.abc.com_cluster
    cookie SERVERID insert indirect nocache

    server server1 10.0.0.2:12345 cookie server1 check


转载自:https://coolex.info/blog/483.html


目录
相关文章
|
1月前
|
负载均衡 网络协议 算法
Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式
本文探讨了Docker容器环境中服务发现与负载均衡的技术与方法,涵盖环境变量、DNS、集中式服务发现系统等方式,以及软件负载均衡器、云服务负载均衡、容器编排工具等实现手段,强调两者结合的重要性及面临挑战的应对措施。
84 3
|
3月前
|
负载均衡 网络协议 调度
Docker Swarm服务发现与负载均衡
【10月更文挑战第8天】
150 1
|
8月前
|
负载均衡 网络协议 算法
【Docker 专栏】Docker 容器内服务发现与负载均衡
【5月更文挑战第8天】本文探讨了Docker容器中的服务发现与负载均衡。服务发现通过环境变量、DNS或集中式系统(如Consul、Zookeeper)来定位服务实例。负载均衡则采用轮询、随机等算法,可通过软件负载均衡器、云服务或容器编排工具(如Kubernetes)实现。服务发现与负载均衡结合使用,确保请求有效分发和系统稳定性。面对动态性、网络延迟及大规模部署的挑战,需采取相应措施优化。选择合适技术并持续优化,能提升Docker容器应用的性能和可靠性。
321 5
【Docker 专栏】Docker 容器内服务发现与负载均衡
|
8月前
|
Linux Nacos 数据库
Linux 通过 Docker 部署 Nacos 2.2.3 服务发现与配置中心
Linux 通过 Docker 部署 Nacos 2.2.3 服务发现与配置中心
|
应用服务中间件 nginx 数据中心
docker服务发现
docker服务发现
131 1
|
应用服务中间件 nginx 数据中心
docker服务发现
docker服务发现
154 0
|
应用服务中间件 nginx 数据中心
docker服务发现
docker服务发现
72 0
|
负载均衡 网络协议 应用服务中间件
基于Docker的负载均衡和服务发现
Docker已经成为时下热门的容器技术,各大公司,中小创业者,都选择采用Docker技术架构其下一代的系统和应用。 随着系统规模扩大,单一Docker容器不能应对压力,需要横向扩展到多个容器,我们需要考虑负载均衡的问题;单一职责的Docker容器之间需要相互通信,而容器在每一次重启之后,它的IP都可
11030 0
|
存储 NoSQL 应用服务中间件
最佳实践系列丨Docker EE 服务发现参考架构(三)
现在您已经了解了 HRM 的工作原理和与它相关的要求,本部分将介绍用于 HTTP 路由、日志记录、监控和从节点的 HRM 语法。
2328 0
|
网络协议 前端开发 数据安全/隐私保护
最佳实践系列丨Docker EE 服务发现参考架构(二)
swarm mode 网格路由非常适合传输层路由。它使用服务的已发布端口路由到服务。但是,如果希望基于主机名将流量路由到服务应该怎么办?
2203 0

热门文章

最新文章

下一篇
开通oss服务