【Calico系列】4 数据中心网络简述

本文是 Calico 系列的第四篇文章,上一篇了解了 calico 的组件、架构与原理,这篇学习数据中心的网络设计。本篇的内容为血衫学习文末参考资料后的笔记。

由于网络的水深与个人能力有限,本文不免存在错误之处。如有疑问,请查阅文末参考资料或与我线上/线下讨论。

一、分层网络设计

思科的分层(三层)互连网络模型(hierarchical internetworking model)是工业界设计可靠、可扩展、高性价比的互连网络时广泛采用的模型。

讨论网络设计时,通常根据设备数量将网络分成几类:

  • 小型网络:支持最多 200 个设备
  • 中型网络:支持 200 ~ 1000 个设备
  • 大型网络:支持 1000+ 设备

网络设计随规模和公司需求的不同而不同。例如,小公司的设备数量比较少,因此网络基础 设施就无需像大公司设计的那么复杂。

思科分层网络模型中的三个层:接入层、汇聚层、核心层。

早期网络

早期的网络都是扁平拓扑(flat topology):

img

当更多的设备需要接入网络时,就添加集线器(hub)和交换机(switch)。扁平网络设计 的缺点是很难控制广播流量,或者对特定流量进行过滤。当网络中的设备越来越多时, 响应时间也会越来越慢,最终使得网络不可用。

因此,我们需要一个更好的方案。现在,大部分公司都使用下图所示的分层网络方案:

img

将扁平网络划分成更小、更易管理的组成部分的好处是可以将本地流量限制在本地( local traffic remains local)。只有目的是其他网络的流量才会被传送到更高的层。

一个典型的企业分层局域网(hierarchical LAN)包括三层:

  • 接入层:提供工作组/用户接入网络的功能
  • 汇聚层:提供基于策略的连接功能,控制接入层和核心层的边界
  • 核心层:提供汇聚层交换机之间的高速传输

另一个三层分层网络设计如下图所示,注意其中的每个 building 都是分层网络模型 ,包括了接入层、汇聚层和核心层。

img

注意:设计网络的物理拓扑并没有绝对的规则。虽然很多网络都是基于三层的物理 设备搭建的,但这并不是强制条件。在小一些的网络中,核心层和汇聚层可能会合并为一层,由同一个物理交换机充当,这样网络就变成了两层。这被称为 collapsed core design(塌缩的核心层设计)。


【Calico系列】3 Calico的组件、架构与原理

本文是 Calico 系列的第三篇文章,继上一篇了解 BGP 的基本概念,这一篇真正进入 Calico 的笔记。本篇以 Calico 3.4 版本 为基准。

由于网络的水深与个人能力有限,本文不免存在错误之处。如有疑问,请查阅文末参考资料或与我线上/线下讨论。

目录:

  1. Calico架构
  2. Calico 数据路径——路由与iptables

一、Calico架构

img

  • Felix 跑在每个节点上,负责配置路由、ACL、向etcd宣告状态等;
  • Orchestrator plugin 适配不同架构的插件;
  • etcd 主要负责网络元数据一致性,确保Calico网络状态的准确性;
  • BGP Client (BIRD) 负责把 Felix 写入Kernel的路由信息 分发到整个 Calico网络,确保 workload 连通;
  • BGP Route Reflector (BIRD) BGP路由反射器,大规模部署时使用,通过一个或者多个BGP Route Reflector来完成集中式的路由分发。

img

通过将整个互联网的可扩展 IP 网络原则压缩到数据中心级别,Calico 在每一个计算节点利用 Linux kernel 实现了一个高效的 vRouter 来负责数据转发,每个vRouter通过BGP协议负责把自己上运行的 workload 的路由信息向整个 Calico 网络传播。

这样保证最终所有的 workload 之间的数据流量都是通过 IP 包的方式完成互联的。

calico的各个组件通过操作linux 路由表、iptables等来控制数据包的流向,本身不接触数据包。即使停掉calico组件,只要路由表记录还在,便不影响容器通信

img

特别地,在 kubernetes 架构中,当 calico 作为策略和网络组件时,实际运行了两类容器:

$ kubectl get po -n kube-system |grep calico

calico-kube-controllers-5f6db94794-cmqs4      1/1       Running   1          74d
calico-node-k92qh                             1/1       Running   1          74d
calico-node-lt7sn                             1/1       Running   1          74d
calico-node-qh596                             1/1       Running   1          74d
calico-node-wt8n9                             1/1       Running   1          74d

在每个节点上运行的calico-node 的pod,pod 内部实际上运行了如下进程:

1579073471763