🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] # 封装 当未提供配置时,Cilium 会自动在此模式下运行,因为它是对底层网络基础设施要求最低的模式。 在此模式下,所有集群节点使用基于 UDP 的封装协议 VXLAN 或 Geneve 形成隧道网格。 Cilium 节点之间的所有流量都被封装。 ## 对网络的要求 - 封装依赖于正常的节点到节点连接。 这意味着如果 Cilium 节点已经可以相互到达,则所有路由要求都已满足。 - 底层网络和防火墙必须允许封装数据包: | 封装方式 | 端口范围/协议 | | :-: | :-: | | VXLAN (Default) | 8472/UDP | | Geneve | 6081/UDP | ## 该模型的优点 - 简单 连接集群节点的网络不需要了解 PodCIDR。 集群节点可以产生多个路由或链路层域。 只要集群节点可以使用 IP/UDP 相互访问,底层网络的拓扑结构就无关紧要。 - 寻址空间 由于不依赖于任何底层网络限制,可用的寻址空间可能会更大,并且如果相应配置了 PodCIDR 大小,则允许每个节点运行任意数量的 pod。 - 自动配置 当与 Kubernetes 等编排系统一起运行时,集群中所有节点的列表(包括其关联的分配前缀节点)将自动可供每个代理使用。 加入集群的新节点将自动合并到网格中。 - 身份上下文 封装协议允许随网络数据包一起携带元数据。 Cilium 利用此功能来传输元数据,例如源安全身份。 身份传输是一种优化,旨在避免在远程节点上进行一次身份查找。 ## 该模型的缺点 - MTU 开销 由于添加了封装标头,有效负载可用的有效 MTU 低于本机路由(VXLAN 每个网络数据包 50 字节)。 这会导致特定网络连接的最大吞吐量降低。 通过启用巨型帧(每 1500 字节 50 字节的开销 vs 每 9000 字节 50 字节的开销)可以在很大程度上缓解这一问题。 # 主机路由 本地路由数据路径使用 `tunnel: disabled` 启用并启用本机数据包转发模式。本地数据包转发模式利用 Cilium 运行的网络的路由功能,而不是执行封装。网络性能基本与主机相差不远。 ![](https://docs.cilium.io/en/stable/_images/native_routing.png) 在本机路由模式下,Cilium 会将所有未发送至另一个本地端点的数据包委托给 Linux 内核的路由子系统。 这意味着数据包将被路由,就像本地进程发出数据包一样。 因此,连接集群节点的网络必须能够路由 PodCIDR。 配置本机路由时,Cilium 会自动在 Linux 内核中启用 IP 转发。 ## 对网络的要求 - 为了运行本机路由模式,连接运行 Cilium 的主机的网络必须能够使用为 Pod 或其他工作负载提供的地址转发 IP 流量。 - 节点上的 Linux 内核必须知道如何转发运行 Cilium 的所有节点的 pod 数据包或其他工作负载。 这可以通过两种方式实现: 1. 节点本身不知道如何路由所有 pod IP,但网络上存在一个知道如何到达所有其他 pod 的路由器。在这种情况下,Linux 节点配置为包含指向此类路由器的默认路由。该模型用于云提供商网络集成。 2. 每个单独的节点都知道所有其他节点的所有 Pod IP,并且路由被插入到 Linux 内核路由表中来表示这一点。如果所有节点共享一个 L2 网络,则可以通过启用 `auto-direct-node-routes: true` 选项来解决此问题。否则,必须运行额外的系统组件(例如 BGP 守护程序)来分发路由。请参阅 使用 kube-router 运行 BGP 指南,了解如何使用 kube-router 项目实现此目的。 >[info] 测试主机是否为二层网络可达: > 1. 当在执行ping主机时,两台主机是否都有学习到对方mac地址 `arp -a` > 2. 使用 `arping` 命令探测 ## 配置 必须设置以下配置选项以在本地路由模式下运行数据路径: - tunnel: disabled:启用本机路由模式。 - ipv4-native-routing-cidr: x.x.x.x/y:设置可以执行本机路由的 CIDR。 # 确认当前模式 ```shell # 查看网络route模式 crictl logs `crictl ps --name cilium-agent -q` 2>&1 | egrep "native-routing|tunnel|auto-direct" ``` # 修改路由模式 从封装改成主机路由模式 ```shell # 获取当前版本号 cilium_version=$(helm -n kube-system ls | awk '/cilium/ {print $NF}') echo $cilium_version # 备份上一次安装的参数 helm -n kube-system get values cilium > cilium_custom.yaml sed -i '1d' cilium_custom.yaml # 添加参数 cat <<EOF | tee -a cilium_custom.yaml >> /dev/null # 禁止设置隧道 tunnel: disabled # 设置可执行本地路由的CIDR ipv4NativeRoutingCIDR: 10.0.0.0/16 # 所有k8s节点在二层网络,则使用该参数。 autoDirectNodeRoutes: true EOF # 修改参数 helm -n kube-system upgrade cilium cilium/cilium --version $cilium_version -f cilium_custom.yaml # 重启cilium kubectl -n kube-system rollout restart daemonset cilium kubectl -n kube-system rollout status daemonset cilium # 验证 crictl logs `crictl ps --name cilium-agent -q` 2>&1 | egrep "native-routing|tunnel|auto-direct" ```