前情提要
为了极致性能我们换个防火墙吧。BPF from BSD firewalld ,把它移植到 Linux 中来!
BPF
- BPF program 将数据发送给 K8s service; 做负载均衡决策并将数据包发送给目的 pod 节点
- BPF program 程序将 DNAT 转换成 Pod 的IP
- Pod 看到客户端真正的 IP
- Pod 做出响应; BPF 反向 DNAT
- 如果网络准许,数据包直接返回。否则将通过 Ingress Node (ingress controller Pod 所在服务器)
iptables or ipvs
- kube-proxy DNAT + SNAT 用自己的 IP 替换源 IP ,用 Pod IP 替换掉目的 IP
- 数据包转发到目标 Pod
- Pod 将 Ingress Node 视为源,并作出响应
- 源 / 目的地址在 Ingress Node 替换为客户端地址(目的) ,服务地址(Ingress Node)
ipvs 对比 iptables 的优势:
- ipvs 基于散列表,复杂度 O(1),iptables 基于链表,复杂度 O(n)
- ipvs 支持多种负载均衡调度算法;iptables 只有由 statistic 模块的 DNAT 支持概率轮询,
Openvswitch
这是大家所遗忘的部分,当 IPv6 全面铺开的时候,每一个 pod 可能都会有一个 IPv6 的地址,未来可期。