Kubernetes中NetworkPolicy未对DaemonSet所属Pod生效问题咨询
Network Policy 对DaemonSet创建Pod的生效规则说明
首先明确:Network Policy的匹配逻辑只和Pod的标签、所在命名空间有关,和Pod由哪种上层工作负载(DaemonSet/Deployment/StatefulSet等)创建完全无关,你配置的默认全拒策略没有生效,通常是以下几个原因导致的:
- CNI插件不支持NetworkPolicy
不是所有K8s CNI插件都实现了NetworkPolicy能力,比如常用的Flannel默认就不支持网络策略,你需要使用Calico、Cilium、Weave Net这类原生支持NetworkPolicy的CNI插件,策略才会真正生效。 - 网络策略和DaemonSet Pod不在同一个命名空间
NetworkPolicy是命名空间级别的资源,你贴的配置中podSelector: {}只会匹配当前策略所在命名空间的所有Pod。如果你的DaemonSet部署在kube-system或其他自定义命名空间,而该策略只部署在了default命名空间,自然不会对DaemonSet的Pod生效。如果需要实现全集群默认拒流,需要在每一个命名空间下都部署该策略。
你贴的策略本身配置是正确的:apiVersion: networking.k8s.io/v1 kind: NetworkPolicy metadata: name: default-deny spec: podSelector: {} policyTypes: - Ingress - Egress - 存在其他放行策略覆盖了拒流规则
多个NetworkPolicy之间是取并集生效的,只要有任意一条策略匹配到目标Pod且放行对应方向的流量,默认拒流的规则就会被覆盖。你可以检查对应命名空间下是否有其他针对DaemonSet Pod标签放行的网络策略。 - Pod配置了跳过网络策略的特殊注解
部分CNI插件支持给Pod添加特殊注解(比如networking.k8s.io/network-policy: ignore)来跳过网络策略的管控,你可以检查DaemonSet的Pod模板是否配置了这类注解。
验证排查步骤
- 执行
kubectl get networkpolicies -n <DaemonSet所在命名空间>,确认该默认拒流策略确实部署在了DaemonSet Pod所属的命名空间 - 执行
kubectl describe networkpolicy default-deny -n <对应命名空间>,查看策略的事件字段是否有配置错误或加载失败的报错 - 进入DaemonSet Pod执行ping、curl等流量测试,同时查看CNI插件的运行日志,确认流量是否命中了对应的拒流规则。
内容的提问来源于stack exchange,提问作者Parvathy Mohan
相关产品推荐
相关产品推荐

