二、跨主机通信
Docker默认的网络环境下 , 单台主机上的 Docker 容器可以通过 docker0 网桥直接通信 , 而不同主机上
的Docker 容器之间只能通过在主机上做端口映射进行通信。
这种端口映射方式对很多集群应用来说极不方便。
如果能让 Docker 容器之间直接使用自己的 IP 地址进行通信 , 会解决很多问题。
按实现原理可分别直接路由方式、桥接方式( 如 pipework) 、 Overlay 隧道方式 ( 如 flannel 、 ovs+gre) 等。
2、Pipework ?
pipework是由Docker的工程师Jér?me Petazzoni开发的一个Docker网络配置工具,由200多行shell实现,方便易用。下面用三个场景来演示pipework的使用和工作原理。
3、Flannel
Flannel 实质上是一种覆盖网络 (overlay network), 即表示运行在一个网上的网 ( 应用层网络 ), 并不依靠 ip 地址来传递消息 ,
而是采用一种映射机制 , 把 ip 地址和 identifiers 做映射来资源定位。
也就是将 TCP 数据包装在另一种网络包里面进行路由转发和通信 ,
目前已经支持 UDP 、 VxLAN 、 AWS VPC 和 GCE 路由等数据转发方式
Flannel 实现的容器的跨主机通信通过如下过程实现 :
①、Flannel特点
两台主机都要进行以下操作!!!!!!!!!!!
1、docker安装与配置
2、etcd安装与集群搭建
3、ETCD版本问题
ETCD3.4 版本中 ,ETCDCTL_API=3 和 etcd --enable-v2=false 成为了默认配置
flannel 操作 etcd 使用的是 v2 的 API, 而 kubernetes 操作 etcd 使用的 v3 的 API
为了兼容 flannel, 将默认开启 v2 版本 , 故配置文件中还要设置 :
①、修改配置文件
vi / etc / profile
export ETCDCTL_API=2 # 指定etcdctl命令的版本为v2
source /etc/profile
②、api 2 使用方法
ETCDCTL_API=2 etcdctl set key value
ETCDCTL_API=2 etcdctl ls /
ETCDCTL_API = 2 etcdctl del / -- prefix
③、 api 3 使用方法
?
ETCDCTL_API=3 etcdctl put key value
ETCDCTL_API=3 etcdctl get /
ETCDCTL_API=3 etcdctl del / --prefix
ETCDCTL_API = 2 etcdctl \
-- endpoints "http://192.168.129.123:2379,http://192.168.129.124:2379" \
set / coreos . com / network / config \
'{"NetWork":"10.0.0.0/16","SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0","Backend": {"Type": "vxlan"}}'
2、创建flannel安装目录
mkdir - p / opt / flannel
3、解压到安装目录
tar xzf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel
cd?/opt/flannel?&&?ls
vim?/etc/systemd/system/flanneld.service
?flanneld.service:
[Unit] Description=Flanneld After=network.target After=network-online.target Wants=network-online.target ##1.flannel服务需要先于Docker启动,后于etcd启动 After=etcd.service Before=docker.service [Service] User=root ##2.ExecStart即flanneld启动程序位置 ##3.--etcd-endpoints参数为ectd集群客户端地址 ##4.--iface参数为要绑定的网卡的IP地址,或是网卡名(ifconfig查看获得)请根据实际情况修改 ExecStart=/opt/flannel/flanneld \ --etcd-endpoints=http://192.168.129.123:2379,http://192.168.129.124:2379 \ --etcd-prefix=/coreos.com/network \ --iface=ens33 \ --ip-masq Restart=on-failure Type=notify LimitNOFILE=65536 [Install] WantedBy=multi-user.target
systemctl daemon?-?reload?&&?systemctl restart flanneld
ipconfig
cat?/run/flannel/subnet.env??
?2、创建Docker运行参数
使用flannel提供的脚本将subnet.env转写成Docker启动参数
/ opt / flannel / mk - docker - opts . sh - d / run / flannel / docker_opts . env - c
vim?/?lib?/?systemd?/?system?/?docker?.?service
下面是docker.service要修改的地方?
[Service] 节点中
指定启动参数所在的文件位置 ( 这个配置是新增的 )
EnvironmentFile=/run/flannel/docker_opts.env
在原有 ExecStart 后面添加 $DOCKER_OPTS
修改前 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
修改后 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock $DOCKER_OPTS
?systemctl daemon-reload?&&?systemctl restart docker?&&?systemctl status docker
观察docker0的网卡ip地址已经处于flannel网卡网段中?
ipconfig?
docker run?-?it?--?name?=?centos centos bash
cat?/etc/hosts
docker inspect bridge
ping?-?c3?192.168?.129?.124
ping?-c3?10.0.19.2??
iptables - P INPUT ACCEPT
iptables - P FORWARD ACCEPT
iptables - F
iptables - L - n
?