docker flannel网络实验
程序员文章站
2024-01-15 15:39:16
...
docker flannel网络实验
环境准备
主机准备
系统 | 数量 |
---|---|
ubuntu16.04 | 3 |
- 注意,三台设备都需要装docker
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" apt-get update apt-get install -y docker-ce
架构如下
- 网络部分
网卡 网段 作用 eth0 172.16.80.0/24 局域网内的外网网卡,可以理解为公司内网的公网 eth1 10.80.0.0/24 局域网的内网网卡,可以理解为公司某个机房的内网 eth2 13.13.13.0/24 自建局域网的网卡,可以理解为我自己创建了私有网段,只用于沟通属于我的所有的设备
etcd准备
- 版本需求
flannel版本 etcd版本 v0.12.0 3.3.20(应该是3.3.x都可以) - etcd下载命令
wget https://github.com/etcd-io/etcd/releases/download/v3.3.20/etcd-v3.3.20-linux-amd64.tar.gz
- flannel
- flannel网上没有现成的,必须自己编译
- 步骤(建议参考cloudman的霉天分钟学习docker的flannel部分)
- 拉取编译所需的镜像
docker pull cloudman6/kube-cross:v1.6.2-2 docker tag cloudman6/kube-cross:v1.6.2-2 gcr.io/google_containers/kube-cross:v1.6.2-2
- 下载flannel源码
git clone https://github.com/coreos/flannel.git
- 构建flannel
cd flannel make dist/flanneld-amd64 scp dist/flanneld-amd64 dockerNode2:/user/local/bin/ scp dist/flanneld-amd64 dockerNode3:/user/local/bin/
- 拉取编译所需的镜像
flanneld vxlan网络实验
- 启动etcd
# 注意,这里我用的IP是eth1网卡,可以自行选择,但是选择不同网卡是否会造成其他影响目前还不清楚 nohup etcd --listen-client-urls http://${IP}:2379 --advertise-client-urls http://10.80.0.79:2379 &
- 测试etcd
etcdctl --endpoints="http://10.80.0.79:2379" set foo "bar" etcdctl --endpoints="http://10.80.0.79:2379" get foo
- 配置用于flannel的网段信息
- flannel的network配置示例
{ "Network": "10.2.0.0/16", "SubnetLen": 24, "Backend": { "Type": "vxlan" } }
- 添加到etcd
# IP 需与启动时的IP相同 etcdctl --endpoints="http://${IP}:2379" set /docker-test/network/config < ~/flannel-pkg/flannel-config.json
- 启动flannel(DockerNode2 DockerNode3)
nohup flanneld-amd64 -etcd-endpoints=http://${etcd server ip}:2379 -iface=eth0 -etcd-prefix=/docker-test/network &
- iface可以*选择网卡,但是目前还有未能解决的坑
- 启动docker
- 修改docker daemon
-
查看flannel启动后的子网段,路径为
/run/flannel/subnet.env
# demo FLANNEL_NETWORK=10.2.0.0/16 FLANNEL_SUBNET=10.2.46.1/24 FLANNEL_MTU=1450 FLANNEL_IPMASQ=false
-
修改docker.service文件,我的docker.service文件路径为
/lib/systemd/system/docker.service
修改条目 修改后 ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=10.2.46.1/24 --mtu=1450 docker.service中的修改条目 subnet.env中的配置 –bip FLANNEL_SUBNET –mtu FLANNEL_MTU
-
- 启动docker
systemctl daemon-reload && systemctl restart docker.service
- 测试
- 在DockerNode2上启动容器bbox1
docker run -itd -name bbox1 busybox docker exec bbox1 ip r
- 在DockerNode3上启动容器bbox2
docker run -itd -name bbox2 busybox docker exec bbox2 ip r
- bbox1 ping bbox2
docker exec bbox1 ping -c 3 ${bbox2的IP}
- 在DockerNode2上启动容器bbox1
- 修改docker daemon
flanneld host-gw网络实验
- 这个部分网络实验没用成功,不管用哪个网卡都没有用,可能跟我用的云平台有关系,后续在补充吧
- host-gw的配置如下
{ "Network": "10.2.0.0/16", "SubnetLen": 24, "Backend": { "Type": "host-gw" } }
问题总结
- flannel与etcd的版本问题
我最开始使用的etcd3.4.x版本,结果flannel访问etcd时,报错,报错内容是/docker-test/network/config的json格式有问题,后续就改成了3.3.20,就没问题了。 - flannel在vxlan下使用网卡会导致不同的结果
我测试过,在公网网卡eth0和自定义局域网网卡eth2上的vxlan通信都没有问题,但是在云主机的内网网卡eth1上时,DockerNode2和DockerNode3的容器就无法ping通,可能和我用的云平台有关系,但是目前不确定原因。
上一篇: 数据结构实验之链表三:链表的逆置