网络模型与网络策略
VXLAN
vxlan 是属于 overlay 中的一种隧道封装技术,实际上将 L2(数据链路层)的以太网帧封装成 L4(传输层)的 UDP 数据报文,然后在 L3 网络层传输,最终实现的效果就类似于在 L2 的以太网传输报文一样,但是不受 L3 网络层限制
1 | 为什么是在L3传输? |
vxlan 标志位有 24 位,可以划分 2^24 个虚拟局域网
1 | 1. 感觉封装UDP是多余的,只靠IP也能通信 |
网络模型
docker 的网络模型
- Bridge:桥接
- Host:主机
- Container:容器
kubernetes 网络模型
kubernetes 的网络模型主要用于解决四类通信需求
Pod 内通信
命名空间:linux 底层概念,在内核层实现,容器使用 namespce 技术实现容器间相互隔离
- mnt namespace:隔离根,即 chroot 技术
- ipc namespace:隔离进程间通信
- uts namespace:隔离系统信息,主机名等信息
- pid namespace:隔离进程号
- net namespace:隔离网络
- user namespce:隔离用户
运行在同一个 pod 内的容器,共享 net、ipc、uts、一组存储卷,亲密关系,同进同退

Pod 间通信 ★★★
网络模型:所有 Pod 在一个平面网络中,每个 Pod 拥有一个集群全局唯一的地址,可直接与其他 Pod 通信
k8s 设计了网络模型,但将其实现交给网络插件,主流的网络插件有:flannel、calico、kube-router 等
flannel
早期版本的 Flannel 使用 UDP 封装完成报文的跨越主机转发,其安全性及性能略有不足,现在已经废弃这种方式了,现在只能通过 vxlan 或 host-gw 进行通信
flannel VXLAN 后端:
flannel VXLAN Direct Routing 后端:
Directrouting 为在同一个二层网络中的 node 节点启用直接路由机制,类似于 host-gw 模式
host-gw 后端:
类似 calico,通过路由表完成报文转发
calico
Calico 本身是一个三层的虚拟网络方案,它将每个节点都当作路由器(router),将每个节点的容器都当作是“节点路由器”的一个终端并为其分配一个 IP 地址,各节点路由器通过BGP(BorderGateway Protocol)学习生成路由规则,从而将不同节点上的容器连接起来

BGP 是互联网上一个核心的去中心化自治路由协议,性能非常高,需要物理路由器的支持,这也是公有云不提供 calico 的原因,因为公有云上节点连接的都是虚拟路由器
calico 核心组件:
- Felix:calico 的 agent,维护路由规则、汇报当前节点状态
- Etcd:路由规则储存在 etcd
- BGP Client:运行在每个 node 上,负责监听由 felix 生成的路由信息,然后通过 BGP 协议广播至其他 node 节点,其他 node 的 Felix 会自动更新路由规则,从而实现路由的相互学习
- Route Reflector:集中式的路由反射器,维护全网的路由规则,替换路由广播,如果节点非常多,可以考虑使用
BGP 模式下 calico 的通信过程:
1 | # traceroute命令查看请求ip为10.10.74.193的pod |
如果 node 需要跨网段通信,Calico 也提供了IPIP模式,IPIP 模式下,calico 会在每个节点上创建一个 tunl0 接口(TUN 类型虚拟设备)用于封装三层隧道报文。节点上每创建一个 Pod 资源,都自动创建一对虚拟以太网接口(TAP 类型的虚拟设备),其中一个附加于 Pod 的网络名称空间,另一个(名称以 cali 为前缀后跟随机字串)留置在节点的根网络名称空间,并经由 tunl0 封装或解封三层隧道报文,Calico IPIP 模式如下图:

IPIP 模式下 calico 的通信过程:
1 | / $ traceroute 10.10.58.65 # 请求ip为10.10.58.65的pod |
BGP 模式则直接使用物理机作为虚拟路由路(vRouter),请求直接通过路由跳转,不再创建额外的 tunnel,没有 tunnel 封装、解封的步骤,所以 BGP 的性能会比 IPIP 高很多,建议禁用 IPIP
Service 与 Pod 通信
集群外部与 Service 通信
请求流量首先到达外部负载均衡器,由其调度至某个工作节点之上,而后再由工作节点的 netfilter(kube-proxy)组件上的规则(iptables 或 ipvs)调度至某个目标 Pod 对象
集群外的流量先进入节点网络,再进入service 网络,最后进入pod 网络
网络策略
网络策略(Network Policy)是用于控制分组的 Pod 资源彼此之间如何进行通信,以及分组的 Pod 资源如何与其他网络端点进行通信的规范。它用于为 Kubernetes 实现更为精细的流量控制,实现租户隔离机制。Kubernetes 使用标准的资源对象“NetworkPolicy”供管理员按需定义网络访问控制策略
Kubernetes 的网络策略功能由其所使用的网络插件实现,Calico、Canal 及 kube-router 支持网络策略,而 flannel 不支持