天天看点

#yyds干货盘点#K8S-Calico 网络插件

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

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

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

#yyds干货盘点#K8S-Calico 网络插件

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 为前缀,后跟随机字串)留置在节点的根网络名称空间,它未使用风格模式,因而并未关联成为任何虚拟网桥设备的从接口。

#yyds干货盘点#K8S-Calico 网络插件

继续阅读