Docker 跨主机间通信
通信的方式
- 路由
- 虚拟包头
flannel 网络
概念
Flannel 是 Docker 提供的一种网络解决方案,它旨在为容器提供简单的 IP 地址管理和跨主机通信。Flannel 使用了一些现有的技术,比如 Linux 内核的 TUN/TAP 接口和 ETCD 分布式键值存储,来实现容器之间的通信。
原理
- Flannel 的工作原理是将一个大的 IP 地址段分成许多小的子网,并为每个子网分配一个唯一的子网前缀。flannel 为每个 host 分配一个 subnet
- 例如:每个主机是
/24
的子网- 因此主机 a 分配10.100.5.0/24
- 主机 B 分配10.100.18.0/24
- 容器从此 subnet 中分配 IP,这些 IP 可以在 host 间路由,并让属于不在一个 host 上的容器能够直接通过内网 IP 通信。
- 每个 subnet 都是从一个更大的 IP 池中划分的,flannel 会在每个主机上运行一个叫 flanneld 的代理程序,其职责就是负责从预配置地址空间中为每台主机分配一个网段。
- 为了在各个主机间共享信息,flannel 直接使用 Kubernetes API 或 ETCD(与 consul 类似的 key-value 分布式数据库)存储网络配置、已分配的 subnet、host 的 IP 等信息。
-
Flannel 将一个大的 IP 地址段分成许多小的子网,每个子网的大小由参数
--subnet
控制。 -
每个主机上的 Flannel 代理都会为容器分配一个唯一的 IP 地址,该地址由子网前缀和主机上的唯一标识符组成。其中,子网前缀是在第一步中分配给该主机的子网前缀,唯一标识符可以是主机的 MAC 地址或其他标识符。
-
当容器需要与其他容器通信时,它们会将数据包发送到目标 IP 地址,Flannel 代理会根据目标 IP 地址的子网前缀判断目标容器是否在同一子网中。如果目标容器在同一子网中,那么数据包将直接发送到目标容器,否则它将被发送到目标容器所在主机上的 Flannel 代理。
-
当数据包到达目标主机上的 Flannel 代理时,它会根据目标容器的 IP 地址将数据包转发到目标容器。
Flannel 还支持多种后端网络,包括 UDP、VXLAN、Host-GW 等。这些后端网络可以根据不同的场景和需求进行选择,以提高网络性能和可靠性。
ETCD
概念
- 官方仓库:Releases · etcd-io/etcd (github.com)
- etcd是一个开源的分布式键值存储系统,由CoreOS团队开发和维护。它是一个高可用、一致性的系统,用于共享配置和服务发现。etcd使用Raft算法来保证数据的一致性和可靠性。
解决的问题
使用etcd可以解决分布式系统中的很多问题,例如:
-
配置共享:etcd可以作为分布式系统中的配置中心,用于保存和共享应用程序的配置数据。
-
服务发现:etcd可以用于服务发现,可以在集群中注册和发现服务,以便于不同的服务之间进行通信。
-
分布式锁:etcd可以用于分布式锁的实现,保证在分布式环境下的数据一致性问题。
优点
etcd的优点包括:
-
高可用:etcd使用Raft算法保证数据的一致性和可靠性,可以实现高可用的分布式系统。
-
性能高:etcd的访问速度非常快,可以满足高并发、低延迟的需求。
-
易于使用:etcd提供了简单易用的API,可以方便地进行数据的读写和管理。
-
可靠性强:etcd使用多副本机制,即使在一些节点失效的情况下仍可以正常运行。
缺点
etcd也存在一些缺点:
-
存储容量受限:etcd的存储容量有限,如果存储的数据量超过了容量限制,可能会影响系统的性能。
-
部署复杂:etcd的部署需要考虑很多因素,如节点数量、网络拓扑结构等,需要一定的技术水平。
场景
- 例如,在 Kubernetes 中,etcd 作为后端存储用于存储整个集群的配置信息和状态信息,包括 Pod、Service、Volume 等资源的信息。
- Kubernetes 的各个组件通过 etcd API 访问 etcd 集群,以获取和更新集群中的配置数据。此时,2379 端口号就扮演了客户端访问 etcd 集群的重要角色。
- 另外,在 Docker Swarm 中,etcd 也可以作为后端存储用于存储集群的配置信息和状态信息,以确保各个 Docker 节点之间的数据一致性。在这种情况下,2379 端口号同样用于客户端访问 etcd 集群,以读写集群中的配置数据。
部署 flannel 网络的 vxlan 模式
实验环境
主机名 | IP | 部署服务 |
---|---|---|
Y 21 | 192.168.45.21 | flannel,docker |
Y 22 | 192.168.45.22 | flannel,docker |
Y 23 | 192.168.45.23 | etcd |
部署 ETCD
获取安装包
wget https://storage.googleapis.com/etcd/v3.4.13/etcd-v3.4.13-linux-amd64.tar.gz
tar -zxvf etcd-v3.4.13-linux-amd64.tar.gz -C /usr/local/
ls /usr/local/etcd-v3.4.13-linux-amd64/
初始化
- 软链接
ln -s /usr/local/etcd-v3.4.13-linux-amd64/etcd* /usr/local/bin/
- 启动 etcd
/usr/local/etcd-v3.4.13-linux-amd64/etcd
- 配置 etcd
mkdir /etc/etcd
vim /etc/etcd/etcd.conf
#[member]
ETCD_NAME="etcd"
ETCD_DATA_DIR="/data/etcd/default.etcd"
ETCD_LISTEN_CLIENT_URLS="http://192.168.45.23:2379,http://127.0.0.1:2379"
ETCD_ADVERTISE_CLIENT_URLS=http://192.168.45.23:2379,http://127.0.0.1:2379
ETCD_ENABLE_V2=true
配置文件解析
ETCD_NAME
节点名称ETCD_DATA_DIR
数据目录ETCD_LISTEN_CLIENT_URLS
客户端访问监听地址ETCD_ADVERTISE_CLIENT_URLS
客户端通告地址ETCD_ENABLE_V2
ETCD 3.4 版本ETCDCTL_API=3
和--enable-v2=false
成为了默认配置,- 如要使用 v 2 版本, 需要
ETCD_ENABLE_V 2=true
,否则会报错“404 page not found”
- 如要使用 v 2 版本, 需要
配置 etcd.service
vim /usr/lib/systemd/system/etcd.service
[Unit]
Description=Etcd Service
Documentation=https://coreos.com/etcd/docs/latest/
After=network.target
[Service]
Type=notify
ExecStart=/usr/local/bin/etcd
EnvironmentFile=-/etc/etcd/etcd.conf
Restart=on-failure
RestartSec=