容器中跨主机的网络方案-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互通。
容器中跨主机的网络方案-flannel的更多相关文章
- 容器中跨主机的网络方案-Weave
容器中的网络是建立docker集群的重要内容. 本文将介绍如何用Weave实现容器的多节点互通. Weave是一个开源的项目,其网站为: https://www.weave.works/ 其工作原理相 ...
- 容器中跨主机的网络方案-Calico
容器中的网络是建立docker集群的重要内容. 本文将介绍如何用Calico实现容器的多节点互通. Calico的组件结构如下: Calico通过etcd同步Bridge的信息,各个Docker no ...
- Kubernetes网络方案 Flannel和calico
摘抄某博客 1. Flannel Flannel是为kubernetes设计的一个非常简洁的多节点三层网络方案,解决不同host上的容器互联问题,原理是为每个host分配一个subnet,容器从此 ...
- k8s网络之Flannel网络
k8s网络主题系列: 一.k8s网络之设计与实现 二.k8s网络之Flannel网络 三.k8s网络之Calico网络 简介 Flannel是CoreOS团队针对Kubernetes设计的一个网络规划 ...
- 浅谈K8S cni和网络方案
此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...
- 理解Docker(6):若干企业生产环境中的容器网络方案
本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...
- Docker 跨主机网络方案分析
PS:文章首发公众号,欢迎大家关注我的公众号:aCloudDeveloper,专注技术分享,努力打造干货分享平台,二维码在文末可以扫,谢谢大家. 上篇文章介绍了容器网络的单主机网络,本文将进一步介绍多 ...
- [Kubernetes]谈谈容器跨主机网络
继上篇文章:[Kubernetes]浅谈容器网络,自己给自己挖的坑,这篇文章来谈谈容器跨主机网络. 要理解容器"跨主通信"的原理,就要来谈谈 Flannel 这个项目. Flann ...
- Docker系列04—跨主机网络方案(overlay/weave)
在前面详细讲解了几种网络模式:none,host,bridge,container.他们解决了单个主机间的容器的通信问题,并不能实现多个主机容器之间的通信. 跨主机网络方案包括两大类: 1,docke ...
随机推荐
- php数组函数-array_intersect()
array_intersect()函数返回两个或多个数组的交集数组 结果数组包含了所有在被比较数组中,也同时出现在所有其他参数数组中 的值,键名保留不变 array_intersect(array1, ...
- 20145230《java程序设计》第三次试验报告
20145208 实验三 Java面向对象程序设计 实验内容 实验内容 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模 ...
- MIPI协议中文详解【转】
本文转载自:http://www.voidcn.com/blog/michaelcao1980/article/p-6254588.html 一.MIPI MIPI(移动行业处理器接口)是Mobile ...
- 定时任务 Linux cron job 初步使用
查看定时任务的命令为:crontab -l 编辑定时任务的命令为:crontab -e (编辑后立即生效 若注释可在行首加# 同vi) 定时任务说明 每一行为一 ...
- Linux服务器注意事项
1.在Linux新建一个tomcat目录,执行里面的文件运行的时候 会出现权限不足的提示?解决办法:这是因为新建的文件夹,对于可执行脚本,必须先授权,进入bin目录后,执行命令 chmod 764 ...
- CentOs linux安装SVN服务
SVN服务器有2种运行方式:1.独立服务器(例如:svn://xxx.com/xxx):2.借助apache (例如:http://svn.xxx.com/xxx):为了不依赖apache,我选择 ...
- Centos7 搭建DNS服务器与原理配置详解
在搭建我们自己DNS服务器之前,先必须了解下DNS服务器的作用和原理. DNS是在互联网上进行域名解析到对应IP地址的服务器,保存互联网上所有的IP与域名的对应信息,然后将我们对网址的访问,解析成IP ...
- Java多线程的集合类
适用于多线程环境下的集合类: 1.阻塞队列:ArrayBlockingQueue(数组实现队列),LinkedBlockingQueue(链表实现队列) public class BlockingQu ...
- 【bzoj2151】种树(堆/优先队列+双向链表)
题目传送门:http://www.lydsy.com/JudgeOnline/problem.php?id=2151 这道题因为优先队列不怎么会用,而且手写堆的代码也不长,也想复习一下手写堆的写法…… ...
- WEB开发中常见漏洞
1.sql注入 SQL注入在黑客领域是一种非常常见的攻击手段,大家应该都听说过很多数据泄漏的案例,其中大部分都是采用SQL注入来获取数据的. SQL注入一般是前端向后台提交数据的时候,在数据中加入SQ ...