跨主机容器间网络:
实现跨主机容器间通信的工具:
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.10 | etcd、flannel、docker | node1 | 主控端(通过etcd) |
192.168.17.20 | flannel、docker | node2 | 被控端 |
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是无法关闭的。我们把两个工具惊醒关闭或者清空处理即可。文章来源:https://www.toymoban.com/news/detail-524898.html
修改防火墙规则之后,可以看到立即就ping通了。文章来源地址https://www.toymoban.com/news/detail-524898.html
[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 ~]#
到了这里,关于Docker学习笔记17的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!