calico工作原理_Calico原理
容器网络的解决方案
跨节点的容器网络要解决两个问题:
容器如何分配IP
flannel设计了一种全局的网络地址分配机制,即使用etcd存储网段和节点之间的关系,然后flannel配置各个节点上的Docker(或其他容器工具),只在分配到当前节点的网段里选择容器IP地址。这样就确保了IP地址分配的全局唯一性。
容器IP地址如何路由
overlay网络
vxlan
udp
直接路由
host-gateway
在overlay网络模式下,不论是UDP模式还是VXLAN模式,容器发送到网络中的数据包都会进行封包操作,这就难免会对性能造成一定的影响。在host-hateway模式下flannel通过在各个节点上运行的agent将容器网络的路由信息刷到主机的路由表上,目标容器的宿主机IP就是吓一跳地址,然而flannel只能修改各个主机的路由表,一旦主机之间隔了其他路由设备,比如三层路由器,这个包就会在路由设备上被丢掉。这样一来,Host-Gateway的模式就只能用于二层直接可达的网络。由于广播风暴问题,这种网络通常都是较小规模的。这篇文章将会介绍另一种基于直接路由方式的容器网络方案。
Calico
Calico主要组件
Calico和hots-gateway模式很类似,都是通过在宿主机增加路由规则实现容器组网,但是Calico并不像Flannel那样通过Etcd和宿主的Flanned维护路由信息,而是使用BGP协议(边界网关协议) 在集群内分发路由信息。
Felix
Felix是一个守护程序(在k8s中以DeaemonSe部署),以agent形式运行在宿主机上,负责刷新主机路由表信息,维护网络接口和报告主机状态等工作。
BGPClient
BGPClinet的作用是读取Felix编写到内核中的路由信息,并将路由信息分发到集群中的其他节点。
Calico工作原理
以容器1访问容器2为例,先进入容器1查看它的路由表和网络配置。
root@nginx-deployment-6b474476c4-p82xb:/# ip addr
1: lo: mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
3: eth0@if4: mtu 1440 qdisc noqueue state UP group default
link/ether f6:64:05:f3:4b:be brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.16.123.5/32 brd 172.16.123.5 scope global eth0
valid_lft forever preferred_lft forever
4: tunl0@NONE: mtu 1480 qdisc noop state DOWN group default qlen 1000
link/ipip 0.0.0.0 brd 0.0.0.0
复制代码
可以看到容器1的IP地址为172.16.123.5/32,而MAC地址为ff:ff:ff:ff:ff:ff,这明显是一个固定的MAC地址,因为Calico不关心二层的MAC地址,只关心三层的IP地址。
当容器1执行ping 172.16.215.3/32时,因为两者不在同一网络内,所以容器1会查看自己的路由表。
root@nginx-deployment-6b474476c4-p82xb:/# ip route
default via 169.254.1.1 dev eth0
169.254.1.1 dev eth0 scope link
复制代码
容器的的所有报文都会通过eth0发送到下一跳169.254.1.1,容器需要知道下一跳的MAC地址,那ARP请求发送到哪里那。eth0是veth pair 的一端,那它的另一端在哪那。我们可以通过ethtool -S eth0列出对端网卡的index。
root@nginx-deployment-6b474476c4-p82xb:/# ethtool -S eth0
NIC statistics:
peer_ifindex: 4
rx_queue_0_xdp_packets: 0
rx_queue_0_xdp_bytes: 0
rx_queue_0_xdp_drops: 0
复制代码
主机上index为4的网卡
root@work2:/home/work2/Desktop# ip addr
4: cali85354e41ec1@if3: mtu 1440 qdisc noqueue state UP group default
link/ether ee:ee:ee:ee:ee:ee brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::ecee:eeff:feee:eeee/64 scope link
valid_lft forever preferred_lft forever
复制代码
这块网卡并没有IP第地址,它接收到查询169.254.1.1的ARP报文会进行"代答",即将自己的MAC地址告诉容器1,后续报文则会转发给主机处理。
root@work2:/home/work2/Desktop# cat /proc/sys/net/ipv4/conf/cali85354e41ec1/proxy_arp
1
复制代码
主机上的calixx网卡接收到报文后,再根据路由表转发
root@work2:/home/work2/Desktop# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.2 0.0.0.0 UG 100 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens33
172.16.123.0 0.0.0.0 255.255.255.192 U 0 0 0 *
172.16.123.5 0.0.0.0 255.255.255.255 UH 0 0 0 cali85354e41ec1
172.16.123.6 0.0.0.0 255.255.255.255 UH 0 0 0 cali35e3a5cb80b
172.16.215.0 192.168.2.132 255.255.255.192 UG 0 0 0 tunl0
172.16.243.192 192.168.2.131 255.255.255.192 UG 0 0 0 tunl0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
复制代码
接下来数据包会通过tun0设备发送到下一跳,也就是容器2的宿主机192.168.2.132/32。当数据包到达宿主机时,会先经过iptables规则,如果被iptables拦截那么数据包将会被丢弃。然后通过路由表转发,接着从cali34af9914629网卡,发送到容器2。
# 容器2宿主机路由表
root@work1:/home/work1/Desktop# route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.2.2 0.0.0.0 UG 100 0 0 ens33
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens33
172.16.123.0 192.168.2.133 255.255.255.192 UG 0 0 0 tunl0
172.16.215.0 0.0.0.0 255.255.255.192 U 0 0 0 *
172.16.215.3 0.0.0.0 255.255.255.255 UH 0 0 0 cali34af9914629
172.16.243.192 192.168.2.131 255.255.255.192 UG 0 0 0 tunl0
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
192.168.2.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
复制代码
以上过程如下图所示
IPIP模式
通过上面的分析可以看出calico和host一样要求二层网络是可达的,但是在实际的部署中集群的网络通常划分在不同的网段中,calico如何处理跨网段通信那。在这种情况下就需要为Calico打开IPIP模式。
在IPIP模式下,calico会使用tunl0设备,tunl0是一个ip隧道设备,通过上面的路由表发现,IP包会被tunl0设备接管。tunl0设备会将IP包封装为宿主机IP包。经过封装后的IP包,如下图所示
这样新的IP包就可以通过宿主机路由器发送了,如下图所示
Cailco在IPIP模式下会进行封包,也会对性能造成一定的影响,但是相对Flannel的VXLAN模式来说要好一些。
BGP Route Reflector
在默认配置下每台宿主机的BGPClient需要和集群所有的BGPClient建立连接,进行路由信息交换,随着集群规模的扩大,集群的网络将会面临巨大的压力并且宿主机的路由表也会变的过大。所以在大规模的集群中,通常使用BGP Route Reflector充当BGP客户端连接的中心点,从而避免与互联网中的每个BGP客户端进行通信。Calico使用BGP Route Reflector是为了减少给定一个BGP客户端与集群其他BGP客户端的连接。用户也可以同时部署多个BGP Route Reflector服务实现高可用。Route Reflector仅仅是协助管理BGP网络,并没有工作负载的数据包经过它们。
calico工作原理_Calico原理相关推荐
- 线性可编程电源是如何工作?设计原理是什么?
程控电源被广泛用于测试和测量各种电子产品,并且也正在扩展到其他行业.可编程电源用于传统电镀行业,可大大提高电镀产品的质量和自动化程度.减少开支.另外,由于可编程电源的高效率,可以大大降低许多传统行业的 ...
- MySQL主从复制原理(原理+实操)
1.MySQL主从复制原理(原理+实操) 主从复制简介 在实际的生产中,为了解决Mysql的单点故障已经提高MySQL的整体服务性能,一般都会采用「主从复制」. 比如:在复杂的业务系统中,有一句sql ...
- Docker实现原理/容器原理(LXC,Cgroups,Docker)
Docker实现原理/容器原理 Docker实现原理/容器原理 什么是容器(Container) 容器 传统架构问题 容器是什么 容器如何实现 Cgroups Cgroups是什么 Cgroups解决 ...
- Spring原理/SpringMVC原理/IOC/AOP原理
Spring原理/SpringMVC原理/IOC/AOP原理 我的微型IOC框架实现 我的微型IOC框架实现 当你打开这本书的时候我要告诉你的第一句话就是认真把前言读完,因为前言概括的本书的大纲以及思 ...
- 20181210-es6(letconst解构模版字符串原理 展开运算符、剩余运算符运用 深拷贝原理 reduce原理 箭头函数)...
变量声明 var 特点: 1.可以重复声明 2.不能定义常量 3.不支持块级作用域 复制代码 let //1.不存在预解释 变量提升 //2.暂时性死区 //3.具备块级,同一块内不能重复声明;let ...
- calico工作原理_【Calico系列】3 Calico的组件、架构与原理
本文是 Calico 系列的第三篇文章,继上一篇了解 BGP 的基本概念,这一篇真正进入 Calico 的笔记.本篇以 Calico 3.4 版本 为基准. 由于网络的水深与个人能力有限,本文不免存在 ...
- LVS工作总结之原理篇–DR模式
原文地址: http://www.chenqing.org/2012/11/%E3%80%90lvs%E3%80%91lvs%E5%B7%A5%E4%BD%9C%E6%80%BB%E7%BB%93%E ...
- mybatis 原理_Mybatis工作流程及其原理与解析
Mybatis简介: MyBatis 是一款优秀的持久层框架,它支持定制化 SQL.存储过程以及高级映射.MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集.MyBatis ...
- [RabbitMQ]工作原理_原理名词解释
RabbitMQ 核心部分 各个名词介绍 RabbitMQ工作原理 Broker: 接收和分发消息的应用,RabbitMQ Server 就是 Message Broker Virtual host: ...
最新文章
- LogStash 中字段的排除和数据的排除
- idea中reload all from disk_SpringBoot IDEA中实现热部署
- date数据存入mysql_Date对象存入mysql数据库
- 【Python】shuffle函数
- java例程练习(数组复制与arraycopy)
- ATP-EMTP中变压器联结方式与电压的关系
- 面试真题:经典智力题最详汇总(上)
- 图说设计模式-结构型设计模式笔记
- 董文永武汉大学计算机学院,董文永
- 决策树和随机森林预测员工离职率学习代码
- Nerv - 京东高性能前端框架
- 如何获取注册高德Key使用的SHA1值
- 【Unity Shader】渲染纹理实现镜子效果
- web前端的css示例
- 2018年最新python视频教程学习建议百度云分享
- Verilog中的Signed Decimal与Signed Magnitude区别
- 【本人秃顶程序员】高级 Java 必须突破的 10 个知识点!
- Python 成为最受欢迎的语言靠实力吗?
- NAT地址转换(超详细解说版)
- python中模块文件的扩展名不一定是py_跟老齐学Python之Import 模块
热门文章
- MoreLikeThis 相似检索
- 科沃斯扫地机器人无语音提示_科沃斯机器人DN33常见问题汇总
- 求最大字段和问题(常规法,分治法,动态规划法)
- Redis第一话 -- Redis介绍以及基于Docker安装Redis
- 人性:见不得别人比自己好,还希望别人跟自己一样不努力
- c语言中printk用法,printk的用法
- 汽车内饰vr全景交互展示如何实现?
- Ubuntu 美化和常用环境搭建 -- Linux 环境搭建(下)
- iOS-Missing Private key解决方案-iOS证书 .cer 以p12文件
- 【idea】tag(git标签)的使用