网络模型与网络策略

本文最后更新于:2023年12月5日 晚上

VXLAN

vxlan 是属于 overlay 中的一种隧道封装技术,实际上将 L2(数据链路层)的以太网帧封装成 L4(传输层)的 UDP 数据报文,然后在 L3 网络层传输,最终实现的效果就类似于在 L2 的以太网传输报文一样,但是不受 L3 网络层限制

为什么是在L3传输?
因为传输是基于路由表,路由只涉及ip,不涉及端口

vxlan 标志位有 24 位,可以划分 2^24 个虚拟局域网

1. 感觉封装UDP是多余的,只靠IP也能通信
因为Vxlan的封装思维是将原始数据报文当做用户数据包,VTEP当做大二层接入,那么VTEP会依次进行传输层封装,网络层封装,以太网头部封装,如果直接进行IP封装则跳过了传输层的封装过程,会在传输的过程中遇到一些困难,很多数据中心里都会有大量的冗余链路,交换机面对多条等价路径时会进行基于五元组进行HASH,此时会出现问题;其次,在遇到NAT设备时,无法穿透也会造成影响

2. 为什么封装成UDP,而不是TCP
因为封装UDP开销比较小,至于TCP比UDP更可靠,但是依靠原始数据报文的TCP也可以实现可靠性的要求

网络模型

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 的通信过程:

# traceroute命令查看请求ip为10.10.74.193的pod
/ $ traceroute 10.10.74.193
traceroute to 10.10.74.193 (10.10.74.193), 30 hops max, 46 byte packets
 1  10.0.1.32 (10.0.1.32)  0.005 ms  0.006 ms  0.002 ms  # 当前pod所在节点的ip
 2  10.0.1.33 (10.0.1.33)  1.220 ms  0.254 ms  0.147 ms  # 对方pod所在节点的ip
 3  10.10.74.193 (10.10.74.193)  0.207 ms  0.308 ms  0.163 ms # 对方pod的ip

如果 node 需要跨网段通信,Calico 也提供了IPIP模式,IPIP 模式下,calico 会在每个节点上创建一个 tunl0 接口(TUN 类型虚拟设备)用于封装三层隧道报文。节点上每创建一个 Pod 资源,都自动创建一对虚拟以太网接口(TAP 类型的虚拟设备),其中一个附加于 Pod 的网络名称空间,另一个(名称以 cali 为前缀后跟随机字串)留置在节点的根网络名称空间,并经由 tunl0 封装或解封三层隧道报文,Calico IPIP 模式如下图:

IPIP 模式下 calico 的通信过程:

/ $ traceroute 10.10.58.65  # 请求ip为10.10.58.65的pod
traceroute to 10.10.58.65 (10.10.58.65), 30 hops max, 46 byte packets
 1  172.31.6.210 (172.31.6.210)  0.004 ms  0.004 ms  0.002 ms # 当前pod所在node地址
 2  10.10.58.64 (10.10.58.64)  0.003 ms  0.432 ms  0.497 ms # 对方pod所在node的tunl0地址
 3  10.10.58.65 (10.10.58.65)  0.553 ms  2.114 ms  0.775 ms # 对方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 不支持


网络模型与网络策略
http://blog.lujinkai.cn/运维/Kubernetes/网络模型与网络策略/
作者
像方便面一样的男子
发布于
2021年3月12日
更新于
2023年12月5日
许可协议