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

微服务实战系列之玩转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(一)
微服务实战系列之云原生

在这里插入图片描述


http://www.kler.cn/a/282678.html

相关文章:

  • 金融领域先锋!海云安成功入选2024年人工智能先锋案例集
  • 同比缩放,64的倍数,最大值
  • Kotlin中泛型的协变
  • python程序对服务器cpu和内存资源占用的管理。
  • 缓存cache
  • 65 mysql 的 表元数据锁
  • ts转mp4怎么转?分享3个方法,快速搞定
  • 如何用Java SpringBoot+Vue打造摇滚乐鉴赏网站:从设计到实现全解析
  • 【React】为什么Hooks不能出现在判断中
  • OHIF Viewers 本地运行
  • 基于jstat 进行JVM监控
  • Qt (12)【Qt窗口 —— 消息对话框 QMessageBox 】
  • 算法练习题03:分解质因数
  • WHAT - 通过 react-use 源码学习 React(Side-effects 篇)
  • 在Ubuntu上使用Visual Studio Code调试C++代码
  • 掌握Nginx负载均衡中的请求缓存处理:策略与实现
  • Geoserver的 rest、wfs、wms、wps接口请求指南
  • Apache Kafka 简介、使用场景及特点
  • CEASC:基于全局上下文增强的自适应稀疏卷积网络在无人机图像上的快速目标检测
  • Numpy 数组及矩阵创建详解
  • 在 PyTorch 中,`permute` 方法是一个强大的工具,用于重排张量的维度。
  • 一文认识大数据的CAP原则和BASE原则
  • sheng的学习笔记-AI-半监督SVM
  • Axure RP下载+详细安装步骤资源百度云盘分享
  • 求助(必关)
  • MS1861 宏晶微 视频显示与控制器芯片 提供开发资料