DockerSwarm里集群服务间通信

Routing Mesh

  • Internal
  • Ingress

Routing Mesh 是集群服务之间的通讯技术主要包括2方面Internal和Ingress

Internal

Container 和Container 之间的访问通过overlay网络,而service和service之间的通讯是通过VIP(虚拟IP)实现的。
主要意义是Internal Load Balancing 实现

DockerSwarm里集群服务间通信_第1张图片
下面是对Internal的小实验
*ps. 提前整理一个后面要用到的小命令【nslookup】它用于查询DNS的记录,查询域名解析是否正常,在网络故障时用来诊断网络问题。
但是一些linux系统下默认无此命令,可以通过安装一个包来使该命令生效,这个包中也包括dig命令。

yum -y install bind-utils

例如:
nslookup mp.csdn.net 查询网站的dns name 以及后面对应的ip地址
返回:
Service:100.100.2.136 (dns名)
Name: mp.csdn.net
Address : 101.201.178.55 (虚拟ip)
nslookup tasks.mp.csdn.net 可以看到背后容器真正的IP地址

步骤解析Internal Load Balancing:

  1. 创建overlay的network

    docker network create -d overlay demo-net
    
  2. 创建一个service, 使用whoami,可返回当前访问的主机名称

    docker service create --name whoami -p 8000:8000 --network demo-net jwilder/whoami
    
  3. 拓展whoami服务为3个

    docker service scale whoami=5
    
  4. 在不同容器里nslookup whoami 显示的是同一个ip地址,而在每个容器里 ip a 可分别看到每个eth0 和nslookup whoami 出的 Address都类似但是不一样。

  5. 在Manager节点上 nslookup tasks.whoami (可展示背后容器真正的IP地址)可以看到5个容器里eth0 地址,都出现并对应上了。
    ps. 实际上:
    eth0 连接的是一个 overlay 类型的网络,名字为 ingress,其作用是让运行在不同主机上的容器可以相互通信。

    eth1 连接的是一个 bridge 类型的网络,名字为 docker_gwbridge,其作用是让容器能够访问到外网。

所以可以看出是有一个虚拟IP在接收对外的请求,而 VIP(虚拟IP)映射到容器里的IP是通过LVS(Linux 虚拟服务器),再通过overlay网络自动的负载到每个服务所有的健康任务上。具体实现如图:
DockerSwarm里集群服务间通信_第2张图片

Ingress

如果服务有绑定接口,则此服务可以通过任意swarm节点的响应接口访问。
具体现象:假如一个集群里有3个节点,将一个服务scale到了其中2个节点,但没部署的剩余一个节点(也可以说任意节点)通过部署时设置的端口都访问到服务。

实际上是Ingress Network 的作用,当去任何一台swarm节点上访问端口服务的时候,会通过本地的IPVS通过LVS把服务给 load balance 到真正具有service的swarm节点上。如图:
DockerSwarm里集群服务间通信_第3张图片

你可能感兴趣的:(docker)