1. 概念

1.1 部署迭代

部署方式的迭代

部署方式,分为三个阶段.

  1. 实体物理机器阶段,即一台物理进行部署多个app ,容易出现系统环境污染。
  1. 虚拟机部署,解决了环境污染问题,但是软件模拟硬件运行也需要消耗大量的硬件资源。
  1. 容器化部署,使用软件模拟环境部署,不需要软件模拟硬件的资源,在文件系统上做隔离,不在硬件上做隔离

k8s就是基于容器化部署产生的产生,容器管理工具

k8s 优势

  • 服务发现和负载均衡
  • 存储的编排(添加任何本地或云服务器)
  • 自动部署和回滚
  • 自动分配cup 内存资源
  • 自我修复(需要时启动新的容器)
  • Secret (安全相关信息)和配置管理
  • 大型规模的支持
  • 开源

k8s 支持规模数量

  • 每个节点的pod数量不超过110个
  • 节点总数不超过5000
  • pd总数不超过150000
  • 容器总数不超过300000

1.2 pod的概念

pod是一个容器组

Pause 容器,是pod内部第一个启动容器

  • pause 这个容器需要初始化网络环境,有pause这个容器去向docker引擎申请网络环境
  • 然后需要启动容器应用再创建,加入到pause容器的网络环境中。
  • pause也会去管理在pause网络环境中也就是 pod中的其他容器的进程

pause 容器使用了docker network 模式中的 bridge(桥接模式) 模式,创建一个docker网络环境。

后面同属于pause网络的容器使用了 contariner 模式加入到pause容器的docker nerwork 网络中。

1.3 k8s的网络要求

  • 所有的Nodes之间可以在不使用NAT网络地址转换的情况下相互通信
  • 每个Pod自己看到的自己的ip和其他Pod看到的一致

k8s网络模型设计原则

  • 每个Pod都拥有一个独立的 IP地址,而且 假定所有 Pod 都在一个可以直接连通的、扁平的网络空间中 。
  • 不管它们是否运行在同 一 个 Node (宿主机)中,都要求它们可以直接通过对方的 IP 进行访问。
  • 设计这个原则的原因 是,用户不需要额外考虑如何建立 Pod 之间的连接,也不需要考虑将容器端口映射到主机端口等问题。

1.4 k8s中容器与容器的通信

pod中每个docker容器和pod在一个网络命名空间内,所以ip和端口等等网络配置,都和pod一样,主要通过一种机制就是,docker的一种网络模式,container,新创建的Docker容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等

*pod之间的通信

pod与pod之间的网络:首先pod自身拥有一个IP地址,不同pod之间直接使用IP地址进行通信即可

同一台node节点上pod和pod通信

疑问:那么不同pod之间,也就是不同网络命名空间之间如何进行通信(现在还是,同一台node节点上)

解决

简单说veth对就是一个成对的端口,所有从这对端口一端进入的数据包,都将从另一端出来。

为了让多个Pod的网络命名空间链接起来,我们可以让veth对的一端链接到root网络命名空间(宿主机的),另一端链接到Pod的网络命名空间。

嗯,那么继续。

还需要用到一个Linux以太网桥,它是一个虚拟的二层网络设备,目的就是把多个以太网段连接起来,它维护一个转发表,通过查看每个设备mac地址决定转发,还是丢弃数据

  • pod1-->pod2(同一台node上),pod1通过自身eth0网卡发送数据,eth0连接着veth0,网桥把veth0和veth1组成了一个以太网,然后数据到达veth0之后,网桥通过转发表,发送给veth1,veth1直接把数据传给pod2的eth0。

k8s集群中,每个node节点都会被分配一个CIDR块,(把网络前缀都相同的连续地址组成的地址组称为CIDR地址块)用来给node上的pod分配IP地址,另外还需要把pod的ip和所在nodeip进行关联

  • 比如node1上pod1和node2上的pod4进行通信
    1. 首先pod1上网卡eth0将数据发送给已经管理到root命名空间的veth0上,被虚拟网桥收到,查看自己转发表之后,并没有pod4的mac地址。
    1. 就会把包转发到默认路由,(root命名空间的eth0上,也就是已经到了node节点的往卡上)通过eth0,发送到网络中。
    1. 寻址转发后包来到了node2,首先被root命名空间的eth0设备接受,查看目标地址是发往pod4的,交给虚拟网桥路由到veth1,最终传给pod4的eth0上。

不通节点的pod通信

1.5 什么是cni?

文章 : [深入解读 CNI:容器网络接口 · Jimmy Song](深入解读 CNI:容器网络接口 - Jimmy Song 工作流程 容器网络接口(CNI)规范定义了容器如何配置网络,其中包括 ADD 、 CHECK 、 DELETE,、 GC 和 VERSION 五种操作。 容器运行时通过调用各种 CNI 插件来执行这些操作,从而实现容器网络的动态管理和更新。)

1.5.1 cni的基础概念 1

我需要了解cni是因为k8s使用了CNI标准去解决容器的网络的环境。

CNI 是 Containet Network Interface 容器网络接口,英文的缩写

CNI 规范包含以下几个核心组成组成部分

  • 网络配置的格式:定义了管理员如何定义网络配置。
  • 请求协议:描述了容器运行时如何向网络插件发出网络配置或清理请求。
  • 插件执行过程:详细阐述了插件如何根据提供的配置执行网络设置或清理。
  • 插件委派:允许插件将定功能委托给其他插件执行。
  • 结果返回:定义了插件执行完成后如何向运行时返回结果的数据格式。

CNI 规范通过定义这些核心组成部分,确保了不同的容器运行时和网络插件能够以一致的方式进行交互,实现网络配置的自动化和标准化。 CNI 规范的一些要点

CNI 规范的一些要点

CNI 是一个插件化的容器化网络解决方案
CNI 插件为可执行文件
单个 CNI 插件的职责是单一的
CNI 插件是呈链式调用的
CNI 规范为一个容器定义一个 Linux 网络命名空间
CNI 的网络定义存储为 JSON 格式
网络定义通过 STDIN 输入流传输到插件,这意味着宿主机上不会存储网络配置文件,其他的配置参数通过环境变量传递给插件

CNI 插件根据操作类型,接收相应的网络配置参数,执行网络配置或清理任务,并返回执行结果。这一流程确保了容器网络的动态配置与容器生命周期的同步。

下图展示了 CNI 包含了众多的网络插件。

CNI 接口并不是指 http,gRPC这种接口,CNI接口指的是对可执行程序的调用(exec),k8s中Master节点默认CNI插件路径在 /opt/cni/bin/ 目录下

CNI是一规范,执行程序的调用程序,去满足规范,去接入到容器

k8s是可以使用多种插件的,目前主流的插件Calico 就是实现了CNI标准的网络插件。

我们搭建k8s集群的时候使用了calico

1.5.2 CNI的插件分类

CNI是基于json文件格式来描述网络配置的,当需要容器设置网络时,由容器运行时负责执行CNI插件,并通过CNI插件标准输入 (stdin) 来传递配置文件信息,通过标准输出(stdout)接受插件的执行结果。

从网络插件功能可以分为5类

Main 插件 :创建具体网络设备

  • bridge : 网桥设备,连接到container 和host
  • ipvlan 为容器添加ipvaln网卡
  • loopbak : IO设备
  • macvlan 为容器创建一个mac地址
  • ptp:创建一对veth Pair
  • vlan:分配一个valn设备地
  • hist-device:将已经存在的设备移入容器内

IPAM插件 : ip分配

  • dhcp:完成dhcp功能
  • static,为pod分配镜头地址

META插件:其他功能插件

  • tuning:通过sysctl 调整网络设备参数
  • portmap:通过iptables配置端口映射
  • bandwidth:使用Token Bucket Filter 来限流
  • sbr:为网卡设置 source based routing 设置基于源地址路由
  • fireall:通过iptables给容器网络的进程流量进行限制

windows 插件

  • 专门用于windows平台的cni插件(win-bridge 与 win-ovelay 网络插件)

第三方网络插件

  • 非官方的插件,基于cni网络的插件
  • calico
  • flannerl
  • filum
  • ovm

等等

由k8s官方提供的插件其实是无法解决扁平化网络的问题。

所以我们需要使用到第三方网络插件

1.5.3 Calico 插件 实现了CNI

Calico 是一个流行的 CNI(Container Network Interface)插件,专门用于 Kubernetes 和其他容器编排平台。它提供了高性能的网络和网络安全功能,主要用于容器和虚拟机的网络连接。以下是 Calico 的一些关键特性和功能:

主要特性

  1. 网络连接
    • Calico 使用基于 IP 的网络模型,为每个 Pod 分配一个唯一的 IP 地址,允许它们直接通信。
  1. 网络安全
    • Calico 提供了网络策略功能,可以定义细粒度的访问控制规则,限制 Pod 之间的通信,增强安全性。
  1. 可扩展性
    • Calico 设计为高度可扩展,能够支持大规模的集群环境。
  1. 支持多种网络模式
    • Calico 可以与多种网络后端配合使用,包括 BGP(边界网关协议)和 VXLAN(虚拟扩展局域网)。
  1. 集成服务网格
    • Calico 可以与服务网格(如 Istio)集成,以增强微服务架构中的网络安全和流量管理。
  1. 简化的网络管理
    • Calico 提供了简单的 API 和 CLI 工具,方便用户管理网络策略和配置。

工作原理

  • IP 地址分配
    • Calico 为每个 Pod 分配一个唯一的 IP 地址,使用 IP-in-IP 或 VXLAN 等技术来实现网络隔离。
  • 路由
    • Calico 使用 BGP 协议来动态地管理网络路由,确保流量能够高效地在集群内传递。
  • 网络策略
    • 用户可以通过定义网络策略来控制 Pod 之间的流量,指定哪些 Pod 可以相互通信,哪些不能。

在 Kubernetes 集群中安装 Calico 通常很简单。可以使用 kubectl 命令直接应用 Calico 的 YAML 配置文件。例如:

kubectl apply -f https://docs.projectcalico.org/manifests/calico.yaml

1.5.4 kubectl调用cni流程

调用流程流程图

1.5.5 第三方插件对比

提供商

网络模型

路由封装

网络策略

网格

外部数存储

ingress/egress策略

是否加密

Cannl

封装(vxlan)

k8sAPI

Flannel

封装(vxlan)

k8sAPI

Calico

封装(vxlan,IPIP)或未封装

Etcd和k8sAPI

Weave

封装

Cilum

封装(vxlan)

Etcd和k8sAPI

  • 网络模型:封装或者未封装
  • 路由分发:一种外部网关协议,用于在互联网上交换路由和可达性信息,BGP可以帮助进行跨集群pod之间的网络。此功能对于未封装的CNI网络插件是必须的,并且通常由BGP完成。如果你想构建跨网段拆分的集群,路由分发是一个很好的功能
  • 网络策略:k8s提供了强制执行规则的功能,这些规则则决定了那些service可以使用网络策略进行相互通信。这是从k8s1.7起稳定的功能,可以与某些网络插件一起使用。
  • 网格:运行在不同的k8s集群间进行service之间的通信。
  • 运行外部数据存储:具有此功能的CNI插件需要一个外部存储服务器来存储数据
  • 加密:运行加密和网络控制的数据平面
  • ingress/Egress策略:运行管理k8s和非k8s通信的路由策略

非封装网络(underaly network)

  • 现实物理基础层网络设备
  • underaly 就是数据中心场景的基础物理设施,保证两个点可路由可达的,包含传统网络设备,

封装网络 (overlay network)

  • 一个基于物理网络之上构建的逻辑网络
  • overlay 在网络技术领域指的是一中网络架构上叠加的虚拟化技术模式
  • overlay 网络技术多样,一般采用RRILL,VxLlan,GRE,NVGRE等隧道技术

封装网络流程图

意图图示原图📎封装网络.zip

1.6 最主流的网络插件calico

Calico是一个纯三层的虚拟网络,它没有复用docker的docker0网桥,而是自己实现的calico网络不对数据包进行额外封装,不需要NAT和端口映射

1.6.1 VXLAN 模式

  • VXLAN,即virtual Extensible LAN (虚拟可扩展局域网),是liunx本身支持的一种虚拟化技术,VXLAN完全可以在内核态实现拆封和解封工作,从而通过隧道机制,构建出覆盖网络
  • 基于三层的“二层通信”,三层即vxlan包封装在udp数据保重,要求udp在k8s三层可达;二层即vxlan封包的源mac地址和目标的nac地址是自己的vxlan设备mac和对端vxlan设备的mac实现通信

网络通信拓扑

流程图+代码,使用

📎pod之间网络互通测试.zip 亿图图示原文件

路由信息和代码需要使用 亿图图示打开

pod之间网络互通测试.html

VXLAN封

  • 数据包封装:封包,在vxlan设备上讲pod发来的数据包源,目的的mac替换成本机的vxlan网卡和对端的vxlan网卡的mac。外层upd目的地址根据路由对端vxlan的mac差fdb表获取
  • 优势:只要k8s节点间三层互通,可以跨网段,对主机网关路由没有特殊要求。各个node节点通过vxlan设备实现基于三层的“二层”互通,即三层vxlan包封装在dup数据包中,要求udp在k8s节点间三层可达;二层即vxlan封包的源mac地址和目标的mac地址是自己的vxlan设备mac和对端vxlan设备的mac
  • 缺点:需要进行vxlan的数据包封包和解包存在一定的损耗

1.6.2 IPIP模式

Liunx原生内核支持

IPIP隧道的工作原生是将主机的ip数据包封装在一个新的ip数据包中,新的ip数据的目的地址是隧道的另一端,在隧道的另一端,接受方将解封原始ip数据包,并将其传递到目标主句。IPIP隧道可以在不通的网络之间建立联系,例如IPV4网络和IPV6网络之间建立链接

封装过程

IPIP

  • 数据包封包:封包,在tunIO设备上将pod发来的数据报mac层去掉,留下ip层封包。外层数据包目的ip地址根据路由得到
  • 有点:只要k8s节点三层互通,可以跨网段,对主机网关路由没有特殊要求
  • 缺点:需要进行IPIP的数据封包和解包会存在一定的性能损耗

1.6.3 BGP模式

BGP

  • 数据包封包:不需要进行数据包封包
  • 有点:不需要解包,封包BGP可以实现pod网络在主机之间三层可达
  • 缺点:跨网段时,配置较为复杂网络要求较高,主机网关路由也需要充当BGP Speaker

1.7 service的概念

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐