Docker Swarm服务发现和负载均衡原理

Docker使用的是Linux内核iptables和IPVS的功能来实现服务发现和负载均衡。Iptables是Linux内核中可用的包过滤技术,可根据数据包的内容进行分类、修改和转发决策。IPVS是Linux内核中可用的传输级负载均衡。

本地创建一个集群环境,我本地有三节点集群环境:

客户端镜像:registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu

服务端镜像:registry.cn-hangzhou.aliyuncs.com/anoy/vote

  1. 基于DNS的负载均衡:

DNS server内嵌于Docker引擎。在创建集群的时候可以直接指定

--endpoint-mode dnsrr 来指明,这个服务里面的task或者是所有启动的容器访问都通过DNS的方式来进行负载均衡,这个是啥意思。操作下就清楚了:

创建一个网络

docker network create --driver overlay overlay1

创建client节点(启动一个),和vote节点(启动多个),实现client节点访问vote的时候,是给均衡到不同的vote上了。

docker service create --endpoint-mode dnsrr --replicas 1 --name client --network overlay1 registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu ping anoyi.com

docker service create --endpoint-mode dnsrr --name vote --network overlay1 --replicas 2 registry.cn-hangzhou.aliyuncs.com/anoy/vote

然后进行如下操作

docker service ls 查看服务

docker service ps xxxxclient的id  查看client的信息,找到他在哪个节点上,然后登陆到那个节点节点的机器上

docker ps  查看容器,找到client对应的容器

docker exec -it xxxxclientid bash  登陆到这个容器

上面操作如下图

此时在client容器上,可以直接dig vote 看下对vote的dns解析

如上,有两条。可以测试下是不是会被随机解析到上面,这里用ping

是可以看到均衡效果的,这个就是基本的DNS解析来实现负载均衡。但是这样会产生问题,某些应用程序将DNS主机名缓存到IP地址映射,这回导致应用程序在访问更改时超时,具有非零DNS ttl 值会导致DNS条目反应最新的详细信息时发生延迟。

  1. 基于VIP的负载均衡。

基于VIP的负载均衡可以解决1中DNS总是随便挑给客户端带来的不方便的影响。每个服务都有一个IP地址,并且该IP地址映射到与该服务关联的多个容器的IP地址。在这种情况下,与服务关联的服务IP不会改变,即使与该服务关联的容器死亡并重新启动。

运行过程中,DNS service会将服务名”vote”解析到VIP,使用iptables和ipvs,VIP实现2个服务端”vote”容器的负载均衡。

把上面创建的两个服务删除,然后重新部署。

docker service create --replicas 1 --name client --network overlay1 registry.cn-hangzhou.aliyuncs.com/anoy/ubuntu ping anoyi.com

docker service create --name vote --network overlay1 --replicas 2 registry.cn-hangzhou.aliyuncs.com/anoy/vote

并没有指定--endpoint-mode,也就是说Docker Swarm默认就是用的VIP

查看这两个服务的VIP

docker service inspect --format {{.Endpoint.VirtualIPs}} vote

docker service inspect --format {{.Endpoint.VirtualIPs}} client

然后跟上面姿势一样,找下client在哪个节点上,登上去,看下他是怎么dns vote的。

这次DNS就只有一个解析了,解析到的地址是vote服务的VIP,ping的话也不会存在跳转别的ip的情况。

现在别动,继续在client里面执行

curl vote | grep -i "container id"

通过返回来的容器id来区分到底是谁在为我们干活

路由网格(Routing mesh)

使用路由网格,服务暴露的端口会暴露在Swarm集群中的所有工作节点。Docker是通过创建 ingress overlay网络来实现这一点的。所有节点默认使用内在的sandbox网络命名空间成为ingress overlay网络的一部分:

直接在上面的实操例子上更新一个端口映射

docker service update --publish-add 80:80 9fk2k04fw98p

Sandbox和vote容器是ingress网络的一部分,它有助于路由网格。client容器和vote容器是overlay1网络的一部分,有助于内部负载均衡。所有容器都是默认docker_gwbridge网络的一部分。遵循iptables中的NAT规则显示,端口80上的主机流量发送到node1里的Sandbox.

这样,然后浏览器访问(不同刷新):

跟预期的一样,每个节点上不停的刷新都会看到下面的容器id会交替变化,说明负载均衡是好使的。

Docker Swarm服务发现和负载均衡原理相关推荐

  1. Docker Swarm (服务发现和负载均衡原理)

    本文将介绍基于 DNS 的负载均衡.基于 VIP 的负载均衡和路由网格(Routing Mesh). 使用的技术 Docker 使用了 Linux 内核 iptables 和 IPVS 的功能来实现服 ...

  2. Docker Swarm 内部服务发现和负载均衡原理

    1. 集群环境准备 搭建三台服务器,并安装docker环境,并保证能正常连接互联网,后面会使用其他镜像做负载均衡测试. 192.168.104.79 192.168.104.80 192.168.10 ...

  3. 服务发现与负载均衡 dubbo zk原理

    服务发现与负载均衡 拓展阅读 : dubbo 原理概念图 2016-03-03 杜亦舒 性能与架构 性能与架构 性能与架构 微信号 yogoup 功能介绍 网站性能提升与架构设计 内容整理自文章&qu ...

  4. 基于consul实现微服务的服务发现和负载均衡

    一. 背景 随着2018年年初国务院办公厅联合多个部委共同发布了<国务院办公厅关于促进"互联网+医疗健康"发展的意见(国办发[2018]26号)>,国内医疗IT领域又迎 ...

  5. 基于go的微服务搭建(七) - 服务发现和负载均衡

    第七节: 服务发现和负载均衡 原文地址 转载请注明原文及翻译地址 这篇文章将关注两个微服务架构的重要部分:服务发现和负载均衡.和他们是如何帮助我们2017年经常要求的横向扩展容量的 简介 负载均衡和出 ...

  6. Consul + fabio 实现自动服务发现、负载均衡 1

    Consul hashicorp团队开发 就是大名鼎鼎开发 vagrant 的团队. Consul 是一个提供服务发现.健康检测.K/V存储支持分布式高可用多数据中心的服务软件. 比较类似ZooKee ...

  7. 从零开始入门 | Kubernetes 中的服务发现与负载均衡

    作者 | 阿里巴巴技术专家  溪恒 一.需求来源 为什么需要服务发现 在 K8s 集群里面会通过 pod 去部署应用,与传统的应用部署不同,传统应用部署在给定的机器上面去部署,我们知道怎么去调用别的机 ...

  8. 关于服务发现和负载均衡,你想知道的都在这儿

    问题缘由 单机时代,传统软件大多是单体/巨石架构(Monolithic).大家往一个代码仓库提交CODE,这会导致应用膨胀,难以理解和修改,以及扩展受限,无法按需伸缩等诸多问题.单体架构怎么解决多人合 ...

  9. Marathon 服务发现及负载均衡 marathon-lb

    2019独角兽企业重金招聘Python工程师标准>>> Marathon 服务发现及负载均衡 marathon-lb 博客分类: 架构 mesos 1- 简介 从官网摘抄了Mesos ...

最新文章

  1. 计算机二级vfp知识点,全国计算机二级等级考试VFP知识点提纲
  2. JVM(13)之 阶段回顾
  3. BZOJ3682 : Phorni
  4. Spring Security –在一个应用程序中有两个安全领域
  5. app启动页自动跳转源码_关于移动端App启动页的策划方案
  6. php数据多层关联,php – 我们如何进行laravel多级关联
  7. Java语言背景介绍
  8. 机器人水库涵洞检测_一种水库大坝隧洞、涵洞多功能检测装置的制作方法
  9. 基金API数据接口,股票API数据接口
  10. 2019半年总结——学习与成长
  11. xamp:在shell中运行mysql
  12. vue+websocket+nodejs实现聊天室 - 消息已读未读
  13. 企业微信如何发成绩给家长-Leo老师来教你
  14. 【面试系列三】面试是面试者与面试官的双向沟通,如何抓住面试官的小尾巴以及面试过程中需要避开的一些减分项!
  15. 如何用计算机求特征值特征向量,特征值和特征向量计算器为4X4的实矩阵
  16. xshell如何使用阿里云秘钥远程连接
  17. Soundwire 的 Machine Driver
  18. js导出的xlsx无法打开_使用FileSaver、js-xlsx实现excel导出
  19. latex公式中插入空格
  20. linux开机引导文件说明(/etc/default/grub)

热门文章

  1. 怎样轻松做到SD卡照片数据恢复
  2. C# DataTable的Select()方法不支持 != 判断
  3. 开发环境配置--Ubuntu+Qt4+OpenCV(三)
  4. ubuntu mysql 安装
  5. 为iframe添加鼠标事件
  6. DOM4j读取XML文件(SAXReader)
  7. 是谁“偷吃”了硬盘中的3GB空间
  8. 敏捷个人架构图 V1.3
  9. 法向量影响光源照射物体后,物体产生的视觉感光效果
  10. 基于alipay用到的