k8s的一些概念
1. 概念
1.1 部署迭代
部署方式的迭代

部署方式,分为三个阶段.
- 实体物理机器阶段,即一台物理进行部署多个app ,容易出现系统环境污染。
- 虚拟机部署,解决了环境污染问题,但是软件模拟硬件运行也需要消耗大量的硬件资源。
- 容器化部署,使用软件模拟环境部署,不需要软件模拟硬件的资源,在文件系统上做隔离,不在硬件上做隔离
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的网络要求
- 所有的Pods之间可以在不使用NAT网络地址转换的情况下相互通信*
- 所有的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进行通信
-
- 首先pod1上网卡eth0将数据发送给已经管理到root命名空间的veth0上,被虚拟网桥收到,查看自己转发表之后,并没有pod4的mac地址。
-
- 就会把包转发到默认路由,(root命名空间的eth0上,也就是已经到了node节点的往卡上)通过eth0,发送到网络中。
-
- 寻址转发后包来到了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 的一些关键特性和功能:
主要特性
- 网络连接:
-
- Calico 使用基于 IP 的网络模型,为每个 Pod 分配一个唯一的 IP 地址,允许它们直接通信。
- 网络安全:
-
- Calico 提供了网络策略功能,可以定义细粒度的访问控制规则,限制 Pod 之间的通信,增强安全性。
- 可扩展性:
-
- Calico 设计为高度可扩展,能够支持大规模的集群环境。
- 支持多种网络模式:
-
- Calico 可以与多种网络后端配合使用,包括 BGP(边界网关协议)和 VXLAN(虚拟扩展局域网)。
- 集成服务网格:
-
- Calico 可以与服务网格(如 Istio)集成,以增强微服务架构中的网络安全和流量管理。
- 简化的网络管理:
-
- 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 亿图图示原文件
路由信息和代码需要使用 亿图图示打开
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的概念
更多推荐



所有评论(0)