1.什么是容器网络
容器网络是一种新兴的应用程序沙箱机制,用于家庭桌面和网络规模的 企业网络 解决方案,其概念与虚拟机类似。容器内部与主机和所有其他容器隔离的是一个功能齐全的 Linux 环境,具有自己的用户、文件系统、进程和网络堆栈。容器内的所有应用程序都只能访问或修改容器内可用的文件或资源。
可以同时运行多个容器,每个容器都有自己的安装和依赖项。当应用程序的较新版本可能需要升级依赖项,这可能会导致与服务器上运行的其他应用程序依赖项发生冲突时,这特别有用。与虚拟机不同,容器共享主机资源,而不是完全模拟计算机上的所有硬件,这使得容器比虚拟机更小、更快,并减少了开销。特别是在网络规模应用程序的背景下,容器被设计为虚拟机的替代品,作为微服务架构的部署平台。
容器还具有可移植性的特点,例如Docker这个容器引擎,允许开发者将一个容器及其所有依赖项打包在一起。然后可以下载该容器包。下载后,容器可以立即在主机上运行。
容器网络允许容器与其他容器或主机通信以共享资源和数据。
现代容器网络旨在标准化和优化容器数据流,创建隔离区域,允许大量容器以高效、安全的方式进行通信。已经提出了多个标准来管理容器网络,包括容器网络模型(CNM)和容器网络接口(CNI)。
Docker 和 Kubernetes 等流行的容器平台使用以下网络模型:
- 无 –最简单的网络模式是环回接口,其中容器不与外部网络通信。
- 网桥 –内部主机网络,允许同一主机上的容器之间进行通信。
- 主机 –允许容器与主机共享其网络命名空间,从而实现高速网络。
- 覆盖 –确保连接到两个不同覆盖网络的容器彼此隔离,并且无法通过本地网桥进行通信。
- 底层 –将主机接口公开给主机上运行的虚拟机或容器。
2.容器网络如何工作
容器网络是一种虚拟化形式,其概念与虚拟机 (VM) 类似,但也有显着差异。首先,容器方法是操作系统虚拟化的一种形式,而虚拟机是硬件虚拟化的一种形式。
在虚拟机管理程序上运行的每个虚拟机都有自己的操作系统、应用程序和库,并且能够封装持久数据、安装新操作系统、使用与主机不同的文件系统或使用不同的内核版本。
相反,容器是镜像的“运行实例”,是短暂的操作系统虚拟化,它会旋转起来执行一些任务,然后被删除和遗忘。由于容器的短暂性,与需要更大地址空间的虚拟机相比,系统用户运行的容器实例要多得多。
为了创建隔离,容器依赖于两个 Linux 内核功能:命名空间和 cgroup。为了让容器拥有自己的系统视图,并将其与其他资源隔离,为每个资源创建一个命名空间,并且不与其余系统共享。然后,控制组 (Cgroup) 用于监视和限制系统资源,如 CPU、内存、磁盘 I/O、网络等。
3.容器网络的好处
容器正在迅速被采用,取代虚拟机作为微服务平台。
容器有几个主要优点:
- 与现有工作负载一起运行容器化应用程序: 机器可以在同一基础设施上与传统虚拟机一起运行容器化应用程序,从而提供灵活性和速度。
- 将可移植性与安全性、可见性和管理相结合: 由于容器的固有设计,它可以通过沙箱、主机资源透明度、任务管理和执行环境可移植性来实现更高的安全性。
- 轻松利用现有的基础设施和规模: 使用现有的 SDDC 可以避免对基础设施进行成本高昂且耗时的重新架构,从而导致孤岛 - 当不同部门在同一组织内维护自己的 IT 基础设施时,就会出现孤岛。由于每个部门的技术配置存在差异,这种“筒仓效应”在实施组织范围内的 IT 策略和升级时会产生问题。重新集成孤岛是一个成本高昂且耗时的过程,可以通过容器网络来避免。
- 为开发人员提供与 Docker 兼容的接口: 已经熟悉 Docker 的开发人员可以通过与 Docker 兼容的接口在容器中开发应用程序,然后通过自助管理门户或 UI 进行配置。
4.容器网络模型
容器网络模型(CNM)是Docker提出的一个标准。它已被许多项目(例如 libnetwork)采用,并提供与各种产品的集成,包括Project Calico(Calico 开源)、Cisco Contiv、开放虚拟网络 (OVN)、VMware、Weave 和 Kuryr。
以下是通过实施 CNM 实现的 libnetwork 的主要功能:
- 网络沙箱 –包含容器网络配置的隔离环境。它作为容器内的网络堆栈工作。
- 端点 –成对构建的网络接口。它允许您将接口的一端放置在网络沙箱中,另一端放置在指定网络中。它确保端点仅加入一个网络,而多个端点存在于一个网络沙箱中。
- 网络 –允许相互通信的唯一可识别端点的集合。
- 用户定义的标签 – CNM 允许您使用标签标志定义标签。这些标签作为元数据在驱动程序和 libnetwork 之间传递。标签使运行时能够通知驱动程序的行为。
图 1:Libnetwork 提供 Docker 守护进程和网络驱动程序之间的接口。
Libnetwork 是 CNM 规范的规范实现。Libnetwork 提供了 Docker 守护进程和网络驱动程序之间的接口。网络控制器负责将驱动程序与网络配对。每个驱动程序负责管理其拥有的网络,包括向该网络提供的服务,例如 IPAM。每个网络一个驱动程序,多个驱动程序可以与连接到多个网络的容器同时使用。驱动程序被定义为本地驱动程序(内置于 libnetwork 或支持 Docker)或远程驱动程序(第三方插件)。本机驱动程序有 none、bridge、overlay 和 MACvlan。远程驱动程序可以带来任意数量的功能。驱动程序也被定义为具有本地作用域(单主机)或全局作用域(多主机)。
5.容器网络接口
容器网络接口(CNI)是CoreOS提出的标准。它是作为一个最小规范创建的,作为网络插件和容器运行时之间的简单契约。CNI 已被许多项目采用,包括 Apache Mesos、Kubernetes 和 rkt。
以下是 CNI 的主要特征:
- CNI 使用 JSON 模式来定义 CNI 网络插件所需的输入和输出。
- CNI 使您能够使用一个容器运行多个插件,该容器连接由不同插件驱动的网络。
- CNI 在配置 JSON 文件中描述网络,并在调用 CNI 插件后将它们实例化为新的命名空间。
- CNI 插件可以支持两个命令,用于向网络添加和删除容器网络接口。
图 2:CNI 是向网络添加和删除容器的最小规范。
CNI 是作为一个最小规范创建的,与许多网络供应商工程师一起构建,作为容器运行时和网络插件之间的简单契约。JSON 模式定义了 CNI 网络插件的预期输入和输出。
多个插件可以同时运行,容器加入由不同插件驱动的网络。网络在配置文件中以 JSON 格式进行描述,并在调用 CNI 插件时实例化为新的命名空间。CNI 插件支持两个命令来向网络添加和删除容器网络接口。Add 在创建容器时由容器运行时调用。当删除容器实例时,容器运行时会调用删除。
6.容器网络的类型
目前使用的容器网络有五种类型:它们的特征集中在每个容器的 IP 与每个 Pod 的 IP 模型以及需要网络地址转换 (NAT) 与不需要转换的情况。
- None: 容器接收网络堆栈;然而,它缺乏外部连接。此模式对于测试容器、为以后的网络连接暂存容器以及分配给不需要外部通信的容器非常有用。
- Bridge: 在内部主机网络上桥接的容器,并允许与同一主机上的其他容器进行通信。无法从主机外部访问容器。桥接网络是 Docker 容器的默认网络。
- Host: 此配置允许创建的容器共享主机的网络命名空间,从而授予容器对主机所有网络接口的访问权限。外部网络配置最不复杂,这种类型由于共享网络接口而容易发生端口冲突。
- Underlay: Underlay 直接向主机上运行的容器开放主机接口,并且无需端口映射,使其比桥接器更高效。
- Overlay: 覆盖使用网络隧道在主机之间进行通信,允许容器在托管在不同主机上时就像在同一台计算机上一样。