当前位置: 首页 > 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.dtcms.com/a/321743.html

相关文章:

  • OpenAI 的 GPT-5 来了
  • GO的启动流程(GMP模型/内存)
  • 要写新项目了,运行老Django项目找找记忆先
  • Redis(②-持久化)
  • 写一个redis客户端软件,参考 Another Redis Desktop Manager 的设计风格。
  • 【沉浸式解决问题】pycharm关闭科学模式
  • Docker Compose 实战指南:从配置到多容器联动的全流程解析
  • Linux系统编程Day9 -- 理解计算机的软硬件管理
  • Dijkstra?spfa?SPstra?
  • 01Vue3
  • 增长强势 成果丰硕 | Fortinet发布2025年第二季度财报
  • GPT-5正式发布:与Claude 4、Gemini 2.5等主流大模型谁更胜一筹?
  • Java中重写和重载有哪些区别
  • 大模型——部署体验gpt-oss-20b
  • 写论文助手Zotero 的使用
  • Scrapy返回200但无数据?可能是Cookies或Session问题
  • electron 静默安装同时安装完成后自动启动(nsis)
  • 【vLLM 学习】Load Sharded State
  • VB网际探针:零依赖轻量爬虫实战
  • GPT-5 is here
  • STM32 输入捕获,串口打印,定时器,中断综合运用
  • centos系统配置防火墙
  • DDR-怎么计算存储空间-什么是预取(Pre-fetch)
  • 【世纪龙科技】汽车车身测量虚拟实训软件-虚境精测全维赋能
  • 应急响应流程
  • vue2-scoped关键字、组件通信
  • Qwen-Image擅长文字渲染的创作利器
  • 用 Go 写个极简反向代理,把 CC 攻击挡在业务容器之外
  • 深入浅出:掌握银河麒麟桌面操作系统的防火墙管理艺术
  • 3- Python 网络爬虫 — 如何抓取动态加载数据?Ajax 原理与实战全解析