【Docker】Swarm内部的负载均衡与VIP

在Docker Swarm中,有两种方式可以实现内部的负载均衡:Service VIP和Routing Mesh。

  • Service VIP(Virtual IP):Service VIP是一种基于VIP的负载均衡方式,它为每个服务分配一个虚拟IP地址。当请求到达Service VIP时,Docker Swarm会将请求转发给运行该服务的节点上的一个任务。这种方式适用于每个服务只暴露一个端口的情况。
  • Routing Mesh:Routing Mesh是一种内置的负载均衡和服务发现机制。它通过在Swarm集群中的每个节点上创建一个代理来实现负载均衡。代理会自动将请求路由到运行相应服务的节点上的任务。Routing Mesh支持多端口和多服务的负载均衡,并提供了服务发现功能。

主机规划:

  • node1:172.19.177.14,角色为Leader
  • node2:172.19.188.123,角色为Worker
$ sudo docker node ls
ID                            HOSTNAME   STATUS    AVAILABILITY   MANAGER STATUS   ENGINE VERSION
r0tfqjhih73qyy43ja34501mf *   node1      Ready     Active         Leader           24.0.2
8w00ahq3ltzcmfejx7j6d755p     node2      Ready     Active                          24.0.2

在这里插入图片描述

创建overlay网络

在node1上创建一个名为mynet的overlay网络:

$ sudo docker network create -d overlay mynet
obrrvzltlp46ydu4zqq56md6a

只有自定义的网络才支持将service name解析为vip(类似于DNS服务)。

service创建

创建一个service,名为web, 通过-p把端口映射出来:

$ sudo docker service create --name web --network mynet -p 8080:80 --replicas 2 containous/whoami
128itvcw5ejqv832g9hw791a6
overall progress: 2 out of 2 tasks
1/2: running   [==================================================>]
2/2: running   [==================================================>]
verify: Service converged

我们使用的镜像containous/whoami是一个简单的web服务,能返回服务器的hostname,和基本的网络信息,比如IP地址。

查询service:

$ sudo docker service ps web
ID             NAME      IMAGE                      NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
dvihg8lgiw03   web.1     containous/whoami:latest   node2     Running         Running 23 seconds ago
fb45l99kx767   web.2     containous/whoami:latest   node1     Running         Running 23 seconds ago

创建一个client

创建一个client,用来访问service:

$ sudo docker service create --name client --network mynet centos:7 ping 8.8.8.8
ohgc2y9t9ztb086j1e5n777b8
overall progress: 1 out of 1 tasks
1/1: running   [==================================================>]
verify: Service converged

查看client服务:

~$ sudo docker service ls
ID             NAME      MODE         REPLICAS   IMAGE                      PORTS
ohgc2y9t9ztb   client    replicated   1/1        centos:7
128itvcw5ejq   web       replicated   2/2        containous/whoami:latest   *:8080->80/tcp$ sudo docker service ps client
ID             NAME       IMAGE      NODE      DESIRED STATE   CURRENT STATE            ERROR     PORTS
ebrpzyvsz7jm   client.1   centos:7   node1     Running         Running 16 seconds ago

在client中访问service

查询client的容器ID为d200af28b981

$ sudo docker container ps
CONTAINER ID   IMAGE                      COMMAND          CREATED              STATUS              PORTS     NAMES
d200af28b981   centos:7                   "ping 8.8.8.8"   About a minute ago   Up About a minute             client.1.ebrpzyvsz7jmszwd5dmnihfyw
694fd2d1f0a4   containous/whoami:latest   "/whoami"        About a minute ago   Up About a minute   80/tcp    web.2.fb45l99kx7674pvzd44ow3ubf

在client中访问service:

$ sudo docker container exec -it d200af28b981 curl web
Hostname: 0914dead5a9c
IP: 127.0.0.1
IP: 10.0.1.3
IP: 172.20.0.3
IP: 10.0.0.5
RemoteAddr: 10.0.1.5:47794
GET / HTTP/1.1
Host: web
User-Agent: curl/7.29.0
Accept: */*$ sudo docker container exec -it d200af28b981 curl web
Hostname: 694fd2d1f0a4
IP: 127.0.0.1
IP: 10.0.0.6
IP: 172.18.0.3
IP: 10.0.1.4
RemoteAddr: 10.0.1.5:36370
GET / HTTP/1.1
Host: web
User-Agent: curl/7.29.0
Accept: */*

可以发现两个web容器的IP分别为10.0.1.310.0.1.4

在client容器中去ping web这个service name:

$ sudo docker container exec -it d200af28b981 ping web -c 3
PING web (10.0.1.2) 56(84) bytes of data.
64 bytes from 10.0.1.2 (10.0.1.2): icmp_seq=1 ttl=64 time=0.032 ms
64 bytes from 10.0.1.2 (10.0.1.2): icmp_seq=2 ttl=64 time=0.047 ms
64 bytes from 10.0.1.2 (10.0.1.2): icmp_seq=3 ttl=64 time=0.062 ms--- web ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2022ms
rtt min/avg/max/mdev = 0.032/0.047/0.062/0.012 ms

通过ping获取到的IP是10.0.1.2,而不是web容器的实际IP,那么这个IP是谁的IP呢?

查看mynet的网络详情

首先10.0.1.0/24这个网段是mynet网络的,所以这个地址肯定是连在了mynet上。

所以我们来查看一下mynet的网络详情:

$ sudo docker network inspect mynet
[{"Name": "mynet","Id": "obrrvzltlp46ydu4zqq56md6a","Created": "2023-11-29T11:02:29.924112625Z","Scope": "swarm","Driver": "overlay","EnableIPv6": false,"IPAM": {"Driver": "default","Options": null,"Config": [{"Subnet": "10.0.1.0/24","Gateway": "10.0.1.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"694fd2d1f0a471630d755743a39ae28ecf4c38d20a30b45f145d55110d038882": {"Name": "web.2.fb45l99kx7674pvzd44ow3ubf","EndpointID": "60ffd2a92a9b8e6603668c1922774d572512c88ecc1899e8bb2a6890a0569998","MacAddress": "02:42:0a:00:01:04","IPv4Address": "10.0.1.4/24","IPv6Address": ""},"d200af28b98158a90a2ba110477e6cff17170b059c89f07b389f8a40a9debca6": {"Name": "client.1.ebrpzyvsz7jmszwd5dmnihfyw","EndpointID": "05cb7d2aecfb35c5aa38a0713cb3c989290f9dcdb6db819bc3e6bdd57731ae5d","MacAddress": "02:42:0a:00:01:08","IPv4Address": "10.0.1.8/24","IPv6Address": ""},"lb-mynet": {"Name": "mynet-endpoint","EndpointID": "7bf814a43e5c733914694cddeaed0ec91ff2522b430a2e75567b0f5d5e7a09bc","MacAddress": "02:42:0a:00:01:05","IPv4Address": "10.0.1.5/24","IPv6Address": ""}},"Options": {"com.docker.network.driver.overlay.vxlanid_list": "4097"},"Labels": {},"Peers": [{"Name": "de473f8d81e5","IP": "172.19.177.14"},{"Name": "138b78fdca53","IP": "172.19.188.123"}]}
]

发现有一个叫lb-mynet的容器连在了mynet上。

lb-mynet网络命名空间详情

这个lb-mynet其实并不是一个容器,而是一个网络命名空间(network namespace), 我们可以通过下面的方式进入到这个命名空间:

先查看mynet网络的ID为obrrvzltlp46

$ sudo docker network ls | grep mynet
obrrvzltlp46   mynet             overlay   swarm

再在/run/docker/netns/目录下寻找lb_开头+obrrvzltlp46前缀的文件:

$ sudo ls /run/docker/netns/
05bd5279bd2a  1-lly92pzjok  1-obrrvzltlp  c035f61daf3b  ingress_sbox  lb_obrrvzltl

找到lb-mynet对应的命名空间文件为lb_obrrvzltl

通过nsenter命令进入到lb_obrrvzltl这个命名空间里查看IP地址:

$ sudo nsenter --net="/run/docker/netns/lb_obrrvzltl" ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever
157: eth0@if158: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1450 qdisc noqueue state UP group defaultlink/ether 02:42:0a:00:01:05 brd ff:ff:ff:ff:ff:ff link-netnsid 0inet 10.0.1.5/24 brd 10.0.1.255 scope global eth0valid_lft forever preferred_lft foreverinet 10.0.1.2/32 scope global eth0valid_lft forever preferred_lft foreverinet 10.0.1.7/32 scope global eth0valid_lft forever preferred_lft forever

可以看到网卡eth0的IP中有一个IP地址为10.0.1.2,这个IP称之为虚拟IP(VIP)。

lb-mynet网络命名空间对流量的处理

当我们在client容器中根据service name访问web这个service时,Docker Swarm内置的DNS解析器会将web这个service name解析为10.0.1.2这个IP,也就是流量会进入到lb-mynet这个网络命名空间内,下面来看下lb-mynet网络命名空间会流量的处理。

和ingress网络一样,查看iptables的规则:

$ sudo nsenter --net="/run/docker/netns/lb_obrrvzltl" iptables -nvL -t mangle
Chain PREROUTING (policy ACCEPT 43 packets, 3771 bytes)pkts bytes target     prot opt in     out     source               destinationChain INPUT (policy ACCEPT 31 packets, 2253 bytes)pkts bytes target     prot opt in     out     source               destination31  2253 MARK       all  --  *      *       0.0.0.0/0            10.0.1.2             MARK set 0x1110     0 MARK       all  --  *      *       0.0.0.0/0            10.0.1.7             MARK set 0x112Chain FORWARD (policy ACCEPT 12 packets, 1518 bytes)pkts bytes target     prot opt in     out     source               destinationChain OUTPUT (policy ACCEPT 34 packets, 2517 bytes)pkts bytes target     prot opt in     out     source               destinationChain POSTROUTING (policy ACCEPT 43 packets, 3771 bytes)pkts bytes target     prot opt in     out     source               destination

可以看到目标IP为10.0.1.2的流量会被MARK为0x111,也就是十进制的273。

再来看ipvd的负载均衡规则:

$ sudo nsenter --net="/run/docker/netns/lb_obrrvzltl" ipvsadm
IP Virtual Server version 1.2.1 (size=4096)
Prot LocalAddress:Port Scheduler Flags-> RemoteAddress:Port           Forward Weight ActiveConn InActConn
FWM  273 rr-> 10.0.1.3:0                   Masq    1      0          0-> 10.0.1.4:0                   Masq    1      0          0
FWM  274 rr-> 10.0.1.8:0                   Masq    1      0          0

ipvs会将MARK为273的流量轮询(RR)转发给10.0.1.3和10.0.1.4,从而实现负载均衡。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/184675.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Word异常退出文档找回怎么操作?4个正确恢复方法!

“刚刚我在用word编辑文档&#xff0c;但是突然word就显示异常了&#xff0c;然后莫名其妙就自动退出了&#xff0c;这可怎么办&#xff1f;我还有机会找回这些文档吗&#xff1f;” 当我们在使用Microsoft Word时&#xff0c;突然遭遇到程序异常退出的情况&#xff0c;可能会让…

TCP 连接建立

1&#xff1a;TCP 三次握手过程是怎样的&#xff1f; 客户端和服务端都处于 CLOSE 状态&#xff0c;服务端主动监听某个端口&#xff0c;处于 LISTEN 状态 第一次握手&#xff1a;客户端带着序号和SYN为1&#xff0c;把第一个 SYN 报文发送给服务端&#xff0c;客户端处于 SYN-…

Elasticsearch:对时间序列数据流进行降采样(downsampling)

降采样提供了一种通过以降低的粒度存储时间序列数据来减少时间序列数据占用的方法。 指标&#xff08;metrics&#xff09;解决方案收集大量随时间增长的时间序列数据。 随着数据老化&#xff0c;它与系统当前状态的相关性越来越小。 降采样过程将固定时间间隔内的文档汇总为单…

引领质量管理新潮流!三坐标CMM质量数据管理报告工具震撼推出!

随着制造业的日益发展&#xff0c;质量管理成为企业竞争的关键要素之一。为了更好地适应市场需求、提高生产效率以及确保产品质量&#xff0c;我们自豪地推出全新的三坐标CMM&#xff08;Coordinate Measuring Machine&#xff09;质量数据管理报告工具&#xff0c;助您一臂之力…

【论文】Bao:一种用于现代多核嵌入式系统的轻型静态分区管理程序

Bao&#xff1a;一种用于现代多核嵌入式系统的轻型静态分区管理程序 个人学习过程中 Bao Hypervisor 论文翻译&#xff08;借助翻译工具个人校对&#xff09;&#xff0c;仅供学习使用&#xff0c;由于个人对一些技术专有名词不够熟悉&#xff0c;翻译不当的地方欢迎指出 论文地…

JS点击返回顶部

在许多的PC端中&#xff0c;我们滑动滚动条&#xff0c;滑倒一定程度的时候&#xff0c;我们会出现一个向上的小三角&#xff0c;点击之后我们就可以直接返回到顶部&#xff0c;这是如何实现的呢&#xff1f; 在做这个效果之前&#xff0c;我们要准备2个事件scroll与click 复制…

[Docker]十二.Docker consul集群搭建、微服务部署,Consul集群+Swarm集群部署微服务实战

一.Docker consul集群搭建 Consul 是 Go 语言写的开源的服务发现软件&#xff0c; Consul 具有 服务发现、健康检查、 服务治理、微服务熔断处理 等功能,在微服务中讲过如何搭建consul集群&#xff0c;接下来看看在 Dokcer 中如何去创建搭建consul 集群 1.linux上面部署consul集…

Qt 天气预报项目

参考引用 QT开发专题-天气预报 1. JSON 数据格式 1.1 什么是 JSON JSON (JavaScript Object Notation)&#xff0c;中文名 JS 对象表示法&#xff0c;因为它和 JS 中对象的写法很类似 通常说的 JSON&#xff0c;其实就是 JSON 字符串&#xff0c;本质上是一种特殊格式的字符串…

react 学习之react toolkit状态管理

这只是个简单的例子 首先这是store.ts import { configureStore } from reduxjs/toolkit; import { counterSlice } from ./homeSlice;// configureStore 创建store export const store configureStore({reducer: {home: counterSlice.reducer}, }); counterSlice.ts import…

win11 ssh连接ubuntu 出现 command not found: cvs

sudo apt-get install openssh-client sudo apt-get install openssh-server ps -e | grep ssh sudo /etc/init.d/ssh start 仍然报错; command not found: cvs 解决办法为&#xff1a;修改/etc/ssh/sshd_config 文件 修改&#xff1a; 58 PasswordAuthentication yes 5…

【UE】剔除环境颜色

效果 步骤 1. 新建一个空白项目&#xff0c;勾选光线追踪选项 2. 新建一个Basic关卡 3. 添加初学者内容包到内容浏览器 4. 新建一个材质“M_Red” 打开“M_Red”&#xff0c;设置基础颜色为红色 在场景中随便布置一些物品&#xff0c;然后给其中的一个球体设置材质为“M_Red”…

SSH远程连接及报错解决

hostA免密登录hostB hostA ssh-keygen -t rsa 一直回车&#xff0c;再远程拷贝至hostB scp /root/.ssh/id_rsa.pub root:192.168.IP.IP:/root/.ssh/authorized_keys 这个时候可能会报错&#xff1a; scp /root/.ssh/authorized_keys: No such file or directory在hostB上…

Oracle--索引

文章目录 一、索引是什么?二、索引的原理三、索引的特征四、创建索引的方式五、怎么确认索引六、案列七、复合索引 一、索引是什么? 索引&#xff08;INDEX&#xff09;是数据库中用于提高查询效率的一种数据结构。它可以加速数据库表的数据查找、过滤和排序等操作。索引是一…

【python笔记】与网络编程相关的知识总结

前言 菜某的笔记总结 osi七层模型 物理层 打包以下的数据&#xff0c;转化为二进制 数据链路层 双方Mac地址 网络层 双方IP地址 传输层 指定双方的端口 会话层 负责与目标建立断开连接 表示层 对数据加密解密&#xff0c;编码 应用层 规定数据的协议格式&#xff08;get&…

python 协程

1. 协程 协程&#xff0c;又称微线程&#xff0c;纤程。英文名Coroutine。 https://www.cnblogs.com/coder-qi/p/10163416.html 协程不是计算机提供的&#xff0c;是人为创造的上下文切换技术&#xff0c;也可以被称为微线程。简而言之 其实就是在一个线程中实现代码块相互切…

面向对象设计模式入门知识

设计模式 面向对象设计原则 依赖倒置原则&#xff08;DIP&#xff09; 高层模板(稳定)不应该依赖于低层模板(变化)&#xff0c; 二者都应该依赖抽象(稳定)抽象(稳定)不应该依赖于实现细节(变化)&#xff0c;实现细节应该依赖抽象(稳定) 开放封闭原则(OCP) 对扩展开放&…

Lesson 08 string类 (中)

C&#xff1a;渴望力量吗&#xff0c;少年&#xff1f; 文章目录 二、string类的介绍与使用2. 使用&#xff08;5&#xff09;string类对象的修改操作 三、拷贝1. 引入2. 浅拷贝3. 深拷贝 总结 二、string类的介绍与使用 2. 使用 &#xff08;5&#xff09;string类对象的修改…

2023年下半年计算机等级考试—信息安全三级部分真题

1.前言 刚参加完2023年下半年计算机等级考试—信息安全三级。笔者凭借记忆将考到的题进行如下汇总,并整理正确答案。仅供各位参考! 2.题型及分值 上机考试,考试时长120分钟,满分100分。 选择题 60分 50道题,每道题1.2分 填空题 20分 20道题 每道题1分 综合应用题 2…

Scrum敏捷开发流程及支撑工具

Scrum是一种敏捷开发框架&#xff0c;用于管理复杂的项目。以下这些步骤构成了Scrum敏捷开发流程的核心。通过不断迭代、灵活应对变化和持续反馈&#xff0c;Scrum框架帮助团队快速交付高质量的产品。 以下是Scrum敏捷开发流程的基本步骤&#xff1a; 产品Backlog创建&#xf…

基于协同过滤算法的美食推荐系统研究与实现

点我完整下载&#xff1a;基于协同过滤算法的美食推荐系统研究与实现 基于协同过滤算法的美食推荐系统研究与实现 "Research and Implementation of a Food Recommendation System based on Collaborative Filtering Algorithm" 目录 目录 2 摘要 3 关键词 3 第一章 …