文档详情

Kubernetes网络方案与容器优化设计.docx

发布:2018-02-15约5.56千字共16页下载文档
文本预览下载声明
Kubernetes网络方案与容器优化设计高可用架构微信号 ArchNotes功能介绍 高可用架构公众号。导读:本文通过介绍美图线上容器化的实践经验,包括线上遇到的实际问题,来探讨 Kubernetes 环境下的网络方案设计。值得正在转型 K8S 的架构师学习和借鉴。目前,我们的 Kubernetes 集群选择使用 Calico 作为基础网络方案。选择 Calico 网络方案的挑战Calico 是一套基于路由(BGP)的 SDN,它通过路由转发的方式实现容器的跨主机通信。Calico 将每个节点虚拟为一个“路由器”并为之分配独立的虚拟网段,该路由器为当前节点上的容器提供路由服务。更多 Calico 项目介绍可参阅?/ 下面以具体网络为例介绍其中的设计与难点。以上图为例,如果节点 分配的虚拟网段是 /24,其上运行了一个容器 ,其路由信息如下: 55 UH 0 0 0 cali814214d5913当物理机收到目标地址为 的IP 数据包时会转发到网口? cali814214d5913,而 cali814214d5913 是通过 veth-pair 创建的网卡,它与本机上 IP 地址为 的容器互通,因此,IP 地址为 容器就可以收到相应的 IP 数据包。当位于节点 上的容器 给 发送 IP 数据包时,需要知道 所在的物理节点的 IP,并添加以下路由规则:/16 eth0Calico 通过 BGP 实现节点间相互学习路由规则。节点 与节点 建立 BGP 邻居,节点 可以通过 BGP 学习到上面的路由规则。当容器 发送 IP 数据包给 时,会根据上面的路由规则转发到节点 ,并由节点 192.168.12 转发给 ,进而实现容器的跨主机通信。但是当两个容器所在的节点处于不同的子网时,如,其所在的节点与节点处于不同的子网,此时无法在上添加以下路由:/16 eth0这是因为物理机 与物理机 链路层不通。为了解决这个问题,Calico 选择了 IPIP。IPIP 是将虚拟网络的 IP 数据包封装到物理网络的 IP 数据包里传输。启用 IPIP 后,节点上会出现相应的虚拟网卡,通常是 tunl0,节点1 可以添加以下路由规则:/16 tunl0与之前的路由的区别在网口换成了 tunl0。当 发送 IP 数据包给 时,其所在的节点会将 IP 数据包转发到网口 tunl0,转发到 tunl0 的 IP 数据包会被 IPIP 驱动接管。IPIP 驱动会将每个 IP 数据包封装到物理网络的 IP 数据包内(目标地址是下一跳地址,即 ,Payload 是虚拟机发出的原始 IP 数据包)发送出去。由于该 IP 数据包的目标地址是节点 ,因此,可以经过物理网关进行转发。运行在节点 上 IPIP 服务接收到该物理网络 IP 数据包后将其 Payload 取出,再根据节点 上路由规则转发给相应的容器,进而实现了容器的跨子网通信。Calico 网络方案存在的问题通过 Calico 的工作原理可以看出,Calico 存在以下问题:使用 IPIP 时,需要嵌套 IP 协议,多余的打包和拆包动作会带来的性能开销。使用 IPIP 时,嵌套的 IP 协议头导致实际有效的 MTU 长度变小,也会影响实际的带宽利用率。由于集群外的节点无法学习集群内的路由信息,故无法直接访问集群内的容器。根据 Calico 的工作原理可知,Calico 为了解决容器的跨子网通信选择了 IPIP,也正是因为引入了 IPIP 才引发了一系列的性能问题,那么,为什么 Calico 会选择 IPIP 协议呢?为了理解这个问题,我们先看一下传统的物理网络是如何解决跨子网通信的。仍以上图为例,物理机 访问物理机 的步骤如下:物理机 检测到目标 IP 与自己处于不同的子网,因此,通过默认路由规则发送给其所在网关 。物理网关 通过路由协议可以知道网关 可以转发 IP 包给物理 ,因此,将相应的 IP 包转发给网关 。物理网关 再将 IP 包转发给物理机 。我们再来看一下 Calico 网络。如果没有 IPIP,容器 访问容器 的步骤如下:宿主机 检测到目标 IP 与自己处于不同的子网,因此,会将目标地址为 的 IP 包转发给其所在网关 。网关 没有匹配的路由规则,因此 drop 该 IP 包并会返回目标不可达。如果引入 IPIP,容器 访问容器 的步骤如下:宿主机 匹配到路由规则 “/16 tunl0”。宿主机 将该容器发出的 IP 包通过 tunl0 端口转发到物理机。IPIP 驱动将容器发出的 IP 包(目标地址 )作为物理网络 IP 包(目标地址 )的 Payload 发出。宿主机 按照物理网络的传输方式将物理网络 IP 包发送到宿主
显示全部
相似文档