容器间内部通信

  • bridge模式
  • host模式
  • 自定义网络
  • Container模式
  • None模式

跨主机通信

Docker默认的网络环境下,单台主机上的Docker容器可以通过docker0网桥直接通信,而不同主机上的Docker容器之间只能通过在主机上做端口映射进行通信。

这种端口映射方式对很多集群应用来说极不方便。 如果能让Docker容器之间直接使用自己的IP地址进行通信,会解决很多问题。

按实现原理可分别直接路由方式、桥接方式(如pipework)、Overlay隧道方式(如flannel、ovs+gre)等。

直接路由

Flannel

Flannel实质上是一种覆盖网络(overlay network),即表示运行在一个网上的网(应用层网络),并不依靠ip地址来传递消息, 而是采用一种映射机制,把ip地址和identifiers做映射来资源定位。

也就是将TCP数据包装在另一种网络包里面进行路由转发和通信, 目前已经支持UDP、VxLAN、AWS VPC和GCE路由等数据转发方式。

Flannel实现的容器的跨主机通信通过如下过程实现:

  • 每个主机上安装并运行etcdflannel
  • 在etcd中规划配置所有主机的docker0子网范围;
  • 每个主机上的flannel根据etcd中的配置,为本主机的docker0分配子网,保证所有主机上的docker0网段不重复,并将结果(即本主机上的docker0子网信息和本主机IP的对应关系)存入 etcd库中,这样etcd库中就保存了所有主机上的docker子网信息和本主机IP的对应关系;
  • 当需要与其他主机上的容器进行通信时,查找etcd数据库,找到目的容器的子网所对应的outip(目的宿主机的IP);
  • 将原始数据包封装在VXLAN或UDP数据包中,IP层以outip为目的IP进行封装;
  • 由于目的IP是宿主机IP,因此路由是可达的;
  • VXLAN或UDP数据包到达目的宿主机解封装,解出原始数据包,最终到达目的容器。

Flannel特点:

1. 使集群中的不同Node主机创建的Docker容器都具有全集群唯一的虚拟IP地址。

2. 建立一个覆盖网络(overlay network),通过这个覆盖网络,将数据包原封不动的传递到目标容器。覆盖网络是建立在另一个网络之上并由其基础设施支持的虚拟网络。覆盖网络通过将一个分组封装在另一个分组内来将网络服务与底层基础设施分离。在将封装的数据包转发到端点后,将其解封装。

3. 创建一个新的虚拟网卡flannel0接收docker网桥的数据,通过维护路由表,对接收到的数据进行封包和转发(vxlan)。

4. etcd保证了所有node上flanned所看到的配置是一致的。同时每个node上的flanned监听etcd上的数据变化,实时感知集群中node的变化。

环境搭建

主机 ip 环境要求
CentOS01 192.168.23.131 etcd,docker,flannel
CentOS02 192.168.23.132 etcd,docker,flannel
  • docker安装与配置
  • etcd安装与集群搭建

ETCD版本问题:

当重新启动 执行 etcdctl member list 列出所有集群节点信息时 报错了

原因:

ETCD3.4版本中,ETCDCTL_API=3和etcd --enable-v2=false成为了默认配置。

flannel操作etcd使用的是v2的API,而kubernetes操作etcd使用的v3的API

为了兼容flannel,将默认开启v2版本,故配置文件中还要设置:

1.修改系统环境变量

vi /etc/profile

2.将指定etcdctl命令的版本为v2的加进去

export ETCDCTL_API=2

3.刷新系统环境

source /etc/profile

注:etcdctl2和etcdctl3是不兼容的,两者的api参数也不一样,最关键的是“v2/v3的数据是不互通的”

  • 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

ETCD中保存网络信息

  • 使用v2版的set(而非put)命令向ETCD中保存flannel覆盖网络信息

ETCDCTL_API=2 etcdctl \ --endpoints "http://192.168.23.131:2379,http://192.168.23.132: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"}}'

  • Network: 用于指定Flannel地址池, 整个overlay(覆盖)网络为10.0.0.0/16网段
  • SubnetLen: 用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度,默认值也是24
  • SubnetMin: 用于指定最小能够分配的ip段
  • SudbnetMax: 用于指定最大能够分配的ip段,在上面的示例中,表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网 段中,最多只能有20台宿主机
  • Backend: 用于指定数据包以什么方式转发,默认为udp模式, 这里使用的是vxlan模式.因为为vxlan比起预设的udp性能相对好一些

注:flannel访问etcd时使用的key默认为:/coreos.com/network,可修改,但必须重新配置flanneld.conf的参数etcd-prefix,例如-etcd-prefix=/zking.com/network

flannel安装与配置

  • 下载或上传flannel安装包
  • 创建flannel安装目录

mkdir -p /opt/flannel

  • 解压到安装目录

tar xzf flannel-v0.11.0-linux-amd64.tar.gz -C /opt/flannel

  • 查看解压后文件

cd /opt/flannel && ls

flanneld为主要的执行文件

sh脚本用于生成Docker启动参数

  • 为flannel创建一个systemd服务,用于后台启动

vim /etc/systemd/system/flanneld.service

systemctl daemon-reload && systemctl restart flanneld

  • 验证flannel网络

ifconfig

如果看到flannel.1网卡的地址和etcd中存储的地址一样,这样flannel网络配置完成

docker配置

在各个节点安装好Docker,然后更改Docker的启动参数,使其能够使用flannel进行IP分配,以及网络通讯。

  • 查看flannel分配的网络参数(在Flannel运行之后,会生成一个环境变量文件,包含了当前主机要使用flannel通讯的相关参数)

 cat /run/flannel/subnet.env

  • 创建Docker运行参数(使用flannel提供的脚本将subnet.env转写成Docker启动参数)

/opt/flannel/mk-docker-opts.sh -d /run/flannel/docker_opts.env -c

  • 创建好的启动参数位于/run/flannel/docker_opts.env文件中,可使用cat命令查看

cat /run/flannel/docker_opts.env

  • 修改Docker启动参数

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

如图:

  • 重新加载systemd配置,并重启Docker

 systemctl daemon-reload && systemctl restart docker && systemctl status docker

  • 查看是否应用成功

 ifconfig

注:观察docker0的网卡ip地址已经处于flannel网卡网段中

测试flannel

  • 下载centos镜像,因为此镜像中其它软件及命令均有安装

docker run -it --name=centos centos bash

  • 依次查看集群内容器的flannel.1网络IP

cat /etc/hosts

docker inspect bridge

  • 从不同宿主机容器到其他宿主机容器

ping -c3 192.168.23.132

ping -c3 10.0.20.2

解决flannel下容器无法跨主机互通问题

经测试,发现是防火墙的问题,关闭防火墙后问题解决,但作为服务的防火墙是不能关闭的,如何解决呢。 这是由于linux还有底层的iptables,所以在node上分别执行:

iptables -P INPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -F

iptables -L -n

flannel安装与配置相关推荐

  1. CentOS 7 Flannel的安装与配置

    1. 安装前的准备 etcd 3.2.9 Docker 17.12.0-ce 三台机器10.100.97.236, 10.100.97.92, 10.100.97.81 etcd不同版本之间的差别还是 ...

  2. 容器编排之Kubernetes1.6.1安装与配置

    在经历了几年混乱的职业生涯之后,初步把未来延伸领域定位在容器云方向.区块链系列我还会继续写下去,且可能只会关注Hyperledger. 云计算是最近几年来火热的技术领域,不同于其他,他没有固定的行业领 ...

  3. Flannel 安装部署

    Flannel Flannel是 CoreOS 团队针对 Kubernetes 设计的一个覆盖网络(Overlay Network)工具,其目的在于帮助每一个使用 Kuberentes 的 CoreO ...

  4. Maven安装与配置(最实用!!!)eclipse中配置maven

    Maven安装与配置 一.需要准备的东西 JDK Eclipse(本章主要是在eclipse中进行配置maven) Maven程序包 二.下载与安装 1. 前往maven下载最新版的Maven程序: ...

  5. Portainer 安装与配置

    文章目录 Portainer 安装与配置 一.介绍 二.安装使用 1.单机运行 2.基于swarm集群方式运行 Portainer 安装与配置 一.介绍 ​ Portainer 是一个开源.轻量级Do ...

  6. Myeclipse安装、配置、测试

    Myeclipse安装.配置.测试(win7_64bit) 目录 1.概述 2.本文用到的工具 3.安装与激活 4.JavaSE开发测试(确保JDK已正确安装) 5.JavaEE开发测试(确保服务器和 ...

  7. [网摘学习]在Ubuntu上安装和配置OpenStack Nova之二

    再收藏一份Openstack的文章,这两天的操作与此相同.但其中出现的问题还需要查找原因.待个人继续学习研究. 原文参考:http://www.linuxde.net/2011/11/1599.htm ...

  8. centos6.5 php5.2,Linux中PHP安装与配置(CentOS-6.5:php-5.2.13)

    1 PHP简介     PHP(PHP: Hypertext Preprocessor的缩写,中文名:"超文本预处理器")是一种通用开源脚本语言.语法吸收了C语言.Java和Per ...

  9. java jdk 1.8 安装_下载、安装、配置 java jdk1.8

    近期配置react native的开发环境,所以就从配置环境开始.rn的环境配置有那么几项,其中重要的一个就是java jdk(Java Development Kit 的缩写),那么以下就是下载.安 ...

最新文章

  1. TypeError: the JSON object must be str, bytes or bytearray, not dict
  2. ModuleNotFoundError: No module named ‘gensim‘
  3. 如何确定SharePoint 2007的一次增量爬网会处理多少条更新呢?
  4. Vue实现仿音乐播放器2-新建Vue项目vuemusicplayer
  5. 在线可视化python网站_Python的可视化工具概述
  6. 为什么不能线程调用类的成员函数_C++多线程编程之创建线程的几种方法
  7. java servlet post取值_Java servlet无法获得POST参数
  8. 电容充放电原理图_别找了,去耦电容全攻略就在这!
  9. 【IBM Tivoli Identity Manager 学习文档】14 TIM组织结构设计
  10. Leetcode200岛屿数量(深搜)
  11. [NLP论文阅读]A SIMPLE BUT TOUGH-TO-BEAT BASELINE FOR SENTENCE EMBEDDINGS
  12. 演示辅助软件 ZoomIt 的使用
  13. 微信小程序实现城市索引选择+搜索
  14. python读txt文件-python读取文本文件数据
  15. display属性详解
  16. 使用程序自动调用ANSYS并运行命令流文件
  17. 指针的大小与什么有关
  18. GIS 二次开发概述 (整理)
  19. Java实现设计模式之——单例模式
  20. ubuntu 100M 到 10M

热门文章

  1. .wang是国际域名吗
  2. C++可变参数模板显式特例化
  3. c语言艺术图案编程,C语言编程艺术--条件编译(原创)
  4. C#获取WebService接口的所有可调用方法[WebMethod]
  5. 小程序App()函数使用
  6. 引流锁客非常厉害的饺子馆,每天营业额3万?一年净赚180万!
  7. 知乎大神解释数据库三范式
  8. WAV文件格式分析(附AVI文件格式分析)
  9. 如何选择企业传真服务器
  10. test.ctf8(XSS挑战之旅)解题记录