美文网首页docker
Rancher 的服务发现机制及Bug

Rancher 的服务发现机制及Bug

作者: Daniels_Cai | 来源:发表于2018-01-15 17:16 被阅读167次

    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-webstack下面的 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 有将这几个文件挂载出来, 可能有办法统一解决一下这个问题。

    相关文章

      网友评论

        本文标题:Rancher 的服务发现机制及Bug

        本文链接:https://www.haomeiwen.com/subject/ofedoxtx.html