Kubernetes网络模型本身对某些特定的网络功能有一定要求,但在实现方面也具有一定的灵活性。业界已经有不少不同的网络方案,来满足特定的环境和要求。

CNI(container network interface)是容器网络接口,它是一种标准设计和库,为了让用户在容器创建或者销毁时都能够更容易的配置容器网络。

目前比较流行的CNI插件:Flannel、Calico、Weave、Canal(技术上是多个插件的组合)。这些插件即可以确保满足Kubernetes的网络要求,又能为kubernetes集群管理员提供他们所需的某些特定的网络功能。

背景

容器网络是容器选择连接到其他容器、主机和外部网络(如Internet)的机制。容器的runtime提供了各种网络模式,每种模式都会产生不同的效果。例如,Docker默认情况下可以为容器配置以下网络:

  • none:将容器添加到一个容器专门的网络堆栈中,没有对外连接。
  • host:将容器添加到主机的网络堆栈中,没有隔离。
  • default bridge:默认网络模式。每个容器可以通过IP地址互相连接。
  • 自定义网桥:用户定义的网桥,具有更多的灵活性、隔离性和其他便利功能。

Docker还可以让用户通过其他驱动程序和插件,来配置更高级的网络(包括多主机覆盖网络)。

CNI(https://github.com/containernetworking/cni/blob/master/SPEC.md) 的初衷是创建一个框架,用于在配置或销毁容器时动态配置适当的网络配置和资源。CNI 规范中用于配置网络的插件接口,可以让容器运行时与插件进行协调,具体机制如下:

  • 插件负责为接口配置和管理IP地址,并且同于提供与IP管理、每个容器的IP分配、以及多主机连接相关的功能。
  • 容器运行时会调用网络插件,从而在容器启动时分配IP地址并配置网络策略,并在删除容器时再次调用插件以清理这些资源。
  • 在Kubernetes中,kubelet可以在适当的时间调用插件,来为通过kubelet启动的pod进行自动的网络配置。

术语

  • VXLAN:代表“虚拟可扩展LAN”。首先,VXLAN用于通过在UDP数据报中封装第2层以太网帧来帮助实现大型云部署。VXLAN虚拟化与VLAN类似,但提供更大的灵活性和功能(VLAN仅限于4096个网络ID)。VXLAN是一种封装和覆盖协议,可在现有网络上运行。
  • Overlay网络:Overlay网络是建立在现有网络之上的虚拟逻辑网络。Overlay网络通常用于在现有网络之上提供有用的抽象,并分离和保护不同的逻辑网络。
  • 网状网格:网状网络(Mesh network)是指每个节点连接到许多其他节点以协作路由、并实现更大连接的网络。网状网络允许通过多个路径进行路由,从而提供更可靠的网络。网状网格的缺点是每个附加节点都会增加大量开销。
  • BGP(Border Gateway Protocol):即"边界网关协议",用于管理边缘路由器之间数据包的路由方式。BGP通过考虑可用路径,路由规则和特定网络策略,帮助弄清楚如何将数据包从一个网络发送到另一个网络。

原理

要实现跨虚拟机的容器之间的网络,有几种可能的办法:

  • 容器的IP就是二层网络里分配的IP,这样容器相当于二层网络里的节点,那么就可以天然互访;
  • 容器的IP与node的IP不属于同一个网段,node上配置个到各个网段的路由(指向对应容器网段所部属的node IP),通过路由实现互访[flannel host-gw, calico bgp均是通过此方案实现];
  • 容器的IP与node的IP不属于同一个网段,node上有服务对容器发出的包进行封装,对发给容器的包进行解封。封装后的包通过node所在的网络进行传输。解封后的包通过网桥或路由直接发给容器,即overlay网络。[flannel udp/vxlan,calico ipip,openshift-sdn均通过此方案实现]

CNI 插件

Flannel(只能提供网络通讯,不提供网络策略)

链接:https://github.com/coreos/flannel

由CoreOS开发的项目Flannel,是最直接和最受欢迎的CNI插件。它是容器编排系统中最成熟的网络结构示例之一,旨在实现更好的容器间和主机间网络。

特点:

  1. 相对容易安装和配置。它被打包为单个二进制文件flanneld,许多常见的Kubernetes集群部署工具和许多Kubernetes发行版都可以默认安装Flannel。

  2. Flannel可以使用Kubernetes集群的现有etcd集群来使用API存储其状态信息,因此不需要专用的数据存储。
  3. Flannel配置第三层IPv4 overlay网络。它会创建一个大型内部网络,跨越集群中每个节点。在此overlay网络中,每个节点都有一个子网,用于在内部分配IP地址。在配置pod时,每个节点上的Docker桥接口都会为每个新容器分配一个地址。同一主机中的Pod可以使用Docker桥接进行通信,而不同主机上的pod会使用flanneld将其流量封装在UDP数据包中,以便路由到适当的目标。
  4. 主要是提供主机和pod之间的网络链接。

Calico

链接:https://github.com/projectcalico/cni-plugin

Calico以其性能、灵活性而闻名。

特点:

  1. Clico的功能更为全面,不仅提供主机和pod之间的网络链接,还涉及网络安全和管理。
  2. Calico CNI插件在CNI框架内封装了Calico的功能。
  3. Calico不使用overlay网络,而是配置第三层网络(网络层,IPv4、IPv6、ICMP)【更底层】。该网络使用BGP路由协议在主机之间路由数据包。这意味着在主机之间传输的时候,不需要将数据包包装在额外的封装层中。传输效率更高,有性能优势。
  4. 故障排查更方便。使用calico,标准调试工具可以访问与简单环境中相同的信息,从而使更多开发人员、管理人员更容易理解行为。
  5. 具有先进的网络功能:
    1. 网络策略
    2. 还可以与服务网格Istio集成,

canal

链接:https://github.com/projectcalico/canal

Canal是Flannel和Calico的组合:

  1. 网络层用的是Flannel提供的简单overlay,可以在许多不同的部署环境中运行且无需额外的配置。
  2. 网络策略方面,Calico强大的网络规则评估,为基础网络提供了更多补充,从而提供了更多安全性和控制。

Weave

链接:https://www.weave.works/oss/net/

weave是Weaveworks提供的一种Kubernetes CNI网络选项。

特点:

  1. 智能路由 Weave在集群中的每个节点之间创建overlay网络,参与者可以灵活路由。——Weave可以智能路由。

    工作原理:

    为了创建网络,weave依赖于网络中每台主机上安装的路由组件。然后,这些路由器交换拓扑信息,以维护可用网络环境的最新试图。 当需要将流量发送到位于不同节点上的pod时,weave路由组件会自动决定是通过"快速数据路径"发送,还是回退到"sleeve"分组转发的方法。

  2. 与Calico一样,Weave也为Kubernetes集群提供网络策略功能。

  3. 对整个网络的简单加密。Weave可以使用NaCI加密(http://nacl.cr.yp.to)来为sleeve流量自动加密所有路由流量;使用IPsec ESP来加密快速数据路径流量。

详细资料:https://www.sohu.com/a/304555150_618296

k8s CNI插件简单了解的更多相关文章

  1. 浅谈K8S cni和网络方案

    此文已由作者黄扬授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 在早先的k8s版本中,kubelet代码里提供了networkPlugin,networkPlugin是一组接 ...

  2. 第26 章 : 理解 CNI 和 CNI 插件

    理解 CNI 和 CNI 插件 本文将主要分享以下几方面的内容: CNI 是什么? Kubernetes 中如何使用 CNI? 哪个 CNI 插件适合我? 如何开发自己的 CNI 插件? CNI 是什 ...

  3. kubernetes/k8s CNI分析-容器网络接口分析

    关联博客:kubernetes/k8s CSI分析-容器存储接口分析 kubernetes/k8s CRI分析-容器运行时接口分析 概述 kubernetes的设计初衷是支持可插拔架构,从而利于扩展k ...

  4. CNI插件编写框架分析

    概述 在<CNI, From A Developer's Perspective>一文中,我们已经对CNI有了较为深入的了解.我们知道,容器网络功能的实现最终是通过CNI插件来完成的.每个 ...

  5. CNI插件实现框架---以loopback为示例

    以最简单的loopback插件作为实例,来分析CNI plugin的执行流程 // cni/plugins/loopback/loopback.go 1.func main() main函数只是简单地 ...

  6. CNI插件源码示例,对于github.com/rajatchopra/ocicni库的分析

    CNI插件初始化 // ocicni.go 1.func InitCNI(pluginDir string) (CNIPlugin, error) (1).先调用plugin := probeNetw ...

  7. 【 VS 插件开发 】三、Vs插件简单功能的实现

    [ VS 插件开发 ]三.Vs插件简单功能的实现

  8. k8s原来这么简单(一)核心组件与工作原理

     k8s官方文档:https://kubernetes.io/zh/docs/home/ 前提 掌握容器技术:Docker,Containerd等 K8S优势 使用简单,少量人/小团队可以轻松维护大型 ...

  9. Kubernetes(k8s)网络插件(CNI)的基准测试对比

      Kubernetes是一个伟大的容器"乐队".但它不管理Pod-to-Pod通信的网络.这是容器网络接口(CNI)插件的使命,它是实现容器集群工具(Kubernetes,Mes ...

随机推荐

  1. [CCPC2019 ONLINE]H Fishing Master

    题意 http://acm.hdu.edu.cn/showproblem.php?pid=6709 思考 先考虑所有鱼的烹饪时间小于k的情况.将T从大到小排序后,煮一条鱼相当于将其时间补齐至k. 由于 ...

  2. GIMP(Linux下的Photoshop),Centos7下安装过程

    点当然是上官网:https://www.gimp.org/ 这英语看不懂,果断用谷歌的网页翻译. 点下载,就会有 看到这个,就点 下载一个安装的包 用命令行打上 [root@localhost 下载] ...

  3. Shell常用命令之yum

    介绍 yum命令是在Fedora和RedHat以及SUSE中基于rpm的软件包管理器,它可以使系统管理人员交互和自动化地更细与管理RPM软件包,能够从指定的服务器自动下载RPM包并且安装,可以自动处理 ...

  4. parzen 窗的matlab实现

    用一下程序简单实现使用parzen窗对正态分布的概率密度估计: (其中核函数选用高斯核) %run for parzen close all;clear all;clc; x=normrnd(0,1, ...

  5. vuex之getter(二)

    说明 使用vue,如果想对data数据派生一些状态,我们就用到计算属性或者侦听器,同样vux想要派生state中的一些状态,可以在store中定义一个getters属性,它相当于state的计算属性. ...

  6. k8s注册节点提示Docker SystemdCheck]: detected cgroupfs" as the Docker cgroup dr iver. The r ecommended dr fiver is" systemd"

    本篇就不长篇大论了,直接附上解决办法 提示如上,此提示非必要要求,只是建议,但是看着不爽,那就解决它 这是未解决之前的docker信息,现在输入下面的指令 sudo echo -e "{\n ...

  7. 温故知新,.NET 重定向深度分析

    在早期的.NET Framework程序员心里,重定向Redirect其实分为两种: Response.Redirect: Response对象的Redirect方法提供了一种实现客户端重定向的方法 ...

  8. SpringBoot图文教程「概念+案例 思维导图」「基础篇上」

    有天上飞的概念,就要有落地的实现 概念+代码实现是本文的特点,教程将涵盖完整的图文教程,代码案例 每个知识点配套自测面试题,学完技术自我测试 本文初学向,所以希望文中所有的代码案例都能敲一遍 大哥大姐 ...

  9. POJ_1185_状态压缩dp

    http://poj.org/problem?id=1185 一次考虑两行,比一行略为复杂.sta保存每种状态炮兵位置,sum保存每种状态当行炮兵总数,a保存地形,dp[i][j][k]表示到第i行当 ...

  10. HDU_2571_DP

    http://acm.hdu.edu.cn/showproblem.php?pid=2571 简单dp,从上到下,从左到右依次更新每一格的最大幸运值. #include<iostream> ...