# ps -ef|grep docker|grep bip

  1. FLANNEL_OPTIONS="-ip-masq=true"
  2. -ip-masq=true 这个参数的目的是让flannel进行ip伪装,而不让docker进行ip伪装。这么做的原因是如果docker进行ip伪装,流量再从flannel出去,其他host上看到的source ip就是flannel的网关ip
    而不是docker容器的ip

-----------------------------------------------------------------------------------------------------------------------

Flannel是一个专为kubernetes定制的三层网络解决方案,主要用于解决容器的跨主机通信问题。

Flannel 是由 CoreOS 维护的一个虚拟网络方案。Flannel为每个host分配一个subnet,容器从此subnet中分配ip。这些ip可以在host间路由,容器间无需nat和port mapping就可以跨主机通讯。

  1. 首先,flannel利用Kubernetes API或者etcd用于存储整个集群的网络配置,其中最主要的内容为设置集群的网络地址空间。例如,设定整个集群内所有容器的IP都取自网段“10.1.0.0/”。
  2. 接着,flannel在每个主机中运行flanneld作为agent,它会为所在主机从集群的网络地址空间中,获取一个小的网段subnet,本主机内所有容器的IP地址都将从中分配。
  3. 然后,flanneld再将本主机获取的subnet以及用于主机间通信的Public IP,同样通过kubernetes API或者etcd存储起来。
  4. 最后,flannel利用各种backend mechanism,例如udpvxlan等等,跨主机转发容器间的网络流量,完成容器间的跨主机通信。

使用Flannel ,添加一台新机器到集群时,Flannel 做了三件事:

  1. 使用 etcd 为新增机器分配一个子网
  2. 在宿主机上创建一个虚拟桥接接口(名为 docker0 的桥接器)
  3. 设置一个网络转发后端
    • aws-vpc:在 Amazon AWS 实例表中注册新增机器子网。该实例表最多支持 50 项记录,这意味着,如果你使用 flannel + aws-vpc 方案,集群最多只能包含 50 台机器,集群也只能运行在 AWS 云平台。
    • host-gw:通过远程机器 IP ,创建到子网的 IP 路由。这要求运行 flannel 的不同主机在二层直接互通(通过mac地址进行通信)。
    • vxlan:创建一个虚拟的 VXLAN 接口。(扩展的虚拟局域网)

由于 flannel 使用桥接接口转发网络包,从一个容器发往另一个容器的网络包将历经两个网络栈。

Flannel通信原理如图:

步骤

  • IP数据报被封装并通过容器的eth0发送。
  • Container1的eth0通过veth对与Docker0交互并将数据包发送到Docker0。然后Docker0转发包。
  • Docker0确定Container3的IP地址,通过查询本地路由表到外部容器,并将数据包发送到虚拟NIC Flannel0。
  • Flannel0收到的数据包被转发到Flanneld进程。 Flanneld进程封装了数据包通过查询etcd维护的路由表并发送数据包通过主机的eth0。
  • 数据包确定网络中的目标主机主机。
  • 目的主机的Flanneld进程监听8285端口,负责解封包。
  • 解封装的数据包将转发到虚拟NICFlannel0。
  • Flannel0查询路由表,解封包,并将数据包发送到Docker0。
  • Docker0确定目标容器并发送包到目标容器。

添加flannel网络配置信息到Etcd集群:

  1. etcdctl --endpoints=https://172.17.213.60:2379 \
  2. --cert-file=/etc/kubernetes/ssl/etcd.pem \
  3. --ca-file=/etc/kubernetes/ssl/ca.pem \
  4. --key-file=/etc/kubernetes/ssl/etcd-key.pem \
  5. set /flannel/network/config \ '{"Network":"10.254.64.0/18","SubnetLen":24,"Backend":{"Type":"vxlan"}}'
  • Network:用于指定Flannel地址池
  • SubnetLen:用于指定分配给单个宿主机的docker0的ip段的子网掩码的长度
  • SubnetMin:用于指定最小能够分配的ip段
  • SudbnetMax:用于指定最大能够分配的ip段,"SubnetMin": "10.0.1.0","SubnetMax": "10.0.20.0",表示每个宿主机可以分配一个24位掩码长度的子网,可以分配的子网从10.0.1.0/24到10.0.20.0/24,也就意味着在这个网段中,最多只能有20台宿主机
  • Backend:用于指定数据包以什么方式转发,默认为udp模式,host-gw模式性能最好,但不能跨宿主机网络

Flannel启动过程解析:

  • 从etcd中获取network的配置信息
  • 划分subnet,并在etcd中进行注册
  • 将子网信息记录到/run/flannel/subnet.env中

验证Flannel网络

查看etcd中的数据:

  1. $etcdctl --endpoints=${ETCD_ENDPOINTS} \
  2. --ca-file=/etc/kubernetes/ssl/ca.pem \
  3. --cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  4. --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  5. ls /kube-centos/network/subnets
  6. /kube-centos/network/subnets/172.30.14.0-
  7. /kube-centos/network/subnets/172.30.38.0-
  8. /kube-centos/network/subnets/172.30.46.0-
  9.  
  10. $etcdctl --endpoints=${ETCD_ENDPOINTS} \
  11. --ca-file=/etc/kubernetes/ssl/ca.pem \
  12. --cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  13. --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  14. get /kube-centos/network/config
  15. { "Network": "172.30.0.0/16", "SubnetLen": , "Backend": { "Type": "vxlan" } }
  16.  
  17. $etcdctl --endpoints=${ETCD_ENDPOINTS} \
  18. --ca-file=/etc/kubernetes/ssl/ca.pem \
  19. --cert-file=/etc/kubernetes/ssl/kubernetes.pem \
  20. --key-file=/etc/kubernetes/ssl/kubernetes-key.pem \
  21. get /kube-centos/network/subnets/172.30.14.0-24
  22. {"PublicIP":"172.20.0.114","BackendType":"vxlan","BackendData":{"VtepMAC":"56:27:7d:1c:08:22"}}

参考资料: https://segmentfault.com/a/1190000016304924?utm_source=tag-newest

Flannel网络插件配置的更多相关文章

  1. k8s的flannel网络插件配置

    flannel的网络插件配置 Kubernetes网络通信需要解决以下问题:            (1)容器间通信:同一个Pod内的多个容器间的通信,lo            (2)Pod通信:P ...

  2. Kubernetes1.91(K8s)安装部署过程(五)--安装flannel网络插件

    node节点需要安装flannel网络插件才能保证所有的pod在一个局域网内通信,直接使用yum安装即可,版本是0.7.1. 1.安装flannel插件: 注意是2个node节点都需要安装,都需要修改 ...

  3. 使用kubeadm安装kubernetes/部署前准备/flannel网络插件/镜像下载/

    本文内容参考<kuberneters进阶实战>/马哥的新书/推荐 部署前的准备 主机名称解析 分布式系统环境中的多主机通信通常基于主机名称进行,这在IP地址存在变化的可能性时为主机提供了固 ...

  4. K8S Flannel网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

  5. K8S(03)核心插件-Flannel网络插件

    系列文章说明 本系列文章,可以基本算是 老男孩2019年王硕的K8S周末班课程 笔记,根据视频来看本笔记最好,否则有些地方会看不明白 需要视频可以联系我 K8S核心网络插件Flannel 目录 系列文 ...

  6. K8s二进制部署单节点 etcd集群,flannel网络配置 ——锥刺股

    K8s 二进制部署单节点 master    --锥刺股 k8s集群搭建: etcd集群 flannel网络插件 搭建master组件 搭建node组件 1.部署etcd集群 2.Flannel 网络 ...

  7. 二进制搭建kubernetes多master集群【二、配置flannel网络】

    上一篇我们已经搭建etcd高可用集群,参考:二进制搭建kubernetes多master集群[一.使用TLS证书搭建etcd集群] 此文将搭建flannel网络,目的使跨主机的docker能够互相通信 ...

  8. Calico网络插件

    以下大部分是本人参考各种资料{官方文档.书籍}对知识的汇总和整理,其中有理解错误的地方请大神留言和指正,嘿嘿~~ 1.概述 参考文档:https://projectcalico.docs.tigera ...

  9. K8S Calico网络插件

    0.前言 参考文档:https://github.com/containernetworking/cni Pod网络插件,为了实现Pod网络而需要的插件.组件.由于Kubernetes通过开放的CNI ...

随机推荐

  1. dos语法

    一)MD——建立子目录 1.功能:创建新的子目录 2.类型:内部命令 3.格式:MD[盘符:][路径名]〈子目录名〉 4.使用说明: (1)“盘符”:指定要建立子目录的磁盘驱动器字母,若省略,则为当前 ...

  2. JAVA高级篇(一、JVM基本概念)

    一.什么是JVM VM的中文名称叫Java虚拟机,它是由软件技术模拟出计算机运行的一个虚拟的计算机. JVM也充当着一个翻译官的角色,我们编写出的Java程序,是不能够被操作系统所直接识别的,这时候J ...

  3. 《Linux内核原理与分析》第八周作业

    课本:第七章 可执行程序工作原理 ELF目标文件格式 目标文件:编译器生成的文件. 目标文件的格式:out格式.COFF格式.PE(windows)格式.ELF(Linux)格式. ELF(Execu ...

  4. poj 1151 (未完成) 扫描线 线段树 离散化

    #include<iostream> #include<vector> #include<cmath> #include<algorithm> usin ...

  5. 学习笔记TF050:TensorFlow源代码解析

    TensorFlow目录结构. ACKNOWLEDGMENTS #TensorFlow版本声明 ADOPTERS.md #使用TensorFlow的人员或组织列表 AUTHORS #TensorFlo ...

  6. Head First 设计模式 (Eric Freeman / Elisabeth Freeman / Kathy Sierra / Bert Bates 著)

    1. 欢迎来到设计模式世界:设计模式入门 (已看) 策略模式 定义了算法族,分别分装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户. 设计原则 找出应用中可能需要变化之处,把它们 ...

  7. Redis缓存相关问题总结

    使用缓存是系统性能优化的第一黄金法则. 缓存的设计和使用对一个系统的性能至关重要,平时接触到项目无论多少也都会在某些层面用到缓存,比如用HashMap实现,Ehcache,memcached.redi ...

  8. nginx+keeplived+tomcat

    1,宣告操作系统版本,nginx,java,tomcat,keeplived版本 操作系统 用途 VIP IP地址 软件版本 CentOS 7.3 mini NTP服务器 无 192.168.197. ...

  9. [zz]LyX 入门教程

    http://blog.sina.com.cn/s/blog_630e5dec0100w3jl.html The LyX Tutorial by the LyX Team 1 目录 Chapter 1 ...

  10. bootstrap模态框弹框后执行Ajax

    如下: editModal:模态框ID <script> $(document).ready(function() { $('#editModal').on('hidden.bs.moda ...