容器中跨主机的网络方案-flannel
容器中的网络是建立docker集群的重要内容。
本文将介绍如何用flannel实现容器的多节点互通。
下图是flannel的实现原理,摘自:
http://docker-k8s-lab.readthedocs.io/en/latest/docker/docker-flannel.html
本文有两台VM,一台是主节点,将安装docker、etcd、flannel,第二台是docker的工作节点,将安装docker、flannel。具体步骤如下:
一 安装
1 node1
node1 将安装docker、etcd和flannel
yum install docker etcd flannel -y
2 node2
node2 安装docker、flannel
yum install docker flannel -y
二 配置启动etcd
1 配置
配置etcd:
vim /etc/etcd/etcd.conf ETCD_LISTEN_CLIENT_URLS="http://0.0.0.0:2379" #这个参数是指明对外提供服务的地址和端口。0.0..0表示所有接口都可以提供服务
ETCD_ADVERTISE_CLIENT_URLS="http://192.168.235.128:2379" #这个参数表明,其他etcd节点转发本节点的链接
2 启动
启动etcd
systemctl start etcd
三 在etcd中增加flannel网络的kv值
通过etcdctl命令增加flannel网络配置的kv值,需要先将配置写入a.json文件:
etcdctl set /flannel/network/config < ./a.json
{"Network": "10.0.0.0/8",
"SubnetLen": ,
"SubnetMin": "10.10.0.0",
"SubnetMax": "10.99.0.0",
"Backend": {"Type": "vxlan",
"VNI": ,
"Port": }
}
四 配置flannel
1 配置flannel配置文件
两个node配置相同:
准备log目录
mkdir /var/log/k8s/flannel
chmod -R /var/log/k8s
编辑flannel配置
vim /etc/sysconfig/flanneld FLANNEL_ETCD_ENDPOINTS="http://192.168.235.128:2379" #etcd的ip地址和端口
FLANNEL_ETCD_PREFIX="/flannel/network" #和刚才在etcd中配置相对应
FLANNEL_OPTIONS="--logtostderr=false --log_dir=/var/log/k8s/flannel/ --iface=eno16777736" #log和在哪个端口enable flannel
2 启动flannel
systemctl start flanneld
3 检查端口信息
此时检查ifconfig
docker0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 172.18.0.1 netmask 255.255.240.0 broadcast 0.0.0.0
…… eno16777736: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.235.128 netmask 255.255.255.0 broadcast 192.168.235.255
…… flannel.: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 10.10.48.0 netmask 255.255.255.255 broadcast 0.0.0.0
……
可以看到产生了一个flannel.100的端口。
4 配置docker0的地址
对docker0端口进行配置,使docker0采用flannel分配的地址段:
source /run/flannel/subnet.env
echo ${FLANNEL_SUBNET}
ifconfig docker0 ${FLANNEL_SUBNET}
可以看到docker0在flannel.100的网段中了:
docker0: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 10.10.48.1 netmask 255.255.240.0 broadcast 0.0.0.0
...... eno16777736: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 192.168.235.128 netmask 255.255.255.0 broadcast 192.168.235.255
...... flannel.: flags=<UP,BROADCAST,RUNNING,MULTICAST> mtu
inet 10.10.48.0 netmask 255.255.255.255 broadcast 0.0.0.0
......
五 配置ip forward
1 配置iptables
配置iptables设置允许forward
iptables -P FORWARD ACCEPT
2 配置sysctl文件
vim /etc/sysctl.conf net.ipv4.ip_forward=
sysctl –p
六 重新启动docker
两个node上的docker都重新启动
systemctl restart docker
七 检查
1 启动容器
docker01上:
docker run -d --name c01 httpd
docker02上:
docker run -d --name c02 httpd
2 检查网络联通性
在docker01上:
docker exec -it c01 bash
root@d0a04613f4d9:/usr/local/apache2# ip a : lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
: eth0@if12: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP group default
link/ether ::0a:0a:: brd ff:ff:ff:ff:ff:ff
inet 10.10.48.2/ scope global eth0
可以看到eth的地址10.10.48.2是flannel.100的网段
ping www.sina.com.cn PING spool.grid.sinaedge.com (202.102.94.124) () bytes of data.
bytes from 202.102.94.124: icmp_seq= ttl= time=11.3 ms
bytes from 202.102.94.124: icmp_seq= ttl= time=11.9 ms
bytes from 202.102.94.124: icmp_seq= ttl= time=11.6 ms
在docker02上:
root@60973d570c81:/usr/local/apache2# ip a : lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP group default
link/ether ::0a:0b:b0: brd ff:ff:ff:ff:ff:ff
inet 10.11.176.2/ scope global eth0
相同的,10.11.176.2是flannel分配的地址
相互ping:
ping 10.10.48.2 PING 10.10.48.2 (10.10.48.2) () bytes of data.
bytes from 10.10.48.2: icmp_seq= ttl= time=1.64 ms
bytes from 10.10.48.2: icmp_seq= ttl= time=1.32 ms
bytes from 10.10.48.2: icmp_seq= ttl= time=1.07 ms
bytes from 10.10.48.2: icmp_seq= ttl= time=1.39 ms
可以相互ping通
总结:
通过flannel可以实现多节点的docker互通。
最新文章
- 【CodeVS 1288】埃及分数
- Java生成验证码原理(jsp)
- NS2中修改载波侦听范围和传输范围
- .net中三种数据类型转换区别((int),Int32.Parse() 和 Convert.toInt32() )
- andriod开发,简单的封装网络请求并监听返回.
- CentOS 7 安装JDK
- JavaScript 判断用户输入的邮箱及手机格式是否正确
- Winedt 7.0 Build: 20120321 永久试用方法 WinEdt 7.0 破解
- config.json ajenti
- 基于visual Studio2013解决面试题之0506取和为m的可能组合
- userAgent,JS这么屌的用户代理,你造吗?——判断浏览器内核、浏览器、浏览器平台、windows操作系统版本、移动设备、游戏系统
- iptables原理详解以及功能说明
- spring集成mybatis实现mysql读写分离
- [[NSBundle mainBundle] pathForResource:fileName ofType:]获取文件路径不成功
- CSS学习总结
- [extjs5学习笔记]第三十七节 Extjs6预览版都有神马新东西
- Socket编程实践(8) --Select-I/O复用
- git参考, 小结
- iOS开发 -------- storyBoard实现控制器添加childViewController
- python——字符串问题总结