在多个Node组成的Kubernetes集群内,跨主机的容器间网络互通是Kubernetes集群能够正常工作的前提条件。Kubernetes本身并不会对跨主机容器网络进行设置,这需要额外的工具来实现,开源工具flannel,Open vSwitch,Weave,Calico等都能实现跨主机的容器之间网络互通,
1. flannel(覆盖网络)
flannel采用覆盖网络(Overlay Network)模型来完成对网络的打通
1.1 安装etcd
由于flannel使用etcd作为数据库,需要安装etcd
https://blog.csdn.net/wanchaopeng/article/details/102912191
设置etcd为外网访问http://192.168.1.53:6379
1.2 安装flannel
需要在每台node上安装flannel,falnnel下载地址为
https://github.com/coreos/flannel/releases
下载压缩包flannel-<version>-linux-amd64.tar.gz解压,把二进制文件flanneld和mk-docker-opts.sh复制到/usr/bin(或其他PATH环境变量中的目录),即可完成对flannel的安装。
[root@node_01 /home/tools]# mv flanneld mk-docker-opts.sh /usr/bin/
1.3 配置flannel
对flanneld服务进行配置
vim /usr/lib/systemd/system/flanneld.service
[Unit]
Description=flannel
[Service]
ExecStart=/usr/bin/flanneld \
-etcd-endpoints=http://192.168.1.53:2379
[Install]
WantedBy=multi-user.target
编辑配置文件/etc/sysconfig/flannel,设置etcd的URL地址
# flanneld configuration options
# etcd url location. Point this to the server where etcd runs
FLANNEL_ETCD="http://192.168.1.53:2379"
# etcd config key. This is the configuration key that flannel queries
# For address range assignment
FLANNEL_ETCD_KEY="/coreos.com/network"
在启动flanneld服务之前,需要在etcd中添加一条网络配置记录,这个配置将用于flanneld 分配给每个Docker的虚拟IP地址段
etcdctl set /coreos.com/network/config '{ "Network": "10.1.0.0/16" }'
1.4 由于flannel将覆盖docker0 网桥,所以如果Docker服务已启动,则停止Docker服务
1.5 启动flanneld 服务
systemctl restart flanneld
1.6 设置docker0网桥的Ip地址
mk-docker-opts.sh -i
source /run/flannel/subnet.env
ifconfig docker0 $FLANNEL_SUBNET
cat subnet.env
FLANNEL_NETWORK=10.1.0.0/16
FLANNEL_SUBNET=10.1.81.1/24
FLANNEL_MTU=1472
FLANNEL_IPMASQ=false
完成后确认网络接口docker 0的IP地址属于flannel0的子网;
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 10.1.81.1 netmask 255.255.255.0 broadcast 10.1.81.255
flannel0: flags=4305<UP,POINTOPOINT,RUNNING,NOARP,MULTICAST> mtu 1472
inet 10.1.81.0 netmask 255.255.255.255 destination 10.1.81.0
1.7 重新启动docker
systemctl restart docker
完成flannel覆盖网络的设置
使用ping命令验证各Node上docker0之间的相互访问。例如在Node(docker0 IP=10.1.10.1)机器上ping Nod2的docker0(docker0's IP=10.1.30.1),通过flannel能够成功链接到其他物理机的Docker网络
我们也可以在etcd中查看flannel设置的flannel0地址与物理机IP地址的对应规则
etcdctl ls /coreos.com/network/subnets
/coreos.com/network/subnets/10.1.71.0-24
/coreos.com/network/subnets/10.1.8.0-24
/coreos.com/network/subnets/10.1.81.0-24
[root@kubernetes /etc/etcd]# etcdctl get /coreos.com/network/subnets/10.1.71.0-24
{"PublicIP":"192.168.1.53"}
[root@kubernetes /etc/etcd]# etcdctl get /coreos.com/network/subnets/10.1.8.0-24
{"PublicIP":"192.168.1.51"}
[root@kubernetes /etc/etcd]# etcdctl get /coreos.com/network/subnets/10.1.81.0-24
{"PublicIP":"192.168.1.52"}