当前位置: 首页 > news >正文

微服务实战系列之玩转Docker(十三)

前言

LB是Load Balance的简称,即负载均衡。我们几乎在各种业务场景中,均会涉及到该方面的要求。那么在Swarm集群中,同样也具备相应的能力,无论集群内外,均有一套体系在支持它正常的运转。

Q:Swarm cluster如何实现LB

1. 资源准备

为简单演示,博主只准备一个manager节点,2个worker节点:

序号节点名称节点类型
1docker-manager1(192.168.8.106)manager
2docker-worker1(192.168.8.102)worker
3docker-worker2(192.168.8.107)worker

2. 部署集群

部署集群前,先通过docker info,查看当前资源是否已加入集群:
在这里插入图片描述
如图所示,即可使用该资源。

2.1 docker swarm init

创建manager节点:

docker swarm init --advertise-addr 192.168.8.106

在这里插入图片描述

2.2 docker swarm join

将worker1和worker节点加入群中:

docker swarm join --token SWMTKN-1-067ibmikpm0rfoul8o9503axos0lu8j6jrqbniri0d0450uw31-57llng2629thpec0ssnxaioq5 192.168.8.106:2377

在这里插入图片描述
在这里插入图片描述
以上均执行完成后,可在manager节点,查看当前集群:
在这里插入图片描述

2.3 docker serivce create

首先通过docker service ls,查看当前集群是空的,没有run任何服务:
在这里插入图片描述
接下来,博主依然以nginx为例,发布并查看:
在这里插入图片描述
至此,第一个service成功发布了。此刻你可以通过一个LB设备,部署该Service,达到外部访问service的目的。那么内部负载又如何体现的呢?先来看看它的网络细节吧。

3. 查看网络

3.1 VIP

VIP是虚拟IP,是集群内部为统一路由service请求而提供的公共的虚拟IP。当service发布完成后,我们可以通过docker service inspect [SERVICE_NAME]查看VirtualIPs

docker service inspect my_nginx

在这里插入图片描述

这里我们可以看到有1个VirtualIPs,具体指代什么,请紧随博主,以防迷路。

3.2 service运行的网络

首先通过docker network ls,查看当前manager有哪些network:
在这里插入图片描述
接着,通过docker network inspect查看每个网络后,我们发现当前Swarm集群,其实是运转在ingress网络上,具体信息如下:

[root@docker-manager1 ~]# docker network inspect ingress
[{"Name": "ingress","Id": "l6kyva24ra9uako41qar66lnk","Created": "2024-08-21T09:15:00.738521076+08:00","Scope": "swarm","Driver": "overlay","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "10.0.0.0/24","Gateway": "10.0.0.1"}]},"Internal": false,"Attachable": false,"Ingress": true,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"360b075fbe4a0f956f0ff99ed717427d7a8d320c31e638b51d3a371115d2cde4": {"Name": "my_nginx.1.jmxvtc22vm4lrt5bjnyuyl0qz","EndpointID": "b3fa857b6c4479ef74fa36c0b38f26baedfad695ef0597e435c802c9459a8d3d","MacAddress": "02:42:0a:00:00:0a","IPv4Address": "10.0.0.10/24","IPv6Address": ""},"ingress-sbox": {"Name": "ingress-endpoint","EndpointID": "e4420b911ffa57252096b18b5692aba55bc4495085e2d19b9feff0bd31597b4e","MacAddress": "02:42:0a:00:00:02","IPv4Address": "10.0.0.2/24","IPv6Address": ""}},"Options": {"com.docker.network.driver.overlay.vxlanid_list": "4096"},"Labels": {},"Peers": [{"Name": "9cf849d5dce7","IP": "192.168.8.106"},{"Name": "7423c5d2941b","IP": "192.168.8.102"},{"Name": "161d9bb60c3f","IP": "192.168.8.107"}]}
]

3.3 网络底层原理

进一步探索,通过iptables -nvL -t nat,我们得知服务的请求流量统一转向172.18.0.2上了。
在这里插入图片描述
而这个IP就和docker_gwbridge有关了,不信你瞧:

[root@docker-manager1 ~]# docker network inspect docker_gwbridge
[{"Name": "docker_gwbridge","Id": "5e88db78989e93b0b3ff577e8a42656dfc895d6e32f4a3fb042b76ee1192da91","Created": "2024-08-15T10:25:32.673879398+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "172.18.0.0/16","Gateway": "172.18.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"360b075fbe4a0f956f0ff99ed717427d7a8d320c31e638b51d3a371115d2cde4": {"Name": "gateway_7e8f8ae17322","EndpointID": "7012cbdeba6c094f811b9dc0391898c144d092164aa47c7c8c085c47606abc92","MacAddress": "02:42:ac:12:00:03","IPv4Address": "172.18.0.3/16","IPv6Address": ""},"ingress-sbox": {"Name": "gateway_ingress-sbox","EndpointID": "d57e8cd714f31c1d2734ad200933236907dbfef721a0eeeef309c676319643c9","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": ""}},"Options": {"com.docker.network.bridge.enable_icc": "false","com.docker.network.bridge.enable_ip_masquerade": "true","com.docker.network.bridge.name": "docker_gwbridge"},"Labels": {}}
]

docker_gwbridge网络中有一块网络资源名为:ingress-sbox(IP正是172.18.0.2):
在这里插入图片描述

也就是所有的service请求最终都通过ingress-box完成路由。我们可以通过下图,对Swarm集群的整个网络进行分解掌握:(请沿着红箭头的方向观察

Process:Start——>client service request——>gwbridge(default)——>ingress(default)——>向其他集群内节点分发>——>End

在这里插入图片描述

结语

Swarm集群的高可用,内部有ingress网络支持,外部可通过HA proxy支持,从而实现集群式服务,保障任一节点down就有新的节点补位。


系列回顾


微服务实战系列之玩转Docker(十二)
微服务实战系列之玩转Docker(十一)
微服务实战系列之玩转Docker(十)
微服务实战系列之玩转Docker(九)
微服务实战系列之玩转Docker(八)
微服务实战系列之玩转Docker(七)
微服务实战系列之玩转Docker(六)
微服务实战系列之玩转Docker(五)
微服务实战系列之玩转Docker(四)
微服务实战系列之玩转Docker(三)
微服务实战系列之玩转Docker(二)
微服务实战系列之玩转Docker(一)
微服务实战系列之云原生

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 三种评估金融风险的方法的具体Python实现:Stress Testing、Scenario Analysis和Sensitivity Analysis
  • C#入门(7)显式转换
  • ORM框架:Mybatis与Hibernate
  • HTTP/1和HTTP/2
  • Jenkins发邮件功能如何配置以实现自动化?
  • IDEA工具设置默认使用maven的settings.xml文件
  • 浅谈线性表——栈
  • windows配置jmeter定时任务
  • 软件上显示“mfc140.dll丢失”错误信息?那么mfc140.dll丢失该如何修复
  • CannotLoadBeanClassException产生原因及解决方案
  • AWS 使用 Amazon EC2 控制台安装和配置 CloudWatch 代理以添加其他指标如内存
  • JAVA毕业设计164—基于Java+Springboot+vue3的汽车租赁管理系统(源代码+数据库)
  • el-input中show-password密码提示功能去掉
  • 续航更进阶 长安马自达MAZDA EZ-6成功挑战1301公里续航
  • zipkin启动发生报错 : Failed to start bean ‘armeriaServerGracefulShutdownLifecycle‘;
  • 【译】React性能工程(下) -- 深入研究React性能调试
  • golang 发送GET和POST示例
  • iOS 系统授权开发
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Redis 中的布隆过滤器
  • Vim 折腾记
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • 短视频宝贝=慢?阿里巴巴工程师这样秒开短视频
  • 分享一个自己写的基于canvas的原生js图片爆炸插件
  • 记一次和乔布斯合作最难忘的经历
  • 巧用 TypeScript (一)
  • 区块链将重新定义世界
  • 网络应用优化——时延与带宽
  • 小程序开发中的那些坑
  • 应用生命周期终极 DevOps 工具包
  • 3月27日云栖精选夜读 | 从 “城市大脑”实践,瞭望未来城市源起 ...
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​MPV,汽车产品里一个特殊品类的进化过程
  • #Datawhale AI夏令营第4期#多模态大模型复盘
  • #如何使用 Qt 5.6 在 Android 上启用 NFC
  • (6)设计一个TimeMap
  • (pycharm)安装python库函数Matplotlib步骤
  • (八十八)VFL语言初步 - 实现布局
  • (办公)springboot配置aop处理请求.
  • (转)JAVA中的堆栈
  • ..thread“main“ com.fasterxml.jackson.databind.JsonMappingException: Jackson version is too old 2.3.1
  • .NET CLR Hosting 简介
  • .NET Compact Framework 3.5 支持 WCF 的子集
  • .NET 中小心嵌套等待的 Task,它可能会耗尽你线程池的现有资源,出现类似死锁的情况
  • .NET/C# 在代码中测量代码执行耗时的建议(比较系统性能计数器和系统时间)
  • .NetCore部署微服务(二)
  • .net安装_还在用第三方安装.NET?Win10自带.NET3.5安装
  • .NET开发者必备的11款免费工具
  • @Autowired 与@Resource的区别
  • @FeignClient 调用另一个服务的test环境,实际上却调用了另一个环境testone的接口,这其中牵扯到k8s容器外容器内的问题,注册到eureka上的是容器外的旧版本...
  • @reference注解_Dubbo配置参考手册之dubbo:reference
  • @拔赤:Web前端开发十日谈
  • [bzoj4240] 有趣的家庭菜园
  • [C/C++] -- 二叉树
  • [C++]运行时,如何确保一个对象是只读的