运行原理
Kube-router 可作为代理或 Pod(通过 DaemonSet)在每个节点上运行,并利用标准 Linux 技术iptables、ipvs/lvs、ipset、iproute2。
服务代理和负载平衡
博客: 使用 IPVS/LVS 的 Kubernetes 网络服务代理
Kube-router 使用 Linux 内置的 IPVS/LVS 技术提供 L4 负载平衡。每个ClusterIP、NodePort和LoadBalancer的Kubernetes服务类型都配置为 IPVS 虚拟服务。每个服务端点
配置为关联虚拟服务的真实服务器。标准的ipvsadm工具可用于验证配置和监控活动连接。
以下是 Kubernetes 上服务的示例集:
以及服务的端点:
以及它们如何通过 kube-router 映射到 IPVS:
Kube-router 会观察 Kubernetes API 服务器,以获取关于服务/端点的更新,并自动同步 IPVS 配置,以反映服务的预期状态。服务的理想状态。Kube-router 使用 IPVS 伪装模式,目前使用
轮循调度。保持源 pod IP,以便应用适当的网络策略。
Pod 入口防火墙
博客: 利用iptables执行Kubernetes网络策略
Kube-router 通过使用 iptables、ipset 和 conntrack 提供了 Kubernetes 网络策略的实现。命名空间中的所有使用DefaultDeny
入口隔离策略的Pod都会被禁止访问。只有匹配了白名单策略才允许到达这些 Pod。以下filter
表中的一组 iptables 规则和链用于实现网络策略语义。
节点上运行的每个 Pod 默认情况下入口都被阻止,这些 Pod 将在防火墙表的 FORWARD 和 OUTPUT 链中匹配,流量被发送给链上特定的 pod
添加以下规则以匹配各种情况
- 通过本地网桥在同一节点上的 Pod 之间切换的流量
- 在不同节点上的 Pod 之间路由的流量
- 来自 Pod 的流量,通过服务代理并被
路由到同一节点上的 其他Pod(前后端分离的应用或者访问数据库)
每个 Pod 专用防火墙链都有阻止流量的默认规则。添加规则到网络策略特定策略链,以跳转流量。规则仅涵盖适用于目标 pod ip 的策略。添加规则的目的是接受已建立的流量,以允许返回流量。
每个策略链都有通过源和目的 ipset 表达的规则。与网络策略规范中的入口规则相匹配的 Pod 集构成源 Pod ip ipset。与网络策略规范中 pod 选择器(针对目的地 Pod)相匹配的 Pod 集形成目的地 Pod ip ipset。
最后这些组成网络规则的 ipsets被创建以用于特定的网络策略链。
Kube-router 会实时关注 Kubernetes API 服务器中的名称空间、网络策略和 pod 的变化,并动态更新 iptables 和 ipset配置,以反映pod 所需的入口防火墙状态。
Pod 网络
博客: 使用 BGP 的 Kubernetes pod 网络连接及其他
每个节点都要运行Kube-router。节点的子网可从节点上的 CNI 配置文件或通过 Node.PodCidr 获取。每个节点上的 kube-router 实例都充当 BGP 路由器,并广播节点的CIDR 。每个节点都与群集中的其他节点对等形成完整网格。从其他节点(BGP对等体)学习到的路由注入本地节点路由表。在数据路径上,节点间Pod 之间的通信由节点上的路由堆栈完成。