Calico网络组件本地部署支持IPv6(Kubernetes)

知其然

问题背景

因项目现场的网络正逐步从IPv4向IPv6迁移,这几年现场服务器基本上都配置了双栈;但随着IPv6铺开,出现了很多纯IPv6的服务器,并且要求通信优先使用IPv6。

在项目建设之初,其实就考虑了上述情况,所以在部署Kubernetes集群的时候,就将集群配置为了支持IPv4和IPv6双栈。正因如此,前几天用户要求完全切换到IPv6,Pod内部服务连接外网IPv6的时候,发现竟然无法连通。

问题定位

1、问题表现:(1)IPv4在本地局域网(单个L2网络)和跨网均正常;(2)IPv6在本地局域网(单个L2网络)正常和跨网通信异常;

2、开始以为是现场IPv6网络策略导致的不通,用户协助定位发现,目标主机抓包报文(来自Pod内服务请求)头部中的源IP地址竟然是Pod内的虚拟IPv6,并未进行NAT转换。

3、那么,显然就是Kubernetes集群使用的网络组件的问题了;我们使用的是Calico,查看了Calico的启动配置YAML文件(超级多内容)一时也未发现问题在哪。但是,想来应该跟overlay网络配置有关系。

4、既然无法在已有配置中直接发现问题,那么,不如直接在网上直接搜索:Calico IPv6支持。没准能发现蛛丝马迹。最后证明这个思路是对的。

问题解决和验证

上面查找到的蛛丝马迹就是:CALICO_IPV6POOL_VXLAN、CALICO_IPV6POOL_NAT_OUTGOING;

1、查看Calico IP池的信息

~]# kubectl get ippools
NAME                  AGE
default-ipv4-ippool   15h
default-ipv6-ippool   15h

2、查看跟IPv6相关的地址池配置信息

~]# kubectl get ippools default-ipv6-ippool -o yaml 
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
……
spec:
  allowedUses:
  - Workload
  - Tunnel
  blockSize: 122
  cidr: fa00:cafe:42::/56
  ipipMode: Never
  nodeSelector: all()
  vxlanMode: Never

ipipMode和vxlanMode均为Never,并且也没有natOutgoing(默认为false)相关配置。

3、如下图修改Calico启动配置文件,增加红色部分配置(通过命令kubectl edit ds -n kube-system calico-node,在线编辑增加配置,calico-node重启后并没有生效,ippools中的vxlanMode仍然为Never,也无natOutgoing)

4、重新部署Calico

kubectl delete  -f calico.yaml

kubectl apply -f calico.yaml

5、验证是否生效

~]# kubectl get ippools default-ipv6-ippool -o yaml 
apiVersion: crd.projectcalico.org/v1
kind: IPPool
metadata:
……
spec:
……
  natOutgoing: true
  vxlanMode: CrossSubnet

~]# ip6tables-save -t nat|grep -i cali
:cali-PREROUTING - [0:0]
:cali-fip-dnat - [0:0]
:cali-POSTROUTING - [0:0]
:cali-fip-snat - [0:0]
:cali-nat-outgoing - [0:0]
:cali-OUTPUT - [0:0]
-A PREROUTING -m comment --comment "cali:6gwbT8clXdHdC1b1" -j cali-PREROUTING
-A POSTROUTING -m comment --comment "cali:O3lYWMrLQYEMJtB5" -j cali-POSTROUTING
-A OUTPUT -m comment --comment "cali:tVnHkvAo15HuiPy0" -j cali-OUTPUT
-A cali-PREROUTING -m comment --comment "cali:r6XmIziWUJsdOK6Z" -j cali-fip-dnat
-A cali-POSTROUTING -m comment --comment "cali:Z-c7XtVd2Bq7s_hA" -j cali-fip-snat
-A cali-POSTROUTING -m comment --comment "cali:nYKhEzDlr11Jccal" -j cali-nat-outgoing
-A cali-POSTROUTING -o vxlan-v6.calico -m comment --comment "cali:MtS-9OgAQy-fAM-w" -m addrtype ! --src-type LOCAL --limit-iface-out -m addrtype --src-type LOCAL -j MASQUERADE --random-fully
-A cali-nat-outgoing -m comment --comment "cali:Ir_z2t1P6-CxTDof" -m set --match-set cali60masq-ipam-pools src -m set ! --match-set cali60all-ipam-pools dst -j MASQUERADE --random-fully
-A cali-OUTPUT -m comment --comment "cali:GBTAv2p5CwevEyJm" -j cali-fip-dnat

6、进入到Pod内部测试,问题解决。

知其所以然

Calico 3.x版本常用命令

  1. kubectl get networkpolicies:列出所有的网络策略。
  2. kubectl get ipamblocks:列出所有的IP地址块。
  3. kubectl get ipamhandles:列出所有的IP地址分配。
  4. kubectl get felixconfigurations:列出所有的Felix配置。
  5. kubectl get ippools:列出所有的IP地址池配置。
  6. kubectl -n kube-system logs -l k8s-app=calico-node:Calico 日志查看
  7. kubectl delete pod -n kube-system -l k8s-app=calico-node:重启 Calico Felix 容器以应用更改
  8. kubectl get pods -n kube-system -l k8s-app=calico-node -o wide:查看已经安装并启用了 Calico
  9. kubectl get configmap calico-config -n kube-system -o yaml:获取Calico配置的ConfigMap配置
  10. kubectl describe configmap calico-config -n kube-system:获取 calico-config ConfigMap 的详细信息
  11. kubectl get felixconfiguration default -n kube-system -o yaml:获取 Calico 的默认配置信息

Calico 网络组件介绍

Calico 是一个开源的网络和网络安全解决方案,专为容器、虚拟机和裸机工作负载设计。它使用 BGP(边界网关协议)来路由流量,支持多种网络模式,包括纯三层模式和覆盖网络模式。

Calico 的主要组件包括:

  • calico-node:运行在每个节点上,负责设置路由、管理 IP 地址,并通过 Felix 实现网络策略的执行。

  • BGP Daemon (Bird):负责节点之间的路由传播,以实现不同节点 Pod 之间的流量路由。

  • Felix:作为 Calico 的主代理,负责监控 etcd 中存储的网络策略并将其应用于节点的网络接口,同时负责设置 IP 路由、管理 ACLs 以确保流量符合策略。

  • Typha:当节点数较多时,可以通过 Typha 组件来减少 etcd 的访问负载。它会将 etcd 中的策略变化缓存起来,并同步给每个节点的 Felix 代理。

  • etcd:Calico 使用 etcd 作为存储后端,用于存储网络策略、IP 池等配置。也可以使用 Kubernetes 的 API Server 作为存储后端,便于集成。

Calico的backend类型

calico_backend:Calico的后端,默认为bird。

kubectl get configmap calico-config -n kube-system -o yaml
apiVersion: v1
data:
  calico_backend: bird
  cni_network_config: |-
    {

……

类型说明
birdBIRD是一种路由守护进程,Calico使用BIRD来实现路由功能。BIRD支持多种路由协议,包括BGP,可以用于在Calico节点之间分发路由信息。
vxlanVXLAN(Virtual Extensible LAN)是一种网络虚拟化技术,用于在不同子网之间封装数据包。Calico支持VXLAN封装方式,适用于云环境受限场景。ipip模式转vxlan:将calico_backend参数由bird设置为vxlan,因为vxlan部署不使用bgp。
ipipIP-in-IP是一种封装协议,用于在不同子网之间封装数据包。Calico支持IP-in-IP封装方式,适用于跨子网的场景。

Calico doesn't support tunneling for the IPv6, so "vxlan" and "ipip" backend wouldn't work.  If you need to have cross-pod connectivity, you need to use "bird" as a backend mode.  In any other mode the pods would be able to reach only pods on the same node.

Calico不支持IPv6隧道,所以“vxlan”和“ipip”后端不能工作。如果您需要跨pod连接,则需要使用“bird”作为后端模式。在任何其他模式下,pod都只能到达同一节点上的pod。

                                                ----引用自《IPv4/IPv6 Dual-Stack Networking - Documentation》

根据 Calico 的官方文档,Calico 的 IPIP 模式目前只支持 IPv4,不支持 IPv6。如果你的环境需要 IPv6 的隧道封装,建议使用 Calico 提供的 VXLAN 模式。

                                                ----来自于ChatGPT的回答

BGP

BGP(边界网关协议)是用于跨网络共享路由的基于标准的网络协议。它是互联网的基本组成部分之一,具有出色的扩展特性。

Calico内置了对BGP的支持。在本地部署中,这使Calico可以与物理网络(通常连接到Top或Rack路由器)建立对等关系以交换路由,从而形成一个none-overlay网络,其中Pod IP地址可以在更广泛的网络中路由,就像附加的任何其他工作负载一样到网络。

Overlay网络模式

Calico可以提供VXLAN或IP-in-IP网络,包括cross-subnet模式。

Non-overlay网络模式

Calico可以提供在任何基础L2网络之上运行的non-overlay网络,或者是具有适当的云提供商集成的公共云网络或支持BGP的L3网络(通常是具有标准Top-of-Rack路由器)。

Calico本地部署

Calico本地部署最常见的网络设置是non-overlay模式,该模式使用BGP与物理网络(通常是机架路由器的顶部)对等,以使Pod IP可在集群外部路由。(当然,可以根据需要配置其余的本地部署网络,以限制群集外的Pod IP路由的范围。)此设置提供了丰富的Calico高级功能,包括公告Kubernetes serviceIP的能力(cluster IPs or external IPs),以及在Pod,名称空间或节点级别控制IP地址管理的能力,以支持与现有企业网络和安全要求集成的各种可能性。

注:在这种模式下,物理路由器需要进行相应的配置,以便与 Calico 节点建立 BGP 对等关系。具体来说,物理路由器需要配置 BGP 对等体,指向 Calico 节点的 IP 地址,并设置相应的自治系统号(AS 号)。这样,物理路由器就可以接收来自 Calico 节点的 BGP 路由信息,并将这些路由信息传播到整个物理网络中

PolicyIPAMCNIOverlayRouting
CalicoCalicoCalicoNoBGP

如果不能将BGP对等连接到物理网络,并且群集在单个L2网络中,则还可以运行non-overlay模式,而Calico只能在群集中的节点之间对等BGP。即使这不是严格的overlay网络,也无法在集群外部路由Pod IP,因为基础网络没有Pod IP的路由。

PolicyIPAMCNIOverlayRouting
CalicoCalicoCalicoNoBGP

或者,可以在VXLAN或IP-in-IP模式下运行Calico,并使用cross-subnet模式来优化每个L2子网内的性能。

推荐方案:

PolicyIPAMCNIOverlayRouting
CalicoCalicoCalicoVXLANCalico

替代方案:

PolicyIPAMCNIOverlayRouting
CalicoCalicoCalicoIPIPBGP

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/18709.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python】函数

个人主页:Guiat 归属专栏:Python 文章目录 1. 函数的定义1.1 基本定义方式1.2 函数名和参数 2. 函数的调用2.1 基本调用方式2.2 参数传递 3. 函数的返回值3.1 return 语句3.2 返回多个值 4. 函数的作用域4.1 局部变量4.2 全局变量 5. 匿名函数&#xff0…

PbootCMS增加可允许上传文件类型,例如webp、mov等文件格式扩展

在PbootCMS日常使用过程中,会涉及一些非常见的文件格式上传。 这时候就需要在PbootCMS配置文件中追加一些允许上传文件扩展名。 操作步骤 1、打开/config/config.php文件,大约在30行,修改upload配置信息: // 上传配置upload &…

EasyRTC视频通话WebP2P技术:轻量化SDK助力嵌入式设备实时音视频通信

在智能硬件井喷式发展的当下,嵌入式设备对实时音视频通信的需求正从实验室走向千行百业。然而,当开发者尝试将传统RTC(实时通信)方案移植到MCU、边缘计算终端等资源受限设备时,往往会遭遇一道难以逾越的屏障——Flash存…

Vript-Hard——一个基于高分辨率和详细字幕的视频理解算法

一、概述 多模态学习的最新进展促进了对视频理解和生成模型的研究。随之而来的是,对高分辨率视频和详细说明所建立的高质量数据集的需求激增。然而,由于时间因素的影响,视频与文本的配对不像图像那样容易。准备视频和文本配对是一项困难得多…

如何调整 Nginx工作进程数以提升性能

🏡作者主页:点击! Nginx-从零开始的服务器之旅专栏:点击! 🐧Linux高级管理防护和群集专栏:点击! ⏰️创作时间:2025年2月15日14点20分 Nginx 的工作进程数&#xff0…

SolidWorks速成教程P3-6【零件 | 第六节】——草图封闭轮廓所选轮廓厚度为零的报错

到这里,我们已经将特征成型的常用功能学完。这节我来继续讲解一下 SolidWorks中建模的一些容易忽略的问题(草图封闭轮廓&所选轮廓&厚度为零的报错)。 目录 1.草图封闭轮廓 2.所选轮廓 3.厚度为零的报错 1.草图封闭轮廓 我们在拉伸凸台时,一般都会绘制封闭的草…

关于post和get的请求参数问题

今天在和泓宇交流的时候,谈到了关于postman测试接口的问题。我昨天在postman测试的时候,对于条件查询不知道怎么测试,脑子里很混乱。今天,泓宇借着条件查询这个机会给我讲了讲get和post的请求参数的知识,趁着现在有记忆…

UE5中的四元数

UE5中的四元数 绕任意轴旋转四元数与矩阵四元数与欧拉角将一个向量旋转到另一个向量插值Reference 我们知道,四元数是除了欧拉角,旋转矩阵之外,主要用来描述旋转的量。四元数直观的定义就是 q [ c o s ( θ 2 ) , s i n ( θ 2 ) N ] q [c…

AUTOSAR MCAL层ETH模块(1)——通信原理

基础了解 ETH,以太网,简单来讲就是将几台设备连接起来形成网络。这种连接是点到点之间的。以太网的传输速率为10M~10G,速度非常快。 为了实现网络通信的标准化,普及网络应用,国际标准化组织(ISO)将整个以太网通信结构制…

什么是网关?网关有什么作用?API网关的主要功能,SpringCloud可以选择有哪些API网关?什么是限流算法?网关如何实现限流?一篇文章读懂网关的前世今生

1、什么是网关? API网关(API Gateway)是一种中间层服务器,用于集中管理,保护和路由对后端服务的访问。它充当了客户端与后端服务之间的入口点,提供了一组统一的接口管理和控制API的访问。 2、网关示意图 3…

【技术产品】DS三剑客:DeepSeek、DataSophon、DolphineSchduler浅析

引言 在大数据与云原生技术快速发展的时代,开源技术成为推动行业进步的重要力量。本文将深入探讨三个备受瞩目的开源产品组件:DeepSeek、DataSophon 和 DolphinScheduler,分别从产品定义、功能、技术架构、应用场景、优劣势及社区活跃度等方面…

架构——Nginx功能、职责、原理、配置示例、应用场景

以下是关于 Nginx 的功能、职责、原理、配置示例、应用场景及其高性能原因的详细说明: 一、Nginx 的核心功能 1. 静态资源服务 功能:直接返回静态文件(如 HTML、CSS、JS、图片、视频等)。配置示例:server {listen 80…

spring 学习 (注解)

目录 前言 常用的注解 须知 1 Conponent注解 demo(案例) 2 ControllerServiceRepository demo(案例) 3 ScopeLazyPostConstructPreDestroy demo(案例) 4 ValueAutowiredQualifierResource demo(案例) 5 Co…

机器学习 - 机器学习模型的评价指标

为了衡量一个机器学习模型的好坏,需要给定一个测试集,用模型对测试集 中的每一个样本进行预测,并根据预测结果计算评价分数。本文,我们来了解一下机器学习模型常用的评价指标。 一、分类问题常用到的混淆矩阵 在分类任务中&…

openAI最新o1模型 推理能力上表现出色 准确性方面提升 API如何接入?

OpenAI o1模型在回答问题前会进行深入思考,并生成一条内部推理链,使其在尝试解决问题时可以识别并纠正错误,将复杂的步骤分解为更简单的部分,并在当前方法无效时尝试不同的途径。据悉,o1不仅数学水平与美国奥林匹克竞赛…

基于ArduPilot开发无人机飞控自动驾驶仪

目录 1、项目参数 2、硬件设计解析 2.1、主控与协处理器架构 2.2、高精度传感器集成 2.3、数据存储与恢复 2.4、电源管理与保护 2.5、通信与接口 本项目基于开源飞行控制固件 ArduPilot 开发,设计并实现了一款高度集成的 自动驾驶仪,可广泛应用于…

传输层协议TCP ( 下 )

文章目录 前言序号与确认序号超时重传RTOJacobson算法内核中超时时间的计算 滑动窗口滑动窗口延迟应答流量控制 拥塞控制慢启动拥塞避免快重传快速恢复 保活机制参考资料 前言 TCP(Transmission Control Protocol,传输控制协议)是互联网最重要…

vscode使用常见问题处理合集

目录 一、使用vite创建的vue3项目,script和style首行代码不会缩进,且格式化属性字段等会换行问题 首行缩进情况如下: 属性、参数格式化换行情况如下: 解决方式: 一、使用vite创建的vue3项目,script和style首行代码不…

【C语言】程序环境与预处理

目录 程序的翻译环境和执行环境 粗谈编译链接 翻译环境 编译的几个阶段及链接 运行环境 预处理详解 预定义符号 #define #define 定义标识符 #define 定义宏 #define 替换规则 #和## 带副作用的宏参数 宏和函数的对比 命名约定 #undef 命令行定义 条件编译 …

类与对象C++详解(中)-----构造函数与析构函数

1.构造函数 构造函数是一个特殊的成员函数,函数名和类名相同,构造函数的作用是初始化,以下是构造函数的一些特点: 1. 函数名与类名相同。 2. ⽆返回值。(返回值啥都不需要给,也不需要写void,不要纠结&#…