K8s 从懵圈到熟练 – 集群网络详解
作者 | 声东 阿里云售后技术专家
导读:阿里云 K8S 集群网络目前有两种方案:一种是 flannel 方案;另外一种是基于 calico 和弹性网卡 eni 的 terway 方案。Terway 和 flannel 类似,不同的地方在于 terway 支持 Pod 弹性网卡,以及 NetworkPolicy 功能。本文中,作者基于当前的 1.12.6 版本,以 flannel 为例,深入分析阿里云 K8S 集群网络的实现方法。
鸟瞰
集群网络搭建
初始阶段
集群阶段
节点阶段
-
第一个是集群通过 Cloud Controller Manager 给 VPC 配置路由表项。 路由表项对每个节点有一条,每一条的意思是,如果 VPC 路由收到的目的地址是某一个节点 podCIDR 的 IP 地址,那么路由会把这个网络包转发到对应的 ECS 上; -
第二个是创建虚拟网桥 cni0 以及与 cni0 相关的路由。 这些配置的作用是,从阶段外部进来的网络包,如果目的 IP 是 podCIDR,则会被节点转发到 cni0 虚拟局域网里。
Pod 阶段
通信
其中本地通信,说的是 Pod 内部,不同容器之间的通信。因为 Pod 内网容器之间共享一个网络协议栈,所以他们之间的通信,可以通过 loopback 设备完成;
同节点 Pod 之间的通信,是 cni0 虚拟网桥内部的通信,这相当于一个二层局域网内部设备通信;
跨节点 Pod 通信略微复杂一点,但也很直观,发送端数据包,通过 cni0 网桥的网关,流转到节点上,然后经过节点 eth0 发送给 VPC 路由。这里不会经过任何封包操作。当 VPC 路由收到数据包时,它通过查询路由表,确认数据包目的地,并把数据包发送给对应的 ECS 节点。而进去节点之后,因为 flanneld 在节点上创建了 cni0 的路由,所以数据包会被发送到目的地的 cni0 局域网,再到目的地 Pod;
最后一种情况,Pod 与非 Pod 网络的实体通信,需要经过节点上 iptables 规则做 SNAT,而此规则就是 flanneld 依据命令行 --ip-masq 选项做的配置。
总结
🔥
# 点下在看❤️
# 本周互动奖品是“淘宝心选 u 型枕”。