全部产品
存储与CDN 数据库 安全 应用服务 数加·人工智能 数加·大数据基础服务 互联网中间件 视频服务 开发者工具 解决方案 物联网
容器服务

服务发现

更新时间:2017-10-16 18:36:10

集群内服务发现原理

集群内部的服务发现可以通过 routing mesh 和内置的 DNS 服务两种方式实现:

  • 通过 rouging mesh:routing mesh 将服务发现和负载均衡结合到一起,参见 集群内服务间路由和负载均衡

  • 通过 DNS:通过内置的 DNS+VIP+ipvs 机制,集群会为每一个启动的 service 分配一个 vip,并在 DNS 中将 service name 解析为该 vip,发送给该 vip 的请求将被自动分发到 service 下面的诸多 active task 上(对应容器)。

对本场景来说,您可以考虑不暴露节点端口,不加入 ingress 网络,通过内置 DNS 服务实现服务发现。

swarm mode 提供了基于 DNS 的服务发现机制。注意这里的 DNS server 也是分布式的,每一个主机上都有一个 DNS server。manager 会为该 service 分配一个 VIP(Virtual IP),并在内部 DNS 上建立一条 VIP 与 service name 的映射记录。在每个容器的 network sandbox 中会配置相应的 iptables 和 ipvs,同一个网络中每增加一个服务,会相应添加对应的 iptables 和 ipvs 规则,从而使得服务在整个网络内可访问,如下图所示:

DNS服务发现原理图

应用 1 和应用 2 加入同一个网络 my-net, client service 向同处于网络 my-net 中的应用 2 中的服务发起访问,可以通过 service name 或者 VIP 来访问 service。通过服务名访问时,容器会访问 Docker engine 中内置的 DNS 服务,从而获取 VIP。最后由 Iptables 配合 IPVS 将 VIP 请求负载到 service 下面的一个具体容器上。

服务发现方式

swarm mode 集群下,容器服务为集群内的服务发现提供多种方式,推荐使用服务名和容器名。Docker engine 内置的 DNS 服务会将服务名和容器名解析成正确的 IP,最终实现服务发现。

注意:应用需要加入同一个网络,服务间才能互相发现。

通过容器名

容器服务不仅可以通过容器的 IP 进行访问,还可以通过网络中其他容器的容器名进行访问。在本示例中,您可以在 wordpress_mysql.1.m0m29h9hzkp5mabd32zk0nk8u 的容器中通过 wordpress_web.1.69c1toswifjpr76smxzp2w2jw 的容器名进行访问。

跨主机访问

如果在编排文件中不指定 container_name 的话,默认的命名规范有两种:

  • compose V1/V2:默认的容器名为 {project-name}_{service-name}_{container-index},所以在连接管理终端后,您可以通过另外一个服务的容器名进行访问。
  • compose V3:默认的容器名为{project-name}_{service-name}.{container-index}.{随机字符},可在容器服务管理控制台进行查看。

2

通过服务名

swarm mode 集群支持通过服务名的发现方式,服务名的默认格式是 {project-name}_{service-name}。内置的 DNS 服务会将服务名解析为正确的 IP(VIP),从而进行发现。

本文导读目录