K8S集群网络

本文深入探讨了Kubernetes网络模型,包括Docker容器网络、Pod网络、CNI和K8S网络组件Flannel与Calico的工作原理。重点介绍了Flannel的VXLAN和host-gw模式,以及Calico的BGP模式和RR模式,揭示了它们在网络通信中的角色和优缺点。
摘要由CSDN通过智能技术生成

一 网络基础知识

1.1 交换技术

在这里插入图片描述
交换技术指局域网进行网络划分之后,解决网络通信问题的一种技术。分为二层交换、三层交换、多层交换等等。

  • 二层交换:一个局域网内部,数据包通过arp协议进行传输的网络技术。
    • 服务器通过arp协议获取mac地址,封装成数据帧进行数据传递
    • 每个服务器都有arp缓存表,用来缓存局域网内的ip、mac条目,当交换机找不到目标ip的mac时,会通过arp协议进行广播,被广播的区域称为广播域,通常一个相同网段的虚拟局域网是一个广播域。
  • 三层交换:引入路由表的交换机,称为路由器,解决不同网段进行通信的问题,比如上面三个不同网段的服务器(三个vlan),需要通过路由器进行相互通信

1.2 路由技术在这里插入图片描述

路由器主要分为两个端口类型:LAN口和WAN口

  • WAN口:配置公网IP,接入到互联网,转发来自LAN口的IP数据包。
  • LAN口:配置内网IP(网关),连接内部交换机。

路由器是连接两个或多个网络的硬件设备,将从端口上接收的数据包,根据数据包的目的地址智能转发出去。

路由器的功能:

  • 路由
  • 转发
  • 隔离子网
  • 隔离广播域

路由器是互联网的枢纽,是连接互联网中各个局域网、广域网的设备,相比交换机来说,路由器的数据转发很复杂,它会根据目的地址给出一条最优的路径。那么路径信息的来源有两种:动态路由和静态路由。

静态路由: 指人工手动指定到目标主机的地址然后记录在路由表中,如果其中某个节点不可用则需要重新指定。

动态路由:则是路由器根据动态路由协议自动计算出路径永久可用,能实时地适应网络结构的变化。

常用的动态路由协议:

  • RIP( Routing Information Protocol ,路由信息协议)
  • OSPF(Open Shortest Path First,开放式最短路径优先)
  • BGP(Border Gateway Protocol,边界网关协议)

1.3 OSI七层模型

OSI(Open System Interconnection)是国际标准化组织(ISO)制定的一个用于计算机或通信系统间互联的标准体系,一般称为OSI参考模型或七层模型。

层次 名称 功能 协议数据单元(PDU) 常见协议
7 应用层 为用户的应用程序提供网络服务,提供一个接口。 数据 HTTP、FTP、Telnet
6 表示层 数据格式转换、数据加密/解密 数据单元 ASCII
5 会话层 建立、管理和维护会话 数据单元 SSH、RPC
4 传输层 建立、管理和维护端到端的连接 段/报文 TCP、UDP
3 网络层 IP选址及路由选择 分组/包 IP、ICMP、RIP、OSPF
2 数据链路层 硬件地址寻址,差错效验等。 ARP、WIFI
1 物理层 利用物理传输介质提供物理连接,传送比特流。 比特流 RJ45、RJ11

在这里插入图片描述

1.4 TCP/UDP

TCP(Transmission Control Protocol,传输控制协议),面向连接协议,双方先建立可靠的连接,再发送数据。适用于传输数据量大,可靠性要求高的应用场景。

UDP(User Data Protocol,用户数据报协议),面向非连接协议,不与对方建立连接,直接将数据包发送给对方。适用于一次只传输少量的数据,可靠性要求低的应用场景。相对TCP传输速度快。

二 K8S网络模型

Kubernetes 要求所有的网络插件实现必须满足如下要求:

  • 一个Pod一个IP
  • 所有的 Pod 可以与任何其他 Pod 直接通信,无需使用 NAT 映射
  • 所有节点可以与所有 Pod 直接通信,无需使用 NAT 映射
  • Pod 内部获取到的 IP 地址与其他 Pod 或节点与其通信时的 IP 地址是同一个。

2.1 Docker容器网络模型

先看下Linux网络名词:

  • 网络的命名空间: Linux在网络栈中引入网络命名空间,将独立的网络协议栈隔离到不同的命令空间中,彼此间无法通信;Docker利用这一特性,实现不同容器间的网络隔离。
  • Veth设备对: Veth设备对的引入是为了实现在不同网络命名空间的通信。
  • Iptables/Netfilter: Docker使用Netfilter实现容器网络转发。
  • 网桥: 网桥是一个二层网络设备,通过网桥可以将Linux支持的不同的端口连接起来,并实现类似交换机那样的多对多的通信。
  • 路由: Linux系统包含一个完整的路由功能,当IP层在处理数据发送或转发的时候,会使用路由表来决定发往哪里。

Docker容器网络示意图如下:
在这里插入图片描述

2.2 Pod 网络

问题: Pod是K8S最小调度单元,一个Pod由一个容器或多个容器组成,当多个容器时,怎么都用这一个Pod IP?

实现: k8s会在每个Pod里先启动一个infra container小容器,然后让其他的容器连接进来这个网络命名空间,然后其他容器看到的网络试图就完全一样了。即网络设备、IP地址、Mac地址等。这就是解决网络共享的一种解法。在Pod的IP地址就是infra container的IP地址。
在这里插入图片描述
在 Kubernetes 中,每一个 Pod 都有一个真实的 IP 地址,并且每一个 Pod 都可以使用此 IP 地址与 其他 Pod 通信。

Pod之间通信会有两种情况:

  • 两个Pod在同一个Node上
  • 两个Pod在不同Node上

先看下第一种情况:两个Pod在同一个Node上

同节点Pod之间通信道理与Docker网络一样的,如下图:
在这里插入图片描述

  1. 对 Pod1 来说,eth0 通过虚拟以太网设备(veth0)连接到 root namespace;
  2. 网桥 cbr0 中为 veth0 配置了一个网段。一旦数据包到达网桥,网桥使用ARP 协议解析出其正确的目标网段 veth1;
  3. 网桥 cbr0 将数据包发送到 veth1;
  4. 数据包到达 veth1 时,被直接转发到 Pod2 的 network namespace 中的 eth0 网络设备。

再看下第二种情况:两个Pod在不同Node上

K8S网络模型要求Pod IP在整个网络中都可访问,这种需求是由第三方网络组件实现。
在这里插入图片描述

2.3 CNI(容器网络接口)

CNI(Container Network Interface,容器网络接口):是一个容器网络规范,Kubernetes网络采用的就是这个CNI规范,CNI实现依赖两种插件,一种CNI Plugin是负责容器连接到主机,另一种是IPAM负责配置容器网络命名空间的网络。

CNI插件默认路径:

# ls /opt/cni/bin/

地址:https://github.com/containernetworking/cni

当你在宿主机上部署Flanneld后,flanneld 启动后会在每台宿主机上生成它对应的CNI 配置文件(它其实是一个 ConfigMap),从而告诉Kubernetes,这个集群要使用 Flannel 作为容器网络方案。

CNI配置文件路径:

/etc/cni/net.d/10-flannel.conflist

当 kubelet 组件需要创建 Pod 的时候,先调用dockershim它先创建一个 Infra 容器。然后调用 CNI 插件为 Infra 容器配置网络。

这两个路径在kubelet启动参数中定义:

 --network-plugin=cni \
 --cni-conf-dir=/etc/cni/net.d \
 --cni-bin-dir=/opt/cni/bin

三 Kubernetes网络组件之 Flannel

Flannel是CoreOS维护的一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值