当前位置: 首页 > news >正文

二、k8s 1.29 之 网络

1、基本概述

        1.1 

        在谷歌GCE中有现成的网络模型,kubernetes中的pod可以在连通的扁平的网络中进行通信

        但是在私有集群,阿里、华为、自建机房就没有了,需要我们自己实现网络模型,将不同节点 的docker打通

        1.2 仨原则

        在不使用网络地址转换(NAT)的情况下,集群中的Pod能够与任意其他Pod进行通信


在不使用网络地址转换(NAT)的情况下,在集群节点上运行的程序能与同一节点上的任何
Pod进行通信


每个Pod都有自己的IP地址(IP-per-Pod),并且任意其他Pod都可以通过相同的这个地
址访问它

2、CNI

        CNI插件通常聚焦在容器到容器的网络通信。

        借助CNI标准,Kubernetes可以实现容器网络问题的解决。通道过插件化的方式来集成各种网络插件,实现集群内部网络相互通信,只要实现CNI标准中定义的核心接作(ADD,将容器添加到网络;DEL,从网络中删除一个容器;CHECK,检查容器的网络是否符合预期等)。

        CNI的接口并不是指HTTP,gRPC这种接口,CNI接口是指对可执行程序的调用(exec)可执行程序,Kubernetes节点默认的CNI插件路径为/opt/cni/bin

        CNI通过JSON格式的配置文件来描述网络配置,当需要设置置容器网络时,由容器运行时负责执行CNI插件,并通过CNI插件的标准输入(stdin)来传递配置文件信息,通过标准输出(stdout)接收插件的执行结果。从网络插件功能可以分为五类:

        Main插件,创建具体网络设备(bridge:网桥设备,连接 container和host;ipvlan:为容器
增加ipvlan网卡;loopback:lO设备;macvlan:为容器创建一个|MAC地址;ptp:创建一对
Veth Pair;vlan:分配一个vlan设备;host-device:将已存在的设备移入容器内)
PAM插件:负责分配IP地址(dhcp:容器向DHCP服务器发起请求,给Pod发放或回收IP地址
;host-local:使用预先配置的IP地址段来进行分配;staatic:为容器分配一个静态IPv4/IPv6地
址,主要用于debug)
META插件:其他功能的插件(tuning:通过sysctl调整网络设备参数;portmap:通过
iptables配置端口映射;bandwidth:使用Token Bucket Filter来限流;sbr:为网卡设置
source based routing;firewall:通过iptables给容器网络的进出流量进行限制
Windows插件:专门用于Windows平台的CNI插件(win-bridge与win-overlay网络插件)
第三方网络插件:第三方开源的网络插件众多,每个组件都有各自的优点及适应的场景,难以形成
统一的标准组件,常用有Flannel、Calico、Cilium、OVN网络插件

        

3、第三方网络插件 

        为了达到网络的扁平化(

网络的扁平化是指网络结构趋向于减少层级、简化中间环节,使信息传递和交互更直接、高效的现象

这种趋势的核心是提升效率、降低延迟,同时增强网络的灵活性和适应性,更好地应对海量数据传输和快速交互的需求。

        以前主流:flannel

        现在主流:calico

        未来主流:cilium

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

4、calico

4.1 概述

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

4.2 架构

Felix
管理网络接口
编写路由
编写ACL
报告状态
bird (BGP Client)
BGP Client将通过BGP协议广播告诉剩余
calico 节点,从而实现网络互通
confd
通过监听etcd以了解BGP配置和全局默认
值的更改。Confd根据ETCD中数据的更新,
动态生成BIRD配置文件。当配置文件更改
时,confd触发BIRD重新加载新文件

4.3 基于三层的二层互联,在VXLAN中

先明确两个基础概念:

  • 二层网络:类似 “小区内部的路”,设备靠 MAC 地址(比如 “门牌号”)通信,比如家里的 WiFi、公司的局域网,同一二层网络里的设备可以直接 “喊” 到对方。

  • 三层网络:类似 “城市之间的高速路”,设备靠 IP 地址(比如 “城市地址”)通信,比如跨城市的互联网,负责远距离传输,但不认 MAC 地址。

问题:为什么需要 “基于三层的二层互联”?

假设你有两个办公室(A 办公室和 B 办公室):

  • 每个办公室内部是二层网络(设备靠 MAC 地址通信,比如打印机、服务器)。

  • 两个办公室之间隔了很远,靠三层网络(比如运营商的广域网、互联网)连接(类似 “两个小区被一条高速路隔开”)。

现在的需求是:让 A 办公室的电脑能像在同一个局域网里一样,直接访问 B 办公室的打印机(即保持 “二层通信” 的体验),但中间必须经过三层网络传输。

VXLAN 的作用:给二层数据 “打包”,让它能在三层网络上跑

VXLAN 就像一个 “快递服务”,解决了 “二层数据(小区内部的包裹)如何通过三层网络(高速路)送到另一个小区” 的问题,步骤如下:

  1. A 办公室的设备要发数据给 B 办公室
    A 办公室的电脑生成一个 “二层数据包”(比如访问 B 办公室打印机的请求,带着目标 MAC 地址),但这个包本身只能在二层网络里跑,无法直接上三层网络(因为三层网络不认 MAC 地址)。

  2. VXLAN 给这个二层包 “打包”
    A 办公室的 VXLAN 设备(比如交换机)会把这个二层数据包,装进一个 “三层包裹” 里 —— 外面套上三层网络的 “地址标签”(即 VXLAN 隧道两端的 IP 地址,类似 “寄件城市” 和 “收件城市”)。

  3. 通过三层网络传输
    这个 “三层包裹” 能在三层网络(高速路)上传输,因为三层网络只认 IP 地址,会根据外层的 IP 标签把包裹送到 B 办公室的 VXLAN 设备。

  4. B 办公室的 VXLAN 设备 “拆包”
    B 办公室的 VXLAN 设备收到包裹后,拆掉外层的三层标签,露出里面的二层数据包,再根据 MAC 地址(门牌号)送到目标设备(比如打印机)。

总结:“基于三层的二层互联” 的通俗理解

  • 三层网络是 “运输通道”:负责远距离传输,就像高速路,只认 IP 地址。

  • 二层互联是 “最终目的”:让两个被三层网络隔开的局域网,保持 “像在同一个局域网里通信” 的体验(比如直接用 MAC 地址访问)。

  • VXLAN 是 “打包工具”:把二层数据打包成三层网络能识别的格式,让它能在三层通道上传输,最终实现 “跨三层网络的二层通信”。

4.4 VXLAN工作模式

什么是VXLAN?


VXLAN,即Virtual Extensible LAN (虚拟可扩展局域网),是linux本身支持的一网种网络虚拟化
技术。VXLAN可以完全在内核态实现封装和解封装工作,从而通过"隧道"机制,构建出覆盖网络
(Overlay Network)
基于三层的"二层"通信,层即vxlan包封装在udp数据包中,要求udp在k8s节点间三层可达;
二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac
实现通讯。

优缺点

        数据包封包:封包,在vxlan设备上将pod发来的数据包源、目的mac替换为本机vxlan网卡和对端节点vxlan网卡的mac。外层udp目的ip地址根据路由和对端vxlan的mac查fdb表获取


优势:只要k8s节点间三层互通,可以跨网段,对主机网关路由没有特殊要求。各个node节点通过vxlan设备实现基于三层的"二层"互通,三层即vxlan包封装在udp数据包中,要求udp在k8s节点间三层可达;二层即vxlan封包的源mac地址和目的mac地址是自己的vxlan设备mac和对端vxlan设备mac


缺点:需要进行vxlan的数据包封包和解包会存在一定的性能损损耗

 配置方法

### 配置与验证总结
1. **配置方法**:
- 启用VXLAN,禁用IPIP;
- 设置`CALICO_IPV4POOL_IPIP`为`Never`,`CALICO_IPV4POOL_VXLAN`和`CALICO_IPV6POOL_VXLAN`为`Always`;
- 使用vxlan后端(非bird)。

2. **查看验证**:
- 存在`vxlan.calico`网络接口,状态为`UP`;
- `calicoctl node status`显示Calico进程运行,但BGP后端进程(BIRD/GOBGP)未运行(符合VXLAN无需BGP的特性);
- 接口收发数据包暂为0,存在8个发送丢弃包。

        

4.5 IPIP工作模式

概述

        Linux原生内核支持


PIP隧道的工作原理是将源主机的IP数据包封装在一个新的IP数据包中,新的IP数据包的
目的地址是隧道的另一端。在隧道的另一端,接收方将解封装原原始IP数据包,并将其传递
到目标主机。IPIP隧道可以在不同的网络之间建立连接,例如在IPv4网络和IPv6网络之
间建立连接。

封装

优缺点

        数据包封包:封包,在tunl0设备上将pod发来的数据包的mac层去掉,留下ip层封包。
外层数据包目的ip地址根据路由得到。


优点:只要k8s节点间三层互通,可以跨网段,对主机网关路由没有特殊要求。


缺点:需要进行IPIP的数据包封包和解包会存在一定的性能损耗

配置

### 配置与验证总结
1. **网络模式配置**
- 启用IPIP:`CALICO_IPV4POOL_IPIP="Always"`
- 禁用VXLAN:IPv4池(`CALICO_IPV4POOL_VXLAN="Never"`)、IPv6池(`CALICO_IPV6POOL_VXLAN="Never"`)
2. **状态验证**
- Calico进程运行正常(`calicoctl node status` 显示运行中)
- IPIP隧道接口`tunl0`存在(IP:10.244.32.128,MTU 1480)
- IPv4 BGP状态:2个节点(192.168.127.4、192.168.127.5)均为“Established”状态
- IPv6 BGP状态:无 peers 发现
3. **补充说明**:IPIP模式依赖BGP建立节点邻接关系,VXLAN无需BGP。

4.6 BGP工作模式 - 非封装 性能高

概述

- **定义**:BGP是互联网核心的去中心化自治路由协议,属矢量路由协议,用于维护IP路由表,实现自治系统(AS)间的可达性。
- **特点**:不采用内部网关协议(IGP)的传统指标,基于路径、网络策略或规则集决定路由。
- **通俗解释**:将机房多条线路(如电信、联通、移动)融合,实现多线单IP。
- **BGP机房优点**:服务器仅需一个IP,最佳访问路由由骨干路由器根据路由跳数等技术指标确定,不占用服务器系统资源。

优缺点

数据包封包:不需要进行数据包封包


优点:不用封包解包,通过BGP协议可实现pod网络在主机间的三层可达


缺点:跨网段时,配置较为复杂网络要求较高,主机网关路由也需要充当BGP Speaker。

配置

### 配置与验证总结
1. **配置方法**:
- 禁用IPv4的IPIP:`CALICO_IPV4POOL_IPIP: "Off"`
- 禁用IPv4的VXLAN:`CALICO_IPV4POOL_VXLAN: "Never"`
- 禁用IPv6的VXLAN:`CALICO_IPV6POOL_VXLAN: "Never"`

2. **查看验证结果**:
- **Calico进程状态**:运行正常(`calicoctl node status`)。
- **IPv4地址池(ippool)**:
- 默认池CIDR为`10.244.0.0/16`,IPIP和VXLAN模式均为`Never`,NAT禁用。
- BGP对等体状态:`192.168.127.4`和`192.168.127.5`均为`up`(节点间 mesh 模式)。
- **节点信息(node)**:
- 包含3个节点:`k8s-master01`(IP:192.168.127.3/24)、`k8s-node01`(IP:192.168.127.4/24)、`k8s-node02`(IP:192.168.127.5/24)。
- 所有节点ASN均为`64512`,无IPv6对等体。

http://www.lryc.cn/news/613690.html

相关文章:

  • 2025年城市建设与智慧交通国际会议(ICUCIT 2025)
  • Vue复习
  • 暴力解决MySQL连接失败
  • 协同进化:AIGC、Agent和MCP如何相互促进共同发展
  • 内容分发机制研究:实测一款多源短视频聚合App
  • 医防融合中心-智慧化慢病全程管理医疗AI系统开发(上)
  • C++程序库选择:权衡与取舍的艺术——以iostream和stdio为例
  • 低压电工-------元器件认识
  • react+echarts实现个性化评分展示(类进度条)
  • AR眼镜:能源行业设备维护的“安全守护者”
  • Java 虚拟机之双亲委派机制
  • 接口自动化-pytest
  • 使用winsw把SpringBoot项目注册成window服务
  • Linux怎么查看时区信息?(Linux时区)(tzselect)
  • Xvfb虚拟屏幕(Linux)中文入门篇1:(wikipedia摘要,适当改写)
  • 容器 vs 虚拟机
  • 技法笔记3 | 验证交互式shell连接
  • 数据结构(五):顺序循环队列与哈希表
  • SkyWalking-1--SkyWalking是什么?
  • Kubernetes学习
  • 嵌入式开发学习———Linux环境下IO进程线程学习(六)
  • Qwen系列模型
  • 对比学习(Contrastive Learning)面试基础
  • STM32——STM32CubeMX
  • 4G/5G无线电单元系统
  • C语言:单链表学习
  • 北京-4年功能测试2年空窗-报培训班学测开-第七十天-面试第一天
  • rebase 和pull的通俗区别是什么
  • Flink与Kafka核心源码详解-目录
  • 【Unity3D实例-功能-镜头】第三人称视觉-镜头优化