rancher 的服务发现的实现方式基于DNS。rancher在容器启动时,会去设置 /etc/resolv.conf
中的 搜索域。
我们创建一个 名为 02-filebeat 的 stack, 其中包含一个 filebeat 的service
bash-4.2$ cat /etc/resolv.conf
# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# nameserver 10.22.117.2
# nameserver 10.22.117.3
search filebeat.02-filebeat.rancher.internal 02-filebeat.rancher.internal ranche
r.internal wmcloud.com
nameserver 169.254.169.250
从这里可以看到 rancher 的搜索顺序是
filebeat.02-filebeat.rancher.internal
02-filebeat.rancher.internal
rancher.internal
wmcloud.com
stack 内部service的服务发现
当我们 解析 filebeat 这个地址时 , rancher 找到了 filebeat.02-filebeat.rancher.internal
这个DNS名称, 指向容器内部的ip 地址。 dns的格式是 {service-name}.{stack-name}.rancher.internal
因此, 在同一stack 内部, 我们可以直接使用 service 名称找到对应的容器
bash-4.2$ ping filebeat
PING filebeat.02-filebeat.rancher.internal (10.24.81.78) 56(84) bytes of data.
64 bytes from sh-cloud-node02.wmcloud.com (10.24.81.78): icmp_seq=1 ttl=64 time=
0.040 ms
64 bytes from sh-cloud-node02.wmcloud.com (10.24.81.78): icmp_seq=2 ttl=64 time=
0.036 ms
64 bytes from sh-cloud-node02.wmcloud.com (10.24.81.78): icmp_seq=3 ttl=64 time=
0.039 ms
^C
--- filebeat.02-filebeat.rancher.internal ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 1999ms
rtt min/avg/max/mdev = 0.036/0.038/0.040/0.005 ms
stack之间的服务发现
按照 {service-name}.{stack-name}.rancher.internal
的 DNS 格式, 我们可以通过 {service-name}.{stack-name}
来定位到同一个环境中其他 stack的容器。 那么在这个filebeat容器中, 我们可以 使用 cloud-admin-web.cloud-admin-web
来定位到 cloud-admin-web
stack下面的 cloud-admin-web
service .
bash-4.2$ ping cloud-admin-web.cloud-admin-web
PING cloud-admin-web.cloud-admin-web (10.42.197.152) 56(84) bytes of data.
64 bytes from 10.42.197.152 (10.42.197.152): icmp_seq=1 ttl=62 time=0.691 ms
^C
--- cloud-admin-web.cloud-admin-web ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.691/0.691/0.691/0.000 ms
外部服务发现
最后,rancher 会查找 wmcloud.com
域中的服务, 如果rancher 内部的域名解析都找不到, 就会匹配 wmcloud.com
, 再匹配不到,就提示失败。 我们可以直接使用 vpc 来访问 vpc.wmcloud.com
这个服务
bash-4.2$ ping vpc
PING vpc.wmcloud.com (10.24.81.222) 56(84) bytes of data.
64 bytes from vpc.wmcloud.com (10.24.81.222): icmp_seq=1 ttl=64 ti
me=1.93 ms
^C
注意: 这个 wmcloud.com 继承自主机的 /etc/resolv.conf , 如果主机填写的是 openstacklocal, 那么容器中也是 openstacklocal
Rancher 的 Bug
基于以上原理, rancher 的服务发现依赖于 /etc/resolv.conf .当 stack 名称发生改变时, stack下面的所有容器的 /etc/resolv.conf 都应当更新。 但是实际上,这一步 rancher 并不会去做, 从而导致当 stack名称修改后, 服务之间无法互相发现。
这个bug 在 1.4, 1.6 版本中都存在。 因此在生产环境中, 请勿修改Stack名称, 如果需要修改,请从应用商店重新创建。
另外: 这个bug 可能无法修复, /etc/resolv.conf 在启动时,可以指定, 一旦生成好, docker 就没有提供方法去动态修改这个文件。 rancher 有将这几个文件挂载出来, 可能有办法统一解决一下这个问题。
网友评论