Kubernetes 中 Cilium 网络架构详解与流量处理流程

Overview

1. Cilium 和 Cilium-Operator 的网络架构

在 Kubernetes 集群中,我们使用 Cilium 作为网络插件,基于 eBPF 提供高效的网络功能,如流量控制、负载均衡、网络安全策略等。同时,Cilium-Operator 负责管理集群范围的 Cilium 操作,包括 IP 地址管理、服务发现、BGP 宣告和配置同步等。

2. IP 分配与 Cilium-Host 的作用

2.1 Cilium 如何分配 IP 地址

  1. Pod 创建时的 IP 分配:当 Kubernetes 中创建一个新的 Pod 时,Cilium 的 CNI 插件 负责为该 Pod 分配 IP 地址。这与 Kubernetes Controller Manager 协同完成。在我们公司的场景中,Cilium 使用的是公司内部的物理 IP 地址,这些地址是从公司内部的一个专门的 IP 地址池中分配的,以确保 Pod 在公司内部的网络中能够被识别和访问。

  2. 通过 Cilium CNI 插件将 IP 分配到 Pod:Cilium 作为 Kubernetes 的 CNI 插件,负责为新创建的 Pod 分配 IP 地址,并将该 IP 绑定到 Pod 的虚拟网络接口(veth)。Cilium 通过 CNI 接口向 Kubernetes 报告这些信息,确保 Kubernetes 的网络配置与 Cilium 的 eBPF 配置一致。

  3. Cilium eBPF 的配置分配 IP 地址后,Cilium 使用 eBPF 在内核中创建高效的路由规则,确保 Pod 可以与其他节点或外部网络通信。eBPF 程序还可以用来监控和过滤数据流,提供安全和网络策略支持。

2.2 Cilium-Host 的角色

  1. Pod 内部的网络接口:每个 Pod 通过一个虚拟网络接口(veth)连接到 Cilium-host(宿主节点的虚拟网络设备)。Cilium-host 负责 Pod 的网络流量出入,并作为与外部网络的网关。Pod 发出的数据首先经过 Cilium-host,然后再根据路由规则通过物理网络传输到目标位置。

  2. 物理网络通信:Cilium-host 通过物理节点的网络接口将流量发送到外部网络或其他节点上的 Pod。Cilium 使用 eBPF 程序处理这个过程中所有的路由和安全规则,确保数据包能快速高效地传输。

3. Cilium-Operator 的作用

  1. 监控和控制 Cilium 行为Cilium-Operator 负责监控 Cilium 的状态,并执行一些集群级别的配置和管理任务。它处理如 IPAM(IP 地址管理)功能和集群状态同步。它不会直接参与每个 Pod 的 IP 分配,但会通过 IPAM 管理整个集群中 IP 地址的动态分配情况。控制的还是cilium的状态!

  2. BGP 宣告与外部网络通信:Cilium-Operator 还管理 BGP 配置,负责将 Kubernetes 集群中的 Pod IP 宣告给外部网络(如物理交换机)。通过 BGP 宣告,外部网络设备能够知道如何路由到集群中的 Pod。(其实是cilium-bird的作用)

4. 数据包的传输路径

4.1 数据包从 Pod 发出

  1. Pod 内部数据流出:当 Pod 内的应用需要访问外部服务或其他 Pod 时,数据通过虚拟网络接口(veth)传递到 Cilium-host。
  2. eBPF 路由和策略检查:Cilium-host 使用 eBPF 技术处理该数据包,执行流量控制、安全策略检查,并确定数据的转发路径。
  3. 通过物理网络传输:经过处理的数据包通过物理网络设备(如交换机或路由器)传输到目标节点或外部网络。

4.2 数据包从外部到达 Pod

  1. 外部服务发起请求:外部服务或设备发起的请求首先通过物理网络路由到 Kubernetes 集群的物理节点。
  2. BGP 宣告与路由选择:BGP 协议帮助外部设备找到集群内目标 Pod 的 IP 地址。通过 Cilium-host,数据包会被路由到目标 Pod。
  3. Cilium-host 传递数据包:Cilium-host 使用 eBPF 程序对进入的数据包进行策略检查,然后将数据通过虚拟接口(veth)传递给目标 Pod。

5. 收包发包的完整路径

发包(Pod 向外部发送数据的流程)

  1. Pod 发起请求:Pod 内的应用发起网络请求。
  2. 流量经过 Cilium-host:请求通过虚拟接口(veth)传递到 Cilium-host,并由 Cilium 的 eBPF 程序处理。
  3. 数据包进入物理网络:经过处理后,数据包通过物理网络设备(交换机、路由器)传输到目标位置。

收包(外部向 Pod 发送数据的流程)

  1. 外部服务发起请求:外部网络向 Pod 的 IP 地址发起请求。
  2. 通过物理网络路由:请求根据 BGP 宣告的路由信息传递到集群内的 Cilium-host。
  3. 流量通过 Cilium-host 进入 Pod:Cilium-host 使用 eBPF 程序对数据包进行检查,随后将数据通过虚拟接口传递到目标 Pod。

总结

  1. IP 分配:Cilium 的 CNI 插件负责为每个新创建的 Pod 分配 IP 地址,并通过虚拟接口将 IP 绑定到 Pod。
  2. Cilium-Operator 的作用:Cilium-Operator 负责监控 Cilium 的状态并管理集群范围的 IP 地址和 BGP 配置,不直接参与 IP 分配。
  3. 数据包处理流程:通过 Cilium 的 eBPF 程序进行高效的路由和策略执行,确保 Pod 间和外部网络间的通信顺畅。