Kubernetes CNI 网络模型及常见开源组件

简介: 【4月更文挑战第13天】目前主流的容器网络模型是CoreOS 公司推出的 Container Network Interface(CNI)模型

随着容器技术在企业生产系统中的逐步落地,用户对容器云的网络特性要求也越来越高。跨主机容器间的网络互通已经成为基本要求,更高的要求包括容器固定 IP 地址、一个容器多个 IP 地址、多个子网隔离、ACL 控制策略、与 SDN 集成等。


目前主流的容器网络模型是CoreOS 公司推出的 Container Network Interface(CNI)模型。

1、CNI模型

CNI 是由 CoreOS 公司推出的一个容器网络规范。已采纳该规范的项目包括 Apache Mesos、Cloud Foundry、Kubernetes、Kurma 和 rkt。另外 Contiv Networking、Project Calico 和 Weave 这些项目也为 CNI 提供插件。


CNI 的规范比较小巧,它规定了一个容器 runtime 和网络插件之间的简单契约。这个契约通过 JSON 的语法定义了 CNI 插件所需要提供的输入和输出。


一个容器可以被加入到被不同插件所驱动的多个网络之中。一个网络有自己对应的插件和唯一的名称。CNI 插件需要提供两个命令:一个用来将网络接口加入到指定网络,另一个用来将其移除。这两个接口分别在容器被创建和销毁时被调用。


2、CNI Flow

容器 runtime 首先需要分配一个网络命名空间及一个容器 ID,然后连同一些 CNI 配置参数传给网络驱动。接着网络驱动会将该容器连接到网络,并将分配的 IP 地址以 JSON 的格式返回给容器 runtime。


目前,CNI 的功能涵盖了 IPAM、L2 和 L3。端口映射(L4)则由容器 runtime 自己负责。CNI 也没有规定端口映射的规则。


Network Policy 的主要功能是对 Pod 间的网络通信进行限制和准入控制,设置方式为将 Pod 的 Label 作为查询条件,设置允许访问或禁止访问的客户端 Pod 列表。目前查询条件可以作用于 Pod 和 Namespace 级别。


为了使用 Network Policy,Kubernetes 引入了一个新的资源对象 NetworkPolicy,供用户设置 Pod 间网络访问的策略。但仅定义一个网络策略是无法完成实际的网络隔离的,还需要一个策略控制器(Policy Controller)进行策略的实现。策略控制器由第三方网络组件提供,目前,Calico、Cilium、Kube-router、Romana、Weave Net 等开源项目均支持网络策略的实现。


3、主流开源组件

目前,已经有多个开源组件支持容器网络模型。常见的网络组件,包括 Flannel、Open vSwitch、直接路由和 Calico。


Flannel

Flannel 之所以可以搭建 k8s 依赖的底层网络,是因为它能实现以下两个功能。


(1)它能协助 k8s,给每一个 Node 上的 Docker 容器分配互相不冲突的 IP 地址。


(2)它能在这些 IP 地址之间建立一个覆盖网络(Overlay Network),通过这个覆盖网络,将数据包原封不动地传递到目标容器内。


Open vSwitch

Open vSwitch 是一个开源的虚拟交换软件,类似于 Linux 中的 Bridge,但是功能要复杂得多。Open vSwitch 的网桥可以直接建立多种通信通道(隧道),如 Open vSwitch with GRE/VxLAN。这些通道的建立可以很容易地通过 OVS 的配置命令实现。在 k8s、Docker 场景下,通常主要建立 L3 到 L3 的隧道。


直接路由

通过直接手动写路由的方式,以实现 Node 之间的网络通信功能。该直接路由配置方法的问题是,在集群节点发生变化时,需要手动维护每个 Node 上的路由表信息,效率很低。为了有效管理这些动态变化的网络路由信息,动态地让其他 Node 都感知到,需要使用动态路由发现协议来同步这些变化。


在实现这些动态路由发现协议的开源软件中,常用的有 Quagga、Zebra 等。


Calico

Calico 是容器网络的又一种解决方案,与其他虚拟网络最大的不同是,它没有采用 overlay 网络做报文的转发,提供了纯 3 层的网络模型。三层通信模型表示每个容器都通过 IP 直接通信,中间通过路由转发找到对方。


在这个过程中,容器所在的节点类似于传统的路由器,提供了路由查找的功能。要想路由能够正常工作,每个虚拟路由器(容器所在的主机节点)必须有某种方法知道整个集群的路由信息,Calico 采用的是 BGP 路由协议,其全称是 Border Gateway Protocol。


除了能用于容器集群平台 Kubernetes、共有云平台 AWS、GCE 等,也能很容易地集成到 openstack 等 IaaS 平台。


Calico 在每个计算节点利用 Linux Kernel 实现了一个高效的 vRouter 来负责数据转发。每个 vRouter 通过 BGP 协议把在本节点上运行的容器的路由信息向整个 Calico 网络广播,并自动设置到达其他节点的路由转发规则。


Calico 保证所有容器之间的数据流量都是通过 IP 路由的方式完成互联互通的。Calico 节点组网可以直接利用数据中心的网络结构(L2 或者 L3),不需要额外的 NAT、隧道或者 Overlay Network,没有额外的封包解包,能够节约 CPU 运算,提高网络通信效率。

相关实践学习
容器服务Serverless版ACK Serverless 快速入门:在线魔方应用部署和监控
通过本实验,您将了解到容器服务Serverless版ACK Serverless 的基本产品能力,即可以实现快速部署一个在线魔方应用,并借助阿里云容器服务成熟的产品生态,实现在线应用的企业级监控,提升应用稳定性。
云原生实践公开课
课程大纲 开篇:如何学习并实践云原生技术 基础篇: 5 步上手 Kubernetes 进阶篇:生产环境下的 K8s 实践 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
9天前
|
Kubernetes 应用服务中间件 Docker
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
Kubernetes学习-集群搭建篇(二) 部署Node服务,启动JNI网络插件
|
2天前
|
存储 网络协议 Linux
【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解(下)
【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解(下)
|
2天前
|
存储 网络协议 安全
【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解(上)
【Linux 网络】网络基础(一)(局域网、广域网、网络协议、TCP/IP结构模型、网络传输、封装和分用)-- 详解(上)
|
3天前
|
机器学习/深度学习 算法 计算机视觉
基于yolov2深度学习网络模型的鱼眼镜头中人员检测算法matlab仿真
该内容是一个关于基于YOLOv2的鱼眼镜头人员检测算法的介绍。展示了算法运行的三张效果图,使用的是matlab2022a软件。YOLOv2模型结合鱼眼镜头畸变校正技术,对鱼眼图像中的人员进行准确检测。算法流程包括图像预处理、网络前向传播、边界框预测与分类及后处理。核心程序段加载预训练的YOLOv2检测器,遍历并处理图像,检测到的目标用矩形标注显示。
|
3天前
|
Kubernetes 关系型数据库 分布式数据库
【PolarDB开源】PolarDB与Kubernetes集成:容器化部署的最佳实践
【5月更文挑战第21天】本文介绍了将阿里云的高性能数据库PolarDB与容器编排工具Kubernetes集成的步骤。首先,需准备Kubernetes集群和PolarDB Docker镜像,安装Helm。然后,通过Helm部署PolarDB,设置存储类和副本数。接着,应用配置PolarDB连接信息,打包成Docker镜像并在K8s集群中部署。此外,调整PolarDB参数以优化性能,并使用Prometheus和Grafana监控。本文为PolarDB在Kubernetes中的最佳实践提供了指导。
23 4
|
4天前
|
机器学习/深度学习 人工智能 算法
食物识别系统Python+深度学习人工智能+TensorFlow+卷积神经网络算法模型
食物识别系统采用TensorFlow的ResNet50模型,训练了包含11类食物的数据集,生成高精度H5模型。系统整合Django框架,提供网页平台,用户可上传图片进行食物识别。效果图片展示成功识别各类食物。[查看演示视频、代码及安装指南](https://www.yuque.com/ziwu/yygu3z/yhd6a7vai4o9iuys?singleDoc#)。项目利用深度学习的卷积神经网络(CNN),其局部感受野和权重共享机制适于图像识别,广泛应用于医疗图像分析等领域。示例代码展示了一个使用TensorFlow训练的简单CNN模型,用于MNIST手写数字识别。
22 3
|
8天前
|
机器学习/深度学习 数据可视化 PyTorch
使用Python实现深度学习模型:生成对抗网络(GAN)
使用Python实现深度学习模型:生成对抗网络(GAN)
22 3
|
8天前
|
存储 Kubernetes 容器
|
9天前
|
缓存 网络安全 Android开发
|
9天前
|
Linux 开发工具
【项目--Hi3559A】如何在Hi3559A上运行自己的yolov3模型(修改类别、网络结构)
【项目--Hi3559A】如何在Hi3559A上运行自己的yolov3模型(修改类别、网络结构)
9 0