视频笔记:为 Docker Swarm 设计的 DNS 服务发现 - Ahmet Alp Balkan
视频信息 #
DNS Service Discovery for Docker Swarm Clusters
by Ahmet Alp Balkan, Microsoft
(2015/12/7)
https://www.youtube.com/watch?v=WXESsPqC8to
http://v.qq.com/x/page/b03149ny29m.html
Service Discovery #
帮助一个服务找到另一个服务的地址
不过因为横向扩展,导致实际上是一群地址
而且这些地址可能有的会失效,比如对应的服务挂了
通常方法 #
Overlay Networks
服务发现 → /etc/hosts,但这不是解决办法,还需要负载均衡。(注:这个讲座是去年的,讲的是在Docker 1.10之前的实现方式,以及提出的解决方案,而现在已经内置 DNS了)
反向代理:HAProxy, Nginx。负载均衡、健康检查、Connection draining。但是所有的traffic都会经过反向代理,这是另一个单点故障,而且会增加延时。
Interlock,通过Docker Events API来监听容器的建立,从而更新 HAProxy。Registrator,也一样通过Events API,然后保存到 consul,然后利用consul-template 来更新 nginx反向代理。
kube-proxy 处理 kubenetes 的负载均衡,做的是比较正确的。
DNS #
DNS诞生就是用来解决名字/服务到IP的解析
DNS A/AAAA记录没有端口信息。SRV记录,如果给定 hostname,会返回<ip, port, weight>
问题是没有什么东西用SRV。
使用DNS的话,非常简单,没有额外的部分;
但是不能够使用动态端口分配了(SRV的问题);
可以减少中间件的加载时间(DNS TTL);
问题是有些东西(如Java)不遵守TTL;
好处是可以使用现有堆栈;
但是没有健康检查;
好处是可以shuffling ip来负载均衡。
Mesos-DNS #
为 Mesos 设计的,部署一次后,就可以忘掉他了。设计非常好。
SkyDNS #
非常像 Mesos 的设计,kubenetes 默认的 DNS
wagl #
受 Mesos-DNS 启发,但是为 Swarm 设计。而且还是运行在容器内。
建议 wagl 安装在所有的master身上。
在 docker engine 中加入 --dns master01 --dns master02 …
部署 wagl #
|
|
demo #
在三个master上运行了wagl
然后在swarm运行一个容器
运行了3个 nginx 容器作为 API
|
|
在运行一个容器来试图通讯api
|
|
可以看到IP信息,以及SRV记录中的端口信息
因此可以直接访问这个api
|
|
通过-v参数,可以看到这次链接的是 192.168.0.5,如果再次运行,可能结果会是另一个ip,因为默认的DNS TTL是0,所以会立刻过期。