Docker学习笔记17

news2025/1/11 18:44:58

跨主机容器间网络:

实现跨主机容器间通信的工具:

1)Pipework

2)Flannel

3)Weave

4)Open V Switch (OVS)

5)Calico

1. Weave:

在每个宿主机上布置一个特殊的route的容器,不同宿主机的route容器连接起来,route拦截所有普通容器的ip请求,并通过udp包发送到其它宿主机上的普通容器。这样在跨机的多个容器端看到的就是同一个扁平网络。

weave解决网络问题,不过部署依然是单机的。在生产环境不建议使用。

2. flannel的思路:

是针对K8s设计的一个网络规划服务,简单来说,它的功能是让集群中的不同节点主机创建的Docker容器都具有全集群唯一得虚拟IP地址。但是默认的Docker配置中,每个节点上的Docker服务会分别负责所在节点容器的IP分配。这样导致的一个问题是,不同节点上容器可能获得相同的内外IP地址。并使这些容器之间能够通过IP地址相互找到,也就是相互ping通。

Flannel的设计目的就是为集群中的所有节点重新规划IP地址的使用规则,从而使得不同节点上的容器能够获得“同属一个内网”且“不重复的”IP地址,并让属于不同节点上的容器能够直接通过内网IP通信。

Flannel实质上是一种“覆盖网络overlay network”,即表示运行在一个网上的网(应用层网络),并不依靠IP地址来传递消息,而是采用一种映射机制把IP地址和identifiers(标识)做映射来资源定位。也就是将TCP数据包装在另一种网络包(UDP包)里面进行路由转发和通信,目前已支持UDP、VxLAN(隧道协议)、AWS VPC和GCE路由等数据转发方式。

原理:

每个主机配置一个IP段和子网个数。例如:可以配置一个覆盖网络使用10.10.0.0/16段。因此主机A可以接受10.10.1.0/24,主机B可以接受10.10.2.0/24的包。flannel使用etcd来维护分配的子网到实际的IP地址之间的映射。对于数据路径,flannel使用UDP来封装IP数据报,转发到远程主机。选择UDP作为转发协议是因为它能穿透防火墙。

flannel使用etcd存储配置数据和子网分配信息。flannel启动之后,后台进程首先检索配置和正在使用的子网列表,然后选择一个可用的子网,尝试去注册它。

etcd也存储这个每个主机对应的IP。flannel使用etcd的watch机制监视/coreos.com/network/subnets下面所有元素的变化信息,并且根据它来维护一个路由表。

etcd:相当于一个路由数据库。

Flannel默认的节点间数据通信方式是UDP转发。

Flannel工作原理总结:

1)是overlay network,即覆盖性网络;

2)通过etcd保存子网信息及网络分配信息;

3)给每台Docker host主机分配一个网段;

4)通过UDP传输数据包。

应用部署案例:

1)环境:

IP地址部署软件节点功能
192.168.17.10etcd、flannel、dockernode1主控端(通过etcd)
192.168.17.20flannel、dockernode2被控端

2)修改配置:

修改主机名:

hostnamectl set-hostname node1
hostnamectl set-hostname node2

修改/etc/hosts文件,添加如下内容:

192.168.17.10 node1
192.168.17.10 etcd
192.168.17.20 node2

然后是Disable SELinux和关闭防火墙。

2)安装软件:

node1:

yum install -y etcd flannel

node2:

yum install -y flannel

3)软件配置:

node1:

etcd的配置:

说明:

配置文件修改的两个地方的配置:

1)ETCD_LISTEN_CLIENT_URLS 监听客户端地址,0.0.0.0表示的是任何服务器。

2)ETCD_ADVERTISE_CLIENT_URLS: 通知客户端地址,etcd表示的是本地IP地址。

3)如果是集群的时候,ETCD_NAME,我们可能会取,但是这里只是default。

Advertise 英文:广告、通知的意思。

systemctl start etcd

systemctl enable etcd

[root@node1 ~]# ss -anput |grep 2379
tcp    ESTAB      0      0      127.0.0.1:33322              127.0.0.1:2379                users:(("etcd",pid=22429,fd=12))
tcp    LISTEN     0      128    [::]:2379               [::]:*                   users:(("etcd",pid=22429,fd=6))
tcp    ESTAB      0      0        [::ffff:127.0.0.1]:2379                 [::ffff:127.0.0.1]:33322               users:(("etcd",pid=22429,fd=15))
[root@node1 ~]# ss -anput |grep 4001
tcp    ESTAB      0      0      127.0.0.1:46916              127.0.0.1:4001                users:(("etcd",pid=22429,fd=13))
tcp    LISTEN     0      128    [::]:4001               [::]:*                   users:(("etcd",pid=22429,fd=7))
tcp    ESTAB      0      0        [::ffff:127.0.0.1]:4001                 [::ffff:127.0.0.1]:46916               users:(("etcd",pid=22429,fd=14))


或者:
ps -ef |grep etcd

lsof -i:2379
lsof -i:4001

测试etcd能否存取数据:

[root@node1 ~]# etcdctl set testdir/testkey0 0
0
[root@node1 ~]# etcdctl get testdir/testkey0
0

说明:给testdir目录下的testkey0这个键设置一个值为0,然后获取这个键值,get获取到值,就说明成功了。

集群健康检查:

[root@node1 ~]# etcdctl -C http://etcd:4001 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy
[root@node1 ~]# etcdctl -C http://etcd:2379 cluster-health
member 8e9e05c52164694d is healthy: got healthy result from http://etcd:2379
cluster is healthy

说明etcd集群可用。

flannel配置:

vim /etc/sysconfig/flanneld


# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

说明:

1)只要修改FLANNEL_ETCD_ENDPOINTS: http://etcd:2379

2)记得默认前缀/atomic.io/network

注意:

配置etcd中关于flannel的key(这个只是在安装了etcd的服务器上操作。)flannel使用etcd进行配置,来保证多个flannel实例之间的配置一致性,所以需要在etcd上进行如下配置('/atomic.io/network/config’ 这个key与上文/etc/sysconfig/flanneld中的配置项FLANNEL_ETCD_PREFIX是相对应的,错误的话,启动就会出错。)

[root@node1 ~]# etcdctl mk /atomic.io/network/config '{ "Network": "172.20.0.0/16" }'
{ "Network": "172.20.0.0/16" }

[root@node1 ~]# etcdctl get /atomic.io/network/config
{ "Network": "172.20.0.0/16" }

mk是创建的意思。

键值对,花括号,前面有空格,后面有空格,保证格式正确。

我已经把我的网络存储到etcd数据库中了。

 

上面flanneld设置的IP网段可以任意设定,随便设定一个网段都可以。容器的IP就是根据这个网段进行自动分配的,IP分配后,容器一般是可以对外联网的(网桥模式,只要宿主机能上网就可以。)

systemctl enable flanneld
systemctl start flanneld

[root@node1 ~]# ps -ef |grep flannel
root      33524      1  0 22:59 ?        00:00:00 /usr/bin/flanneld -etcd-endpoints=http://etcd:2379 -etcd-prefix=/atomic.io/network
root      33568  22392  0 22:59 pts/0    00:00:00 grep --color=auto flannel

systemctl restart docker

启动flannel后,一定要记得重启下docker,这样flannel配置分配的IP地址才能生效,即docker0虚拟网卡的IP会变成上面flannel设定的IP段。

[root@node1 ~]# ip a s

4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.77.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::cce6:6c20:e949:808b/64 scope link flags 800
       valid_lft forever preferred_lft forever
[root@node1 ~]#

这台机器分配的IP地址:172.20.77.0/16网段。

实现flannel和docker进行结合:

第一步:找子网subnet信息:

[root@node1 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.77.1/24   # 使用
FLANNEL_MTU=1472                # 使用
FLANNEL_IPMASQ=false
[root@node1 ~]#

 说明:flannel总的网络:172.20.0.0/16, flannel_subnet:172.20.77.1/24对应的子网。给这个docker主机分配的。

flannel_mtu: 1472 ,网络最大传输单元。以太网最大传输1500个字节。

flannel网卡。

第二步:配置Docker  daemon:

vim /etc/docker/daemon.json

{
    "registry-mirrors": ["https://dmshd3ad.mirror.aliyuncs.com"],
    "bip": "172.20.77.1/24",
    "mtu": 1472
}

字符串加引号。

第三步:重启docker:

systemctl restart docker

第四步:验证容器网络:

[root@node1 ~]# ip a

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:36:76:9d:4c brd ff:ff:ff:ff:ff:ff
    inet 172.20.77.1/24 brd 172.20.77.255 scope global docker0
       valid_lft forever preferred_lft forever
4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.77.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::cce6:6c20:e949:808b/64 scope link flags 800
       valid_lft forever preferred_lft forever

我们可以看到docker0的网络IP地址发生了变化,变成了172.20.77.1/24。因为我们更改了daemon.json。

第五步:启动容器来验证:

docker run -it centos:latest /bin/bash

然后可以通过docker inspect命令检查容器的IP地址,可以看到ip地址发生了变化。

node2:

配置flannel:

vim /etc/sysconfig/flanneld

# Flanneld configuration options

# etcd url location.  Point this to the server where etcd runs
FLANNEL_ETCD_ENDPOINTS="http://etcd:2379"

# etcd config key.  This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_PREFIX="/atomic.io/network"

# Any additional options that you want to pass
#FLANNEL_OPTIONS=""

重启flannel:

[root@node2 ~]# systemctl enable flanneld
Created symlink from /etc/systemd/system/multi-user.target.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
Created symlink from /etc/systemd/system/docker.service.wants/flanneld.service to /usr/lib/systemd/system/flanneld.service.
[root@node2 ~]# systemctl start flanneld

看下flannel的地址:

[root@node2 ~]# ip a

4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.15.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::fd82:3b17:2e11:647f/64 scope link flags 800
       valid_lft forever preferred_lft forever
[root@node2 ~]#

随机分配的IP地址,没有规律。

配置flannel与docker结合:

第一步:获取flannel的subnet的子网信息:

[root@node2 ~]# cat /run/flannel/subnet.env
FLANNEL_NETWORK=172.20.0.0/16
FLANNEL_SUBNET=172.20.15.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false

第二步:配置Docker daemon

[root@node2 ~]# cat /etc/docker/daemon.json
{
    "registry-mirrors": ["https://dmshd3ad.mirror.aliyuncs.com"],
    "bip": "172.20.15.1/24",
    "mtu": 1472
}

第三步:重启docker:

systemctl restart docker

第四步:验证ip地址:

[root@node2 ~]# ip a

3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:15:70:f3:1b brd ff:ff:ff:ff:ff:ff
    inet 172.20.15.1/24 brd 172.20.15.255 scope global docker0
       valid_lft forever preferred_lft forever
4: flannel0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1472 qdisc pfifo_fast state UNKNOWN group default qlen 500
    link/none
    inet 172.20.15.0/16 scope global flannel0
       valid_lft forever preferred_lft forever
    inet6 fe80::fd82:3b17:2e11:647f/64 scope link flags 800
       valid_lft forever preferred_lft forever
[root@node2 ~]#
[root@node2 ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED          STATUS          PORTS     NAMES
2770a33acb5d   centos:latest   "/bin/bash"   35 seconds ago   Up 33 seconds             hardcore_cohen
[root@node2 ~]# docker inspect 2770
[
    {
        "Id": "2770a33acb5d52a98423918edc85701bb0cb330a674b08e75d52f67171e439ab",
        "Created": "2023-07-05T16:01:49.534350157Z",
        "Path": "/bin/bash",

可以看到docker的IP地址是172.20.15.2IP地址。

第五步:验证

分别在node1和node2创建容器,观察容器的IP地址情况。

[root@node1 ~]# docker exec c0055 ping -c 4 172.20.15.2
PING 172.20.15.2 (172.20.15.2) 56(84) bytes of data.

--- 172.20.15.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3001ms

[root@node1 ~]#

注意事项:

 

如果发现各容器内分配的IP地址相互ping不通,可能由于防火墙问题引起的,执行下面操作。

iptables -nL

iptables -P FORWARD ACCEPT
iptables -P INPUT ACCEPT

iptables -F

iptables -nL

说firewalld工具关闭了,iptables没有进行规则清空,防火墙其实是关闭不掉的,是内核中的netfilter是无法关闭的。我们把两个工具惊醒关闭或者清空处理即可。

修改防火墙规则之后,可以看到立即就ping通了。

[root@node1 ~]# docker exec c0055 ping -c 4 172.20.15.2
PING 172.20.15.2 (172.20.15.2) 56(84) bytes of data.
64 bytes from 172.20.15.2: icmp_seq=1 ttl=60 time=0.841 ms
64 bytes from 172.20.15.2: icmp_seq=2 ttl=60 time=0.474 ms
64 bytes from 172.20.15.2: icmp_seq=3 ttl=60 time=0.876 ms
64 bytes from 172.20.15.2: icmp_seq=4 ttl=60 time=3.21 ms

--- 172.20.15.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 0.474/1.349/3.206/1.083 ms
[root@node1 ~]#
[root@node2 ~]# docker exec 2770 ping -c 4 172.20.77.2
PING 172.20.77.2 (172.20.77.2) 56(84) bytes of data.
64 bytes from 172.20.77.2: icmp_seq=1 ttl=60 time=0.654 ms
64 bytes from 172.20.77.2: icmp_seq=2 ttl=60 time=1.20 ms
64 bytes from 172.20.77.2: icmp_seq=3 ttl=60 time=0.808 ms
64 bytes from 172.20.77.2: icmp_seq=4 ttl=60 time=1.44 ms

--- 172.20.77.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3002ms
rtt min/avg/max/mdev = 0.654/1.025/1.443/0.314 ms
[root@node2 ~]#

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

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

相关文章

SwiftUI的优缺点

2019年WWDC大会上&#xff0c;苹果在压轴环节向大众宣布了基于Swift语言构建的全新UI框架——SwiftUI&#xff0c;开发者可通过它快速为所有的Apple平台创建美观、动态的应用程序。推荐大量使用struct代替类。 SwiftUI 就是⼀种声明式的构建界面的用户接口工具包。 SwiftUI使用…

NotePad++ 正则匹配文件路径

([a-zA-Z]:(([\\\\/])[^\\\\/:*?<>|])*([\\\\/])[^\\\\/:*?<>|]\\.[^\\\\/:*?<>|],)*[a-zA-Z]:(([\\\\/])[^\\\\/:*?<>|])*([\\\\/])[^\\\\/:*?<>|]\\.[^\\\\/:*?<>|]$CTRLH -> 标记 -> 输入上面正则匹配&#xff0c;勾选如下…

Pyqt5+PyQt-Fluent-Widgets+Pycharm环境安装

文章目录 1. Pyqt5环境安装2. Pycharm配置QtDesigner3. PyQt-Fluent-Widgets插件安装4. 在QtDesigner中使用PyQt-Fluent-Widgets 1. Pyqt5环境安装 使用miniconda创建一个新环境作为pyqt5的开发。这里使用的python3.8版本&#xff0c;网上说太高的python3.10版本无法同时安装py…

开源社 KCC@新加坡成立啦!

3年疫情结束&#xff0c;世界恢复了正常&#xff0c;新加坡作为亚洲领先的世界城市&#xff0c;吸引了越来越多来自世界的人才。大模型在人工智能领域的突破&#xff0c;让大家更加看到开源的能力。经过9年的发展&#xff0c;开源社在长期的伙伴支持下&#xff0c;开始了出海的…

RabbitMQ系列(10)--RabbitMQ发布确认模式的概念及实现

概念&#xff1a;虽然我们可以设置队列和队列中的消息持久化&#xff0c;但任然存在消息在持久化的过程中&#xff0c;即在写入磁盘的过程中&#xff0c;消息未完全写入&#xff0c;然后服务器宕机导致消息丢失的情况&#xff0c;发布确认就是为了解决这种情况的概念&#xff0…

前端技术搭建五子棋游戏(内含源码)

The sand accumulates to form a pagoda ✨ 写在前面✨ 功能介绍✨ 页面搭建✨ 样式设置✨ 逻辑部分 ✨ 写在前面 上周我们实通过前端基础实现了拼图游戏&#xff0c;今天还是继续按照我们原定的节奏来带领大家完成一个五子棋游戏&#xff0c;功能也比较简单简单&#xff0c;也…

探究工业运营中的三大工具:根因分析、过程优化和预测性维护

在工业运营领域&#xff0c;根本原因分析、过程优化工具和预测性维护正在彻底改变维护实践的方式。这些工具的战略性组合使得制造工厂能够提升实践水平、提高生产力&#xff0c;并实现持续的成功。本文将以PreMaint为基础&#xff0c;探讨这些工具之间的差异&#xff0c;以及如…

添加数据维度并使用Python绘制5D散点图

大家好&#xff0c;散点图通常用于比较2个不同特征以确定它们之间的关系&#xff0c;散点图也可以添加更多的维度来反映数据&#xff0c;例如使用颜色、气泡大小等。在本文中&#xff0c;将介绍如何绘制一个五维的散点图。 数据集&#xff1a; https://github.com/checkming0…

物联网工控屏在ROV布放回收系统中的应用

一、背景 1. 深海作业装备制造行业 随着我国经济与科学技术的发展壮大&#xff0c;作为“蓝色粮仓”的海洋能源开采建设逐渐成为一项重要的事业。深海作业装备则成为海洋能源开采的必备和关键工具&#xff0c;其性能和可靠性须得以保障。也因此&#xff0c;开发性能表现更优、…

vs背景和主题设置(一看就会,简单实用)

VS背景设置 目录&#xff1a;一、背景插件下载二、主题切换三、调整成自己喜欢的界面 目录&#xff1a; 学习编程是个漫长的过程&#xff0c;设置一个自己喜欢的背景&#xff0c;可以使自己编写代码的时候更舒服。马上行动起来&#xff0c;设置一个自己喜欢的背景吧。 分享一下…

J2EE集合框架List

目录 一.UML ①集合类图 ②线下教育平台用例图 二.List集合特点 ①学集合框架就是了解容器的数据结构&#xff08;增删改查&#xff09; ②有序的 可重复的 三.遍历方式 ① foreach ② iterator 迭代器 ③ for 四.LinkedList ①对比ArrayList是数据结构 Linkedlist…

【回溯算法part01】| 理论基础、77.组合

&#x1f388;回溯算法理论基础 回溯算法的本质是穷举&#xff0c;并不是一个高效的算法&#xff0c;但是有的题必须要用回溯法&#xff0c;如&#xff1a; 组合问题&#xff1a;N个数里面按一定规则找出k个数的集合切割问题&#xff1a;一个字符串按一定规则有几种切割方式子集…

学习 | 药品GMP认证和药厂GMP认证是怎么回事?

可能本身从事药品生产经营的朋友会知道&#xff0c;药品的GMP认证是怎么一回事&#xff0c;但是对于一些想要进入药品生产行业的企业&#xff0c;例如化工产品想进入原料药生产、药用辅料生产&#xff0c;塑料等材料制作商进入药品包装材料生产&#xff0c;只是听这说听那说&am…

【STL】vector快速上手

目录 一&#xff0c;vector的模板特性 二&#xff0c;vector基本使用 1. 构造函数 2. operator 赋值 3. vector——增删 A, 尾插 && 尾删 B&#xff0c;insert C, erase 4. 访问vector 遍历vector中元素&#xff1a; 法一&#xff1a;数组[]法 || at法…

HashMap-JDK8源码讲解及常见面试题

数据结构 红黑树 在JDK8中&#xff0c;优化了HashMap的数据结构&#xff0c;引入了红黑树。即HashMap的数据结构&#xff1a;数组链表红黑树。HashMap变成了这样。 为什么要引入红黑树 1、主要是为了提高HashMap的性能&#xff0c;即解决发生hash冲突后&#xff0c;因为链…

一些总结-C++

1.spdlog 需要安装spdlog库&#xff0c;然后连接器增加-lspdlog 不需要复制头文件到目录&#xff0c;安装到机器上之后&#xff0c;从系统目录加载头文件即可。 部分用法&#xff1a; 2.redis 需要安装hiredis库&#xff0c;链接器-lhiredis 不需要复制头文件到目录&#…

Java Web HTTP 23.7.4

HTTP 1&#xff0c;Web概述 1.1 Web和JavaWeb的概念 Web是全球广域网&#xff0c;也称为万维网(www)&#xff0c;能够通过浏览器访问的网站。 在我们日常的生活中&#xff0c;经常会使用浏览器去访问百度、京东等这些网站&#xff0c;这些网站统称为Web网站。如下就是通过浏…

Linux学习之i节点(inode)和数据块操作

touch testfile创建一个空文件testfile。 stat testfile可以看一下文件的inode信息。 ls -li testfile看一下testfile相关信息。 上图中922208是inode号码&#xff0c;也称为inode编号&#xff0c;若是使用ls -i testfile就可以直接看到inode号码。 du -h testfile可以看…

【Unity3D 问题总结】☀️ | 解决LayoutGroup配合Content Size Fitter使用时发生子成员位置错乱问题

&#x1f3ac; 博客主页&#xff1a;https://xiaoy.blog.csdn.net &#x1f3a5; 本文由 呆呆敲代码的小Y 原创&#xff0c;首发于 CSDN&#x1f649; &#x1f384; 学习专栏推荐&#xff1a;Unity系统学习专栏 &#x1f332; 游戏制作专栏推荐&#xff1a;游戏制作 &…

Android、iOS快速全球化工具

动机 在进行移动端全球化的时候&#xff0c;我们需要根据语言类型准备格式相同&#xff0c;文本不同的好多个文件&#xff0c;如果一个一个翻译显然很浪费时间&#xff0c;如果整篇复制到Google翻译通常翻译出来的文本是没办法直接用的&#xff0c;所以我通过有道云API实现了一…