写点什么

40 K8S 之 Calico 网络插件

  • 2021 年 12 月 10 日
  • 本文字数:1312 字

    阅读完需:约 4 分钟

40 K8S之Calico网络插件

Calico 是一个三层的虚拟网络解决方案,它把每个节点都当作虚拟路由器(vRouter),并把每个节点上的 Pod 都当作是“节点路由器”后的一个终端设备并为其分配一个 IP 地址。各节点路由器通过 BGP 协议学习生成路由规则,从而实现不同节点上 Pod 间的互联互通。


Calico 把 Kubernetes 集群环境中的每个节点上的 Pod 所组成的网络视为一个自治系统,而每个节点也就自然由各自的 Pod 对象组成虚拟网络,进而形成自治系统的边界网关。各节点间通过 BGP 协议交换路由信息并生成路由规则。但考虑到并非所有网络都能支持 BGP,而且 BGP 路由模型要求所有节点必须要位于同一个二层网络,Calico 还支持基于 IPIP 和 VXLAN 的 Overlay 网络模型,它们的工作模式与 Flannel 的 VXLAN 和 IPIP 模型并无显著不同。


Calico 的系统组件主要有 FelixBGP 路由反射器编排系统插件BIRD etcd 存储系统等。

BGP 模式下的 Calico 所承载的各 Pod 资源直接基于 vRouter 经由基础网络进行互联,它非叠加、无隧道、不使用 VRF 表,也不依赖于 NAT,因此每个工作负载都可以直接配置使用公网 IP 接入互联网,当然,也可以按需使用网络策略控制它的网络连通性。


Calico 在每一个计算节点利用 Linux 内核实现了一个高效的 vRouter(虚拟路由器)进行报文转发。每个 vRouter 通过 BGP 协议将自身所属节点运行的 Pod 资源的 IP 地址信息,基于节点上的专用代理程序(Felix)生成路由规则向整个 Calico 网络内传播。


与 Kubernetes 集群整合时,Calico 需要配置 calico-node calico-kube-controllers 两个重要组件。

calico/node:Calico 在 Kubernetes 集群每个节点运行的节点代理,负责提供 felix、bird4、bird6 和 confd 等守护进程。

calico/kube-controllers:Calico 运行在 Kubernetes 之上的自定义控制器,也是 Calico 协同 Kubernetes 的插件。


Calico 有两种部署方式:一种是让 calico/node 独立运行在 Kubernetes 集群之外,但 calico/kube-controllers 依然需要以 Pod 资源形式运行在集群之上;另一种是以 CNI 插件方式配置 Calico,使 Calico 完全托管运行在 Kubernetes 集群之上,类似于前面曾经部署托管 Flannel 网络插件的方式。


Calico 默认启用的是基于 IPIP 隧道的 Overlay 网络,因而它会在所有流量上使用 IPIP 隧道而不是 BGP 路由。Calico 分配的地址池需要与 Kubernetes 集群的 Pod 网络的定义保持一致


工作在 IPIP 模式的 Calico 会在每个节点上创建一个 tunl0 接口作为隧道出入口来封装 IPIP 隧道报文。Calico 会为每一个 Pod 资源创建一对 veth 设备,其中一端作为 Pod 的网络接口,另一端(名称以 cali 为前缀,后跟随机字串)留置在节点的根网络名称空间,它未使用风格模式,因而并未关联成为任何虚拟网桥设备的从接口。

Calico 项目提供的专用客户端工具 calicoctl 能够直接与 Calico Datastore 进行交互,用于管理 Calico 系统抽象出的各种资源,通过资源管理实现查看、修改或配置 Calico 系统特性。我们可以基于特定的 Pod 来提供 calicoctl 工具程序,也可直接将相关的二进制程序部署在管理节点之上,例如管理员运行 kubectl 工具的主机等。


一般来说,仅在那些不支持用户自定义 BGP 配置的网络中才会完全使用 IPIP 或 VXLAN 隧道网络,对于自主可控且规模较大的网络环境,非常有必要启用 BGP 降低网络开销以提升传输性能。对于 Calico 来说,修改 ipPool 属性相应的配置便可调整使用的网络类型。


发布于: 2 小时前阅读数: 8
用户头像

InfoQ签约作者 2018.11.30 加入

热爱生活,收藏美好,专注技术,持续成长

评论

发布
暂无评论
40 K8S之Calico网络插件