Kubernetes默认网络的零信任缺口
Kubernetes集群默认网络模型是全通的——任何Pod可以和任何其他Pod通信,这在多租户环境或生产集群中是不可接受的安全状态。NetworkPolicy是Kubernetes原生的网络分段机制,但默认iptables数据平面的性能瓶颈和规则复杂度限制了其在大规模集群中的应用。Calico的eBPF数据平面提供了更高性能的替代方案,将网络策略执行从内核netfilter移到eBPF程序,策略匹配延迟从微秒级降低到纳秒级。
NetworkPolicy零信任基准策略设计
零信任网络的第一步是默认拒绝所有流量,再按需放行。下面的策略实现集群级别的默认拒绝:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: default-deny-all
namespace: production
spec:
podSelector: {} # 匹配命名空间内所有Pod
policyTypes:
- Ingress
- Egress
此策略不定义任何ingress/egress规则,效果是拒绝所有入站和出站流量。在此基准上逐条添加放行规则:
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-api-to-db
namespace: production
spec:
podSelector:
matchLabels:
app: postgres
ingress:
- from:
- podSelector:
matchLabels:
app: api-server
ports:
- port: 5432
protocol: TCP
每个放行规则必须明确指定源Pod标签和目标端口,不做宽泛的CIDR放行。
Calico eBPF数据平面部署与切换
Calico从v3.21开始支持eBPF数据平面,v3.25后进入稳定状态。eBPF模式相比iptables模式在连接跟踪、NAT和策略执行上都有显著性能提升。
切换到eBPF数据平面:
# 在Calico Operator配置中启用eBPF
apiVersion: operator.tigera.io/v1
kind: Installation
metadata:
name: default
spec:
calicoNetwork:
datapathOptions:
vxlan: Enabled
linuxDataplane: BPF
bpfLogLevel: ""
registry: quay.io/
切换前需确认内核版本>=5.3,且启用了BTF(BPF Type Format)支持:
# 检查BTF支持
ls /sys/kernel/btf/vmlinux
# 检查内核版本
uname -r
Calico GlobalNetworkPolicy实现L7网络分段
标准NetworkPolicy仅支持L3/L4层规则。Calico的GlobalNetworkPolicy扩展到L7层,可以在策略中直接限制HTTP方法、路径和域名。这对零信任分段至关重要——仅允许访问数据库的3306端口不够,还要限制API只能执行SELECT而不能执行DROP。
apiVersion: projectcalico.org/v3
kind: GlobalNetworkPolicy
metadata:
name: restrict-api-egress
spec:
selector: app == "api-server"
egress:
- action: Allow
protocol: TCP
destination:
selector: app == "postgres"
ports: [5432]
- action: Pass
protocol: TCP
destination:
selector: app == "redis"
ports: [6379]
http:
methods: ["GET", "POST"]
paths:
exact: ["/api/v1/data", "/api/v1/query"]
Pass动作允许流量跳过当前策略继续匹配下一条,实现策略链的灵活组合。
eBPF网络策略的性能观测与故障排查
eBPF数据平面的一大优势是自带可观测性。Calico在eBPF程序中内置了连接跟踪和策略计数器,无需额外部署Flow Collector即可查看策略匹配情况:
# 查看eBPF连接跟踪表
calico-node -c "calico-bpf conntrack dump"
# 查看策略计数器
calico-node -c "calico-bpf policy count"
# 实时监控被拒绝的连接
calico-node -c "calico-bpf logs --reject"
被拒绝的连接在日志中以SRC->DST:PORT格式呈现,直接定位是哪条策略阻断了流量。如果发现合法流量被误拒,检查策略的选择器匹配范围是否过宽,以及策略的优先级顺序——Calico按策略创建顺序匹配,先匹配到的规则优先生效。
多集群零信任网络分段的最佳实践
多集群场景下,集群间流量默认不受NetworkPolicy约束(跨集群走外部负载均衡器或隧道)。需要在集群边界部署Submariner等跨集群网络方案,配合Calico的GlobalNetworkPolicy实现跨集群网络分段。关键原则:集群间流量必须经过mTLS认证;跨集群访问必须在两端集群都有对应的NetworkPolicy放行;出口集群的egress策略和入口集群的ingress策略必须对齐,否则会出现单向可达的异常状态。
原创文章,作者:小编,如若转载,请注明出处:https://www.yunthe.com/kubernetes-wang-luo-ce-lyue-yu-calicoebpf-shu-ju-ping-mian/